Commit c0e6d973 by aa.gusti

odoo init

1 parent ee8de6ab
...@@ -54,8 +54,7 @@ def run_migrations_online(): ...@@ -54,8 +54,7 @@ def run_migrations_online():
connection=connection, connection=connection,
target_metadata=target_metadata, target_metadata=target_metadata,
helpers=helpers, helpers=helpers,
version_table='alembic_pbb_pelayanan', version_table='alembic',
version_table_schema='pbb'
) )
try: try:
with context.begin_transaction(): with context.begin_transaction():
......
...@@ -368,6 +368,14 @@ class Holiday(Base, DefaultModel): ...@@ -368,6 +368,14 @@ class Holiday(Base, DefaultModel):
return db_session.query(cls).filter_by(tanggal=tanggal) return db_session.query(cls).filter_by(tanggal=tanggal)
class UserDeviceModel(Base, KodeModel):
__tablename__ = 'user_device'
user_id=Column(Integer, ForeignKey(User.id))
kode = Column(String(256))
token = Column(String(256))
logged_in = Column(Integer)
las_login_date = Column(DateTime)
# from .ws_user import WsUser # from .ws_user import WsUser
from .targets import Targets from .targets import Targets
from .departemen import Departemen, DepartemenUser from .departemen import Departemen, DepartemenUser
...@@ -375,6 +383,7 @@ from .partner import Partner ...@@ -375,6 +383,7 @@ from .partner import Partner
from .pegawai import Jabatan, Eselon, PartnerLogin, PartnerDepartemen from .pegawai import Jabatan, Eselon, PartnerLogin, PartnerDepartemen
def init_model(): def init_model():
ziggurat_model_init(User, Group, UserGroup, GroupPermission, UserPermission, ziggurat_model_init(User, Group, UserGroup, GroupPermission, UserPermission,
UserResourcePermission, GroupResourcePermission, Resource, UserResourcePermission, GroupResourcePermission, Resource,
......
...@@ -12,7 +12,7 @@ from sqlalchemy.orm import ( ...@@ -12,7 +12,7 @@ from sqlalchemy.orm import (
backref backref
) )
from ..models import (Base, TABLE_ARGS) from ..models import (Base, TABLE_ARGS, KodeModel, DefaultModel)
from ..models import (NamaModel, User, Departemen) from ..models import (NamaModel, User, Departemen)
...@@ -83,3 +83,9 @@ class Partner(Base, PartnerModel): ...@@ -83,3 +83,9 @@ class Partner(Base, PartnerModel):
if not row: if not row:
row = cls.query().filter_by(mobile=ident).first() row = cls.query().filter_by(mobile=ident).first()
return row return row
class PartnerUserModel(Base, DefaultModel):
__tablename__ = 'partner_user'
partner_id = Column(Integer, ForeignKey(Partner.id))
user_id = Column(Integer, ForeignKey(User.id))
from sqlalchemy import (
Column,
Integer,
ForeignKey,
String
)
from . import Partner
from ..models import (Base, DefaultModel)
class PartnerOdooModel(Base, DefaultModel):
__tablename__ = 'partner_odoo'
partner_id = Column(Integer, ForeignKey(Partner.id))
url = Column(String(254))
db = Column(String(254))
api_key = Column(String(256))
...@@ -2,4 +2,6 @@ group_name,description ...@@ -2,4 +2,6 @@ group_name,description
"Superuser","Superuser" "Superuser","Superuser"
"Web Service","Webservice" "Web Service","Webservice"
"Pindah Departemen","Pindah Departemen" "Pindah Departemen","Pindah Departemen"
"Guest","Guest"
\ No newline at end of file \ No newline at end of file
"Guest","Guest"
"shop_admin","Shop Admin"
"shop_kasir","Shop Kasir"
...@@ -130,4 +130,6 @@ partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report ...@@ -130,4 +130,6 @@ partner-departemen-rpt,/partner/departemen/{rpt}/rpt,Partner Departemen Report
log,/log,Log Aplikasi log,/log,Log Aplikasi
log-act,/log/{act}/act,Log Aplikasi Act log-act,/log/{act}/act,Log Aplikasi Act
log-view,/log/{id}/view,Log Aplikasi View
\ No newline at end of file \ No newline at end of file
log-view,/log/{id}/view,Log Aplikasi View
shop-api,/shop/api,API Shopping,,1
\ No newline at end of file \ No newline at end of file
...@@ -12,15 +12,11 @@ from pyramid.paster import (get_appsettings, setup_logging, ) ...@@ -12,15 +12,11 @@ from pyramid.paster import (get_appsettings, setup_logging, )
from ..models.handlers import LogDBSession from ..models.handlers import LogDBSession
from ..models import (init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, User, Route, Eselon, from ..models import (init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, User, Route, Eselon,
Jabatan) Jabatan)
from ..models.partner_odoo import *
from sqlalchemy.dialects import oracle from sqlalchemy.dialects import oracle
from sqlalchemy import text from sqlalchemy import text
# , mssql
# from .tools import mkdir
def usage(argv): def usage(argv):
cmd = os.path.basename(argv[0]) cmd = os.path.basename(argv[0])
print('usage: %s <config_uri>\n' print('usage: %s <config_uri>\n'
......
...@@ -4,11 +4,14 @@ from opensipkd.tools import ( ...@@ -4,11 +4,14 @@ from opensipkd.tools import (
get_random_number, devel, get_random_string, get_settings) get_random_number, devel, get_random_string, get_settings)
from opensipkd.tools.api import * from opensipkd.tools.api import *
from .. import log from .. import log
from ..models import (DBSession, User, GroupPermission) from ..models import (DBSession, User, GroupPermission, UserDeviceModel)
lima_menit = 300 lima_menit = 300
def auth_from_rpc(request): def auth_from_rpc(request):
return auth_from(request) return auth_from(request)
def auth_from(request, field=None): def auth_from(request, field=None):
global lima_menit global lima_menit
...@@ -28,7 +31,44 @@ def auth_from(request, field=None): ...@@ -28,7 +31,44 @@ def auth_from(request, field=None):
# bypass cek authentication for development # bypass cek authentication for development
if http_userid == 'admin' and request.devel: if http_userid == 'admin' and request.devel:
return user return user
time_stamp = validate_time(request)
if field:
header = json_rpc_header(http_userid, user.security_code, time_stamp)
else:
header = json_rpc_header(http_userid, user.api_key, time_stamp)
if header['signature'] != env['HTTP_SIGNATURE']:
raise JsonRpcInvalidLoginError
return user
def auth_from_token(request):
return auth_from(request, "security_code")
def renew_token(user_device):
user_device.token = get_random_string(32)
DBSession.add(user_device)
DBSession.flush()
return user_device
def get_user_device(request, user):
user_device = UserDeviceModel.query() \
.filter_by(user_id=user.id,
kode=request.headers.environ["HTTP_USER_AGENT"]).first()
if not user_device:
user_device = UserDeviceModel()
user_device.user_id = user.id
user_device.kode = request.headers.environ["HTTP_USER_AGENT"]
user_device.token = get_random_string(32)
DBSession.add(user_device)
DBSession.flush()
return user_device
def validate_time(request):
global lima_menit
env = request.environ
time_stamp = int(env['HTTP_KEY']) time_stamp = int(env['HTTP_KEY'])
now = get_seconds() now = get_seconds()
settings = get_settings() settings = get_settings()
...@@ -36,20 +76,37 @@ def auth_from(request, field=None): ...@@ -36,20 +76,37 @@ def auth_from(request, field=None):
lima_menit = int(settings["diff_server_time"]) lima_menit = int(settings["diff_server_time"])
if not request.devel and abs(now - time_stamp) > lima_menit: if not request.devel and abs(now - time_stamp) > lima_menit:
log.info(f"req time {time_stamp} server time {now}")
raise JsonRpcInvalidTimeError raise JsonRpcInvalidTimeError
if field:
header = json_rpc_header(http_userid, user.security_code, time_stamp)
else:
header = json_rpc_header(http_userid, user.api_key, time_stamp)
if header['signature'] != env['HTTP_SIGNATURE']: return time_stamp
def auth_device(request):
env = request.environ
log.info(env)
if not ('HTTP_USERID' in env and 'HTTP_SIGNATURE' in env and
'HTTP_KEY' in env):
raise JsonRpcInvalidLoginError raise JsonRpcInvalidLoginError
return user http_userid = env['HTTP_USERID']
q = DBSession.query(User).filter_by(user_name=http_userid)
user = q.first()
if not user or user.status == 0:
raise JsonRpcInvalidLoginError
def auth_from_token(request): if http_userid == 'admin' and request.devel:
return auth_from(request, "security_code") return user
user_device = get_user_device(request, user)
time_stamp = validate_time(request)
header = json_rpc_header(http_userid, user_device.token, time_stamp)
if header['signature'] != env['HTTP_SIGNATURE']:
log.info(f"{http_userid}, {user_device.token}, {time_stamp}")
log.info(f"{header['signature']} != {env['HTTP_SIGNATURE']}")
raise JsonRpcInvalidLoginError
return user
def get_jsonrpc(method, params): def get_jsonrpc(method, params):
......
...@@ -64,7 +64,7 @@ def view_login(request): ...@@ -64,7 +64,7 @@ def view_login(request):
next_url = request.params.get('next', request.referrer) next_url = request.params.get('next', request.referrer)
login_tpl = get_params('login_tpl', 'templates/login.pt') login_tpl = get_params('login_tpl', 'templates/login.pt')
if not next_url: if not next_url:
next_url = request.route_url('home') # get_params('_host')+ next_url = request.route_url('home') # get_params('_host')+
if request.authenticated_userid: # (request): if request.authenticated_userid: # (request):
request.session.flash('Anda sudah login', 'error') request.session.flash('Anda sudah login', 'error')
...@@ -104,11 +104,23 @@ def view_login(request): ...@@ -104,11 +104,23 @@ def view_login(request):
return HTTPFound(location=request.route_url('login')) return HTTPFound(location=request.route_url('login'))
else: else:
if not user.status:
msg = f"Anda belum melakukan verifikasi User\nSilahkan buka e-mail {user.email}"
set_user_log(msg, request, log, identity)
request.session.flash(msg, "error")
return render_to_response(login_tpl,
dict(form=form.render(),
message=msg,
url=request.route_url('login'),
next_url=next_url,
login="", ),
request=request)
if not user or not UserService.check_password(user, values['password']): if not user or not UserService.check_password(user, values['password']):
msg = "Login Gagal" msg = "Login Gagal"
set_user_log(msg, request, log, identity) set_user_log(msg, request, log, identity)
request.session.flash(msg, "error") request.session.flash(msg, "error")
next_url=f"{request.route_url('login')}?next={next_url}" next_url = f"{request.route_url('login')}?next={next_url}"
return HTTPFound(location=next_url) return HTTPFound(location=next_url)
return redirect_login(request, user) return redirect_login(request, user)
...@@ -145,14 +157,14 @@ def view_login(request): ...@@ -145,14 +157,14 @@ def view_login(request):
if user: if user:
return redirect_login(request, user) return redirect_login(request, user)
message="" message = ""
login="" login = ""
return render_to_response(login_tpl, return render_to_response(login_tpl,
dict(form=form.render(), dict(form=form.render(),
message=message, message=message,
url=request.route_url('login'), url=request.route_url('login'),
next_url=next_url, next_url=next_url,
login=login,), login=login, ),
request=request) request=request)
# return dict( # return dict(
...@@ -167,7 +179,7 @@ def redirect_login(request, user): ...@@ -167,7 +179,7 @@ def redirect_login(request, user):
if not next_url and request.matched_route.name == 'login': if not next_url and request.matched_route.name == 'login':
url = get_params('modules_default', 'home') url = get_params('modules_default', 'home')
return HTTPFound(location=request.route_url(url), return HTTPFound(location=request.route_url(url),
headers=headers) headers=headers)
return HTTPFound(location=next_url, headers=headers) return HTTPFound(location=next_url, headers=headers)
...@@ -291,7 +303,7 @@ def security_code_age(user): ...@@ -291,7 +303,7 @@ def security_code_age(user):
def send_email_security_code( def send_email_security_code(
request, user, time_remain, subject, body_msg_id, body_default_file): request, user, time_remain, subject, body_msg_id, body_default_file):
settings = get_settings() settings = get_settings()
if 'mail.sender_name' not in settings \ if 'mail.sender_name' not in settings \
or 'mail.username' not in settings: or 'mail.username' not in settings:
......
...@@ -6,7 +6,7 @@ import transaction ...@@ -6,7 +6,7 @@ import transaction
################## ##################
# RPC USER # RPC USER
################## ##################
from pyramid_rpc.jsonrpc import jsonrpc_method from pyramid_rpc.jsonrpc import jsonrpc_method, JsonRpcError
from opensipkd.tools.api import ( from opensipkd.tools.api import (
JsonRpcInvalidLoginError, JsonRpcInvalidNikError, JsonRpcInvalidMobileError, JsonRpcInvalidLoginError, JsonRpcInvalidNikError, JsonRpcInvalidMobileError,
...@@ -105,17 +105,17 @@ def validasi_data(dat): ...@@ -105,17 +105,17 @@ def validasi_data(dat):
if 'nik' in dat: if 'nik' in dat:
nik = re.sub('\D', '', dat['nik']) nik = re.sub('\D', '', dat['nik'])
if len(nik) != 16: if len(nik) != 16:
log.info("Validasi NIK Error") log.info("Validasi NIK Error Harus 16 digit")
raise JsonRpcInvalidNikError raise JsonRpcInvalidNikError
mobile = re.sub('\D', '', dat['mobile']) mobile = re.sub('\D', '', dat['mobile'])
if len(mobile) < 9: if len(mobile) < 9:
log.info("Validasi Mobile Error") log.info(f"Validasi Mobile {mobile} Minimal 9 digit")
raise JsonRpcInvalidMobileError raise JsonRpcInvalidMobileError
email = dat['email'] email = dat['email']
if not validasi_email(email): if not validasi_email(email):
log.info("Validasi Email") log.info(f"Validasi Email Error {email}")
raise JsonRpcInvalidEmailError raise JsonRpcInvalidEmailError
dat['nik'] = nik and nik or mobile dat['nik'] = nik and nik or mobile
...@@ -140,15 +140,18 @@ def register_user_(data, user, groups=None): ...@@ -140,15 +140,18 @@ def register_user_(data, user, groups=None):
validasi_user(data) validasi_user(data)
data['status'] = 1 data['status'] = 1
row = save_user(data, user=user) row = save_user(data, user=user)
data["id"]=row.id
if not row: if not row:
raise JsonRpcRegisterFailError raise JsonRpcRegisterFailError
# proses ke tabel partner
kode = 'nik' in data and data['nik'] or "" kode = 'nik' in data and data['nik'] or ""
if not kode: if not kode:
kode = 'kode' in data and data['kode'] or "" kode = 'kode' in data and data['kode'] or ""
if not kode: if not kode:
kode = 'mobile' in data and data['mobile'] or ""
if not kode:
kode = 'email' in data and data['email'] or "" kode = 'email' in data and data['email'] or ""
data['kode'] = kode data['kode'] = kode
...@@ -161,27 +164,24 @@ def register_user_(data, user, groups=None): ...@@ -161,27 +164,24 @@ def register_user_(data, user, groups=None):
transaction.abort() transaction.abort()
raise JsonRpcRegisterFailError raise JsonRpcRegisterFailError
##Untuk SIMKEL##
settings = get_settings()
default_group = get_params("default_group") default_group = get_params("default_group")
if default_group: groups = default_group and default_group or groups
groups = settings['default_group'].split(',') # for group in groups:
for group in groups: # group_data = Group.query_group_name(group).first()
group_data = Group.query_group_name(group).first() # if not group_data:
if not group_data: # raise custom_error(-1, "Group Not Found.")
raise custom_error(-1, "Group Not Found.") # data['group_id'] = group_data.id
data['group_id'] = group_data.id # data['user_id'] = row.id
data['user_id'] = row.id # save_groups(data, None)
save_groups(data, None) # if not groups:
if not groups: # raise Exception("Groups Kosong")
raise Exception("Groups Kosong")
ret_groups = [] ret_groups = []
if groups: if groups:
for group in groups.split(','): for group in groups.split(','):
group_data = Group.query_group_name(group).first() group_data = Group.query_group_name(group).first()
if not group_data: if not group_data:
print(group) raise JsonRpcError(message="Groups Data Kosong")
raise Exception("Groups Data Kosong")
if group_data: if group_data:
data['group_id'] = group_data.id data['group_id'] = group_data.id
...@@ -205,10 +205,10 @@ def register_user(request, data, groups=''): ...@@ -205,10 +205,10 @@ def register_user(request, data, groups=''):
# parameter user_name, password, email, nama, mobile, nik # parameter user_name, password, email, nama, mobile, nik
user = auth_from_rpc(request) user = auth_from_rpc(request)
result = register_user_(data, user, groups) result = register_user_(data, user, groups)
return dict(message="Sukses Register User", data=result) return dict(message="Sukses Register User", data=result)
# 3 , permission='web-service'
def login_(request, data): def login_(request, data):
is_list = type(data) is list is_list = type(data) is list
data = is_list and data[0] or data data = is_list and data[0] or data
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!