Commit 2d066240 by aagusti

Perbaikan BaseView

1 parent 1f158947
Showing 62 changed files with 446 additions and 302 deletions
...@@ -28,7 +28,7 @@ from .security import ( ...@@ -28,7 +28,7 @@ from .security import (
group_finder, group_finder,
get_user, MySecurityPolicy, get_user, MySecurityPolicy,
) )
from .models import ( from opensipkd.models import (
DBSession, DBSession,
Base, Base,
init_model, init_model,
...@@ -50,7 +50,7 @@ from pkg_resources import resource_filename ...@@ -50,7 +50,7 @@ from pkg_resources import resource_filename
import os import os
from .models.handlers import LogDBSession from opensipkd.models.handlers import LogDBSession
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -350,7 +350,7 @@ def set_routes(config, app_id=None): ...@@ -350,7 +350,7 @@ def set_routes(config, app_id=None):
config.add_jsonrpc_endpoint(route.kode, route.path, config.add_jsonrpc_endpoint(route.kode, route.path,
default_renderer="json_rpc") default_renderer="json_rpc")
partner_idcard_folder = 'partner/idcard'
def main(global_config, **settings): def main(global_config, **settings):
""" This function returns a Pyramid WSGI application. """ This function returns a Pyramid WSGI application.
""" """
...@@ -370,9 +370,9 @@ def main(global_config, **settings): ...@@ -370,9 +370,9 @@ def main(global_config, **settings):
settings['timezone'] = DefaultTimeZone settings['timezone'] = DefaultTimeZone
config = Configurator(settings=settings, config = Configurator(settings=settings,
root_factory='opensipkd.base.models.RootFactory', root_factory='opensipkd.models.RootFactory',
session_factory=session_factory) session_factory=session_factory)
from .models import RootFactory from opensipkd.models import RootFactory
modules = get_modules(settings) modules = get_modules(settings)
from importlib import import_module from importlib import import_module
for module in modules: for module in modules:
...@@ -409,6 +409,9 @@ def main(global_config, **settings): ...@@ -409,6 +409,9 @@ def main(global_config, **settings):
config.add_request_method(disable_responsive, 'disable_responsive', reify=True) config.add_request_method(disable_responsive, 'disable_responsive', reify=True)
config.add_request_method(get_params, 'get_params', reify=True) config.add_request_method(get_params, 'get_params', reify=True)
config.add_static_view('static', 'opensipkd.base:static', cache_max_age=3600) config.add_static_view('static', 'opensipkd.base:static', cache_max_age=3600)
config.add_static_view(partner_idcard_folder,
get_params("partner_idcard_folder", '/tmp/idcard'),
cache_max_age=3600)
config.add_static_view('deform_static', 'deform:static') config.add_static_view('deform_static', 'deform:static')
captcha_files = get_params('captcha_files', settings=settings, alternate="/tmp/captcha") captcha_files = get_params('captcha_files', settings=settings, alternate="/tmp/captcha")
......
...@@ -7,7 +7,7 @@ from pyramid.paster import ( ...@@ -7,7 +7,7 @@ from pyramid.paster import (
setup_logging, setup_logging,
) )
from sqlalchemy import engine_from_config from sqlalchemy import engine_from_config
from opensipkd.base.models.meta import Base from opensipkd.models.meta import Base
config = context.config config = context.config
......
"""tambah idcard
Revision ID: 91f07d138fe9
Revises: 8e7057155823
Create Date: 2022-07-11 18:29:13.867835
"""
# revision identifiers, used by Alembic.
revision = '91f07d138fe9'
down_revision = '8e7057155823'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
context = op.get_context()
helpers = context.opts['helpers']
if not helpers.table_has_column('partner', 'idcard'):
op.add_column('partner',
sa.Column('idcard', sa.String(256)))
def downgrade():
pass
...@@ -2,7 +2,7 @@ import logging ...@@ -2,7 +2,7 @@ import logging
import traceback import traceback
from datetime import datetime from datetime import datetime
from hashlib import md5 from hashlib import md5
from opensipkd.base.models.handlers import ( from opensipkd.models.handlers import (
Log, Log,
LogDBSession, LogDBSession,
) )
......
from sqlalchemy import event log = __import__("logging").getLogger(__name__)
log.warning('Use opensipkd.models')
from .base import * from opensipkd.models import *
from .common import *
from .users import *
from .wilayah import *
from .partner import *
from .departemen import *
from .pegawai import *
# from .meta import *
# from .targets import *
# from .wilayah import *
def has_permission(action):
pass
@event.listens_for(User, 'before_delete', has_permission('delete'))
def receive_before_delete(mapper, connection, target):
"listen for the 'before_delete' event"
# ... (event handling logic) ...
pass
ALL_TABLES = {}
for sub_class in Base.__subclasses__():
if hasattr(sub_class, "__tablename__"):
tablename = sub_class.__tablename__
if tablename not in ALL_TABLES:
ALL_TABLES.update({tablename: sub_class})
def query_table(table_name, fields=None, domain=None):
cls = ALL_TABLES[table_name]
if fields:
query = DBSession.query().select_from(cls)
# for field in fields:
query = query.add_columns(*[getattr(cls, c) for c in fields])
else:
query = DBSession.query(cls)
if domain:
filter_expressions = []
for d in domain:
field = getattr(cls, d[0])
operator = d[1]
value = d[2]
filter_expressions.append(field.op(operator)(value))
query = query.filter(
*[
e for i, e in enumerate(filter_expressions)
if e is not None]
)
return query
...@@ -6,7 +6,7 @@ from pyramid.paster import ( ...@@ -6,7 +6,7 @@ from pyramid.paster import (
get_appsettings, get_appsettings,
setup_logging, setup_logging,
) )
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
Route, Route,
) )
......
...@@ -7,7 +7,7 @@ from sqlalchemy import ( ...@@ -7,7 +7,7 @@ from sqlalchemy import (
) )
from sqlalchemy.schema import PrimaryKeyConstraint from sqlalchemy.schema import PrimaryKeyConstraint
from sqlalchemy.sql.expression import text from sqlalchemy.sql.expression import text
from ..models import ( from opensipkd.models import (
Base, Base,
BaseModel, BaseModel,
CommonModel, CommonModel,
......
...@@ -13,7 +13,7 @@ from sqlalchemy import ( ...@@ -13,7 +13,7 @@ from sqlalchemy import (
exc, exc,
) )
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from ..models.handlers import ( from opensipkd.models.handlers import (
Log, Log,
LogDBSession, LogDBSession,
) )
......
...@@ -11,8 +11,8 @@ from sqlalchemy.schema import CreateSchema ...@@ -11,8 +11,8 @@ from sqlalchemy.schema import CreateSchema
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
from pyramid.paster import (get_appsettings, setup_logging, ) from pyramid.paster import (get_appsettings, setup_logging, )
from ..models.handlers import LogDBSession from opensipkd.models.handlers import LogDBSession
from ..models import ( from opensipkd.models import (
init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission,
User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa) User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa)
......
...@@ -4,7 +4,7 @@ from opensipkd.base.tools.api import rpc_auth ...@@ -4,7 +4,7 @@ from opensipkd.base.tools.api import rpc_auth
from opensipkd.tools.api import JsonRpcInvalidLoginError from opensipkd.tools.api import JsonRpcInvalidLoginError
from pyramid.renderers import render_to_response from pyramid.renderers import render_to_response
from .models import ( from opensipkd.models import (
User, User,
UserGroup, UserGroup,
DBSession, DBSession,
......
...@@ -5,7 +5,7 @@ import requests ...@@ -5,7 +5,7 @@ import requests
from opensipkd.tools import ( from opensipkd.tools import (
get_random_number, devel, get_random_string, get_settings, DefaultTimeZone, get_params, get_timezone) get_random_number, devel, get_random_string, get_settings, DefaultTimeZone, get_params, get_timezone)
from opensipkd.tools.api import * from opensipkd.tools.api import *
from ..models import (DBSession, User, GroupPermission, UserDeviceModel) from opensipkd.models import (DBSession, User, GroupPermission, UserDeviceModel)
import logging import logging
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -91,20 +91,6 @@ def get_user_device(request, user_id): ...@@ -91,20 +91,6 @@ def get_user_device(request, user_id):
return user_device return user_device
def validate_time(request):
global lima_menit
env = request.environ
time_stamp = int(env['HTTP_KEY'])
now = get_seconds()
settings = get_settings()
if 'diff_server_time' in settings and settings["diff_server_time"]:
lima_menit = int(settings["diff_server_time"])
if not request.devel and abs(now - time_stamp) > lima_menit:
log.info(f"req time {time_stamp} server time {now}")
raise JsonRpcInvalidTimeError
return time_stamp
def auth_device(request): def auth_device(request):
...@@ -135,10 +121,6 @@ def auth_device(request): ...@@ -135,10 +121,6 @@ def auth_device(request):
return user return user
def get_jsonrpc(method, params):
return dict(jsonrpc='2.0', method=method, params=params,
id=int(get_random_number(6)))
def check_token(token, perm_name=None): def check_token(token, perm_name=None):
user = User.get_by_token(token).first() user = User.get_by_token(token).first()
...@@ -171,44 +153,3 @@ def update_token(user): ...@@ -171,44 +153,3 @@ def update_token(user):
DBSession.flush() DBSession.flush()
return dict(token=user.security_code) return dict(token=user.security_code)
def get_mandatory(data, values):
for value in values:
if value not in data or not data[value]:
raise JsonRpcInvalidDataError(message="{} Not Found".format(value))
def send_rpc(auth, message):
"""
Digunakan untuk mengirim data dengan methode JSONRPC 2.0 with os-auth
:param auth: Dict
{"user": user,
"url": url,
"key": key,
"method": method,
"timeout": optional,
}
:param message: Dict
:return: Dict
"""
userid = auth['user']
password = auth['key']
url = auth['url']
headers = json_rpc_header(userid, password)
params = dict(data=message)
data = get_jsonrpc(auth["method"], params)
timeout = 'timeout' in auth and int(auth['timeout']) or 5
log.info("URL:{} timeout:{} detik".format(url, timeout))
log.warning("REQUEST {}".format(data))
try:
results = requests.post(url, json=data, headers=headers, timeout=timeout) # data=jsondata,
except Exception as e:
log.warning(str(e))
return
if results.status_code != 200:
log.info(results)
log.info(results.text)
return
rows = results.text and json.loads(results.text) or None
log.info("RESPONSE {}".format(rows))
return rows
from sqlalchemy import func from sqlalchemy import func
from opensipkd.base.models import Parameter from opensipkd.models import Parameter
def column_concat(cols=None): def column_concat(cols=None):
......
...@@ -19,7 +19,7 @@ from opensipkd.base import get_params ...@@ -19,7 +19,7 @@ from opensipkd.base import get_params
from opensipkd.base.tools.api import rpc_auth from opensipkd.base.tools.api import rpc_auth
from .base_views import BaseView from .base_views import BaseView
from ..models import ( from opensipkd.models import (
DBSession, UserService, ) DBSession, UserService, )
from .common import DataTables, ColumnDT from .common import DataTables, ColumnDT
......
...@@ -3,7 +3,7 @@ from pyramid_rpc.jsonrpc import jsonrpc_method ...@@ -3,7 +3,7 @@ from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.tools.api import JsonRpcInvalidDataError, JsonRpcInvalidLoginError from opensipkd.tools.api import JsonRpcInvalidDataError, JsonRpcInvalidLoginError
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
from ..models import Partner, User from opensipkd.models import Partner, User
......
...@@ -3,7 +3,7 @@ from google.oauth2 import id_token ...@@ -3,7 +3,7 @@ from google.oauth2 import id_token
from opensipkd.base import get_params from opensipkd.base import get_params
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from ..models import User from opensipkd.models import User
from opensipkd.tools import get_settings from opensipkd.tools import get_settings
import json import json
......
...@@ -17,7 +17,7 @@ from email.utils import parseaddr ...@@ -17,7 +17,7 @@ from email.utils import parseaddr
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, btn_view, btn_add, btn_edit, btn_csv, \ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, btn_view, btn_add, btn_edit, btn_csv, \
btn_pdf btn_pdf
from ..models import User from opensipkd.models import User
from ...detable import DeTable from ...detable import DeTable
...@@ -145,13 +145,21 @@ class BaseView(object): ...@@ -145,13 +145,21 @@ class BaseView(object):
def form_validator(self, form, value): def form_validator(self, form, value):
pass pass
def get_params(self, params): def get_params(self, params, default=None):
return get_params(params) return get_params(params, default)
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings): def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **kwargs):
buttons = self.buttons and self.buttons or buttons buttons = self.buttons and self.buttons or buttons
bindings = self.bindings and self.bindings or bindings if "bindings" in kwargs and kwargs["bindings"]:
schema = class_form(validator=self.form_validator) bindings = kwargs["bindings"]
else:
bindings = self.bindings
if "validator" in kwargs and kwargs["validator"]:
schema = class_form(validator=kwargs["validator"])
else:
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req, **bindings) schema = schema.bind(request=self.req, **bindings)
schema.request = self.req schema.request = self.req
if row: if row:
...@@ -186,7 +194,7 @@ class BaseView(object): ...@@ -186,7 +194,7 @@ class BaseView(object):
if not row: if not row:
return self.id_not_found() return self.id_not_found()
bindings = self.get_bindings(row) bindings = self.get_bindings(row)
form = self.get_form(self.edit_schema, buttons=(btn_close,), **bindings) form = self.get_form(self.edit_schema, buttons=(btn_close,), bindings=bindings)
if request.POST: if request.POST:
return self.route_list() return self.route_list()
...@@ -208,7 +216,7 @@ class BaseView(object): ...@@ -208,7 +216,7 @@ class BaseView(object):
return return
def next_act(self): def next_act(self):
return raise NotImplementedError
def list_join(self, query): def list_join(self, query):
return query return query
...@@ -230,16 +238,16 @@ class BaseView(object): ...@@ -230,16 +238,16 @@ class BaseView(object):
query = DBSession.query().select_from(self.table) query = DBSession.query().select_from(self.table)
query = self.list_join(query) query = self.list_join(query)
if self.req.user.company_id and hasattr(self.table, "company_id"): if self.req.user and self.req.user.company_id and hasattr(self.table, "company_id"):
query = query.filter(self.table.company_id == self.req.user.company_id) query = query.filter(self.table.company_id == self.req.user.company_id)
row_table = DataTables(self.req.GET, query, columns) row_table = DataTables(self.req.GET, query, columns)
return row_table.output_result() return row_table.output_result()
else: else:
self.next_act() return self.next_act()
def view_add(self): def view_add(self):
bindings = self.get_bindings() bindings = self.get_bindings()
form = self.get_form(self.add_schema, **bindings) form = self.get_form(self.add_schema, bindings=bindings)
table = self.get_item_table() table = self.get_item_table()
resources = form.get_widget_resources() resources = form.get_widget_resources()
if self.req.POST: if self.req.POST:
...@@ -248,22 +256,27 @@ class BaseView(object): ...@@ -248,22 +256,27 @@ class BaseView(object):
try: try:
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
value = self.validation_failure(e.cstruct) # value = self.validation_failure(e.cstruct)
value.update(self.before_add()) # value.update(self.before_add())
form.render(appstruct=value) # form.render(appstruct=value)
return dict(form=form.render(), table=table and table.render() or None, return dict(form=form.render(e.cstruct),
scripts=self.form_scripts, css=resources["css"], js=resources["js"]) table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"],
js=resources["js"])
values = dict(controls) values = dict(controls)
row = self.save_request(values) row = self.save_request(values)
self.after_add(row, values) self.after_add(row, values)
if "cancel" in self.req.POST or 'batal' in self.req.POST: elif "cancel" in self.req.POST or 'batal' in self.req.POST:
self.cancel_act() self.cancel_act()
else:
return self.next_add(form)
return self.route_list() return self.route_list()
values = self.before_add() values = self.before_add()
form.set_appstruct(values) form.set_appstruct(values)
return dict(form=form.render(), table=table and table.render() or None, return dict(form=form.render(), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], js=resources["js"]) scripts=self.form_scripts, css=resources["css"],
js=resources["js"])
def before_save(self, row, values): def before_save(self, row, values):
return row return row
...@@ -290,8 +303,7 @@ class BaseView(object): ...@@ -290,8 +303,7 @@ class BaseView(object):
return row return row
def save_request(self, values, row=None): def save_request(self, values, row=None):
params = self.req.params for k, v in self.req.GET.items():
for k, v in params.items():
if k not in values: if k not in values:
if v: if v:
values[k] = v values[k] = v
...@@ -384,6 +396,14 @@ class BaseView(object): ...@@ -384,6 +396,14 @@ class BaseView(object):
return query.filter(self.table.company_id == self.req.user.company_id) return query.filter(self.table.company_id == self.req.user.company_id)
return query return query
def next_add(self, form):
"""
Digunakan untuk memverifikasi button yang lainnya
:param form: Object Form
:return:
"""
return self.route_list()
@colander.deferred @colander.deferred
def deferred_status(node, kw): def deferred_status(node, kw):
...@@ -402,15 +422,6 @@ class Store(dict): ...@@ -402,15 +422,6 @@ class Store(dict):
return "" return ""
store = Store()
reg_exts = ['.png', '.jpg', '.pdf', '.jpeg']
def image_validator(node, value):
ext = get_ext(value["filename"])
if ext not in reg_exts:
raise colander.Invalid(node, f'Extension harus salahsatu dari {reg_exts}')
username_re = re.compile('^[a-z0-9_]{6,16}$', re.IGNORECASE) username_re = re.compile('^[a-z0-9_]{6,16}$', re.IGNORECASE)
......
...@@ -2,9 +2,9 @@ import colander ...@@ -2,9 +2,9 @@ import colander
from deform import (widget, ) from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from opensipkd.base.models import ResProvinsi, ResDati2, ResDesa, User from opensipkd.models import ResProvinsi, ResDati2, ResDesa, User
from .partner_base import PartnerSchema, NamaSchema from .partner_base import PartnerSchema, NamaSchema
from ..models import DBSession, ResCompany, ResKecamatan, Partner from opensipkd.models import DBSession, ResCompany, ResKecamatan, Partner
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah pemda gagal' SESS_ADD_FAILED = 'Tambah pemda gagal'
...@@ -40,7 +40,7 @@ class ListSchema(NamaSchema): ...@@ -40,7 +40,7 @@ class ListSchema(NamaSchema):
class ViewCompany(BaseView): class ViewCompany(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewCompany, self).__init__(request) super().__init__(request)
self.list_route = 'company' self.list_route = 'company'
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
...@@ -91,16 +91,20 @@ class ViewCompany(BaseView): ...@@ -91,16 +91,20 @@ class ViewCompany(BaseView):
partner_id = value.get('partner_id') partner_id = value.get('partner_id')
found = Partner.query_email(value.get('email')).first() if 'email' in value and value["email"]:
if found: found = Partner.query_email(value.get('email')).first()
if found and found.id != partner_id: if found:
if found and found.id != partner_id:
err_email()
elif found:
err_email() err_email()
elif found:
err_email()
found = User.get_by_identity(value.get('email')) found = User.get_by_identity(value.get('email'))
if found: if found:
err_user() err_user()
value["status"]="status" in value and value["status"] and 1 or 0
value["is_vendor"]="is_vendor" in value and value["is_vendor"] and 1 or 0
value["is_customer"]="is_customer" in value and value["is_customer"] and 1 or 0
def get_bindings(self, row=None): def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list() provinsi_list = ResProvinsi.get_list()
...@@ -162,14 +166,21 @@ class ViewCompany(BaseView): ...@@ -162,14 +166,21 @@ class ViewCompany(BaseView):
part = None part = None
if "id" in values: if "id" in values:
del values["id"] del values["id"]
from .partner import save as partner_save if not part:
part = partner_save(values, self.req.user, part) part = Partner()
part.from_dict(values)
DBSession.add(part)
DBSession.flush()
if part: if part:
values["partner_id"] = part.id values["partner_id"] = part.id
if "id" in self.req.matchdict: if "id" in self.req.matchdict:
values["id"] = self.req.matchdict["id"] values["id"] = self.req.matchdict["id"]
row = self.save(values, self.req.user, row) row = self.save(values, self.req.user, row)
if not part.company_id:
part.company_id = row.id
DBSession.add(part)
DBSession.flush()
return row return row
...@@ -4,7 +4,7 @@ from pyramid.view import (view_config, ) ...@@ -4,7 +4,7 @@ from pyramid.view import (view_config, )
from . import widget_os from . import widget_os
from .provinsi import provinsi_widget from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi from opensipkd.models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah dati2 gagal' SESS_ADD_FAILED = 'Tambah dati2 gagal'
......
...@@ -12,7 +12,7 @@ from sqlalchemy.orm import aliased ...@@ -12,7 +12,7 @@ from sqlalchemy.orm import aliased
from .company import company_widget from .company import company_widget
from .upload import AddSchema as UploadSchema from .upload import AddSchema as UploadSchema
from ..models import DBSession, Departemen, Partner, PartnerDepartemen from opensipkd.models import DBSession, Departemen, Partner, PartnerDepartemen
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah departemen gagal' SESS_ADD_FAILED = 'Tambah departemen gagal'
......
...@@ -14,7 +14,7 @@ from pyramid.view import ( ...@@ -14,7 +14,7 @@ from pyramid.view import (
view_config, view_config,
) )
from ..models import Departemen from opensipkd.models import Departemen
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah departemen gagal' SESS_ADD_FAILED = 'Tambah departemen gagal'
......
...@@ -12,8 +12,8 @@ from opensipkd.tools.report import ( ...@@ -12,8 +12,8 @@ from opensipkd.tools.report import (
pdf_response, pdf_response,
csv_response, csv_response,
) )
from ..models import DBSession from opensipkd.models import DBSession
from ..models import ( from opensipkd.models import (
Departemen, Departemen,
) )
from ..views import (BaseView, ) from ..views import (BaseView, )
......
...@@ -5,7 +5,7 @@ from pyramid.view import (view_config, ) ...@@ -5,7 +5,7 @@ from pyramid.view import (view_config, )
from .dati2 import dati2_widget from .dati2 import dati2_widget
from .kecamatan import kecamatan_widget from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget from .provinsi import provinsi_widget
from ..models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2 from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah desa gagal' SESS_ADD_FAILED = 'Tambah desa gagal'
...@@ -22,13 +22,25 @@ def desa_widget(node, kw): ...@@ -22,13 +22,25 @@ def desa_widget(node, kw):
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(), provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget, widget=provinsi_widget,
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32),
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(colander.String(), dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget, widget=dati2_widget,
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32),
oid="dati2_id",
slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=",
title="Kabupaten/Kota",
)
kecamatan_id = colander.SchemaNode(colander.String(), kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget, widget=kecamatan_widget,
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32),
oid="kecamatan_id",
title="Kecamatan")
kode = colander.SchemaNode(colander.String(), kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode") validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(), kategori = colander.SchemaNode(colander.String(),
......
...@@ -7,7 +7,7 @@ from pyramid.view import ( ...@@ -7,7 +7,7 @@ from pyramid.view import (
) )
from .partner_base import NamaSchema from .partner_base import NamaSchema
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
Eselon Eselon
) )
......
...@@ -4,7 +4,7 @@ from pyramid.i18n import TranslationStringFactory ...@@ -4,7 +4,7 @@ from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
Group, Group,
Permission, Permission,
......
...@@ -5,7 +5,7 @@ from opensipkd.tools.buttons import btn_view, btn_add, btn_edit, btn_delete, btn ...@@ -5,7 +5,7 @@ from opensipkd.tools.buttons import btn_view, btn_add, btn_edit, btn_delete, btn
from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, pdf_response from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, pdf_response
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from .partner_base import NamaSchema from .partner_base import NamaSchema
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
Jabatan, Jabatan,
Eselon, Departemen Eselon, Departemen
......
...@@ -11,8 +11,8 @@ from pyramid.view import ( ...@@ -11,8 +11,8 @@ from pyramid.view import (
view_config, view_config,
) )
from ..models import DBSession from opensipkd.models import DBSession
from ..models import ( from opensipkd.models import (
Jabatan, Jabatan,
Departemen, Departemen,
) )
......
import json
import colander import colander
from deform import (widget, Form, ) from deform import (widget, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save, btn_add, btn_edit, btn_delete from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import DBSession, ResKecamatan, ResDati2, ResProvinsi
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os from . import widget_os
from .dati2 import dati2_widget from .dati2 import dati2_widget
from ..models import DBSession, ResKecamatan, ResDati2, ResProvinsi from ..views import BaseView
from ..views import ColumnDT, DataTables, BaseView
from ...detable import DeTable
SESS_ADD_FAILED = 'Tambah kecamatan gagal' SESS_ADD_FAILED = 'Tambah kecamatan gagal'
SESS_EDIT_FAILED = 'Edit kecamatan gagal' SESS_EDIT_FAILED = 'Edit kecamatan gagal'
...@@ -29,11 +26,23 @@ def kecamatan_widget(node, kw): ...@@ -29,11 +26,23 @@ def kecamatan_widget(node, kw):
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
dati2_id = colander.SchemaNode(colander.String(), provinsi_id = colander.SchemaNode(
widget=dati2_widget, colander.String(),
validator=colander.Length(max=32), oid="kode") widget=provinsi_widget,
kode = colander.SchemaNode(colander.String(), validator=colander.Length(max=32),
validator=colander.Length(max=32), oid="kode") oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(
colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32),
oid="dati2_id")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama") nama = colander.SchemaNode(colander.String(), oid="nama")
...@@ -43,7 +52,8 @@ class EditSchema(AddSchema): ...@@ -43,7 +52,8 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema): class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), searchable=False, orderable=False, visible=False) id = colander.SchemaNode(colander.Integer(), searchable=False,
orderable=False, visible=False)
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode") kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama") nama = colander.SchemaNode(colander.String(), title="Nama")
kabupaten = colander.SchemaNode(colander.String(), field=ResDati2.nama) kabupaten = colander.SchemaNode(colander.String(), field=ResDati2.nama)
......
...@@ -8,7 +8,7 @@ from pyramid.httpexceptions import HTTPFound ...@@ -8,7 +8,7 @@ from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config from pyramid.view import view_config
from opensipkd.base import DBSession from opensipkd.base import DBSession
from opensipkd.base.models.handlers import Log from opensipkd.models.handlers import Log
from opensipkd.base.views import BaseView, DataTables from opensipkd.base.views import BaseView, DataTables
......
...@@ -3,7 +3,7 @@ from deform import (widget, ) ...@@ -3,7 +3,7 @@ from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import BaseView from . import BaseView
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
Parameter) Parameter)
......
import os
import colander import colander
from deform import ( from deform import (
widget, widget,
...@@ -6,13 +8,16 @@ from pyramid.view import ( ...@@ -6,13 +8,16 @@ from pyramid.view import (
view_config, view_config,
) )
from opensipkd.base.models import ( from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa) ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.base.models.common import ResCompany from opensipkd.models.common import ResCompany
from opensipkd.tools import Upload, img_exts
from .company import company_widget from .company import company_widget
from .partner_base import PartnerSchema, NamaSchema from .partner_base import PartnerSchema, NamaSchema
from ..models import DBSession from opensipkd.models import DBSession, Partner
from ..models import Partner
from .. import partner_idcard_folder
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah partner gagal' SESS_ADD_FAILED = 'Tambah partner gagal'
...@@ -54,6 +59,9 @@ class ListSchema(NamaSchema): ...@@ -54,6 +59,9 @@ class ListSchema(NamaSchema):
missing=colander.drop, missing=colander.drop,
widget=widget.HiddenWidget(), widget=widget.HiddenWidget(),
) )
email = colander.SchemaNode(
colander.String(),
oid="email")
status = colander.SchemaNode( status = colander.SchemaNode(
colander.Boolean(), colander.Boolean(),
oid="status") oid="status")
...@@ -147,22 +155,22 @@ class ViewPartner(BaseView): ...@@ -147,22 +155,22 @@ class ViewPartner(BaseView):
r.append(d) r.append(d)
return r return r
@view_config(route_name='partner-add', renderer='templates/form_input.pt', @view_config(route_name='partner-add', renderer='templates/form.pt',
permission='user-edit') permission='user-edit')
def view_add(self): def view_add(self):
return super().view_add() return super().view_add()
@view_config(route_name='partner-edit', renderer='templates/form_input.pt', @view_config(route_name='partner-edit', renderer='templates/form.pt',
permission='user-edit') permission='user-edit')
def view_edt(self): def view_edt(self):
return super().view_edit() return super().view_edit()
@view_config(route_name='partner-view', renderer='templates/form_input.pt', @view_config(route_name='partner-view', renderer='templates/form.pt',
permission='user-edit') permission='user-edit')
def view_view(self): def view_view(self):
return super().view_view() return super().view_view()
@view_config(route_name='partner-delete', renderer='templates/form_input.pt', @view_config(route_name='partner-delete', renderer='templates/form.pt',
permission='user-edit') permission='user-edit')
def view_delete(self): def view_delete(self):
return super().view_delete() return super().view_delete()
...@@ -179,6 +187,7 @@ class ViewPartner(BaseView): ...@@ -179,6 +187,7 @@ class ViewPartner(BaseView):
row = q.first() row = q.first()
else: else:
row = None row = None
q = Partner.query_kode(value['kode']) q = Partner.query_kode(value['kode'])
found = q.first() found = q.first()
if row: if row:
...@@ -203,6 +212,26 @@ class ViewPartner(BaseView): ...@@ -203,6 +212,26 @@ class ViewPartner(BaseView):
company_list=ResCompany.get_list() company_list=ResCompany.get_list()
) )
def save_request(self, values, row=None):
if "idcard" in values and values["idcard"]:
folder = self.get_params("idcard_folder", '/tmp/idcard')
upload = Upload(folder)
file_name = upload.save(self.req, 'upload', img_exts)
values["idcard"] = file_name
row = super().save_request(values, row)
return row
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
if "idcard" in d and d["idcard"]:
filename = d["idcard"]
preview_url = "/".join(
[self.home, partner_idcard_folder, filename])
d["idcard"] = {"uid": filename.split(".")[0],
"filename": filename,
"preview_url": preview_url
}
return d
@colander.deferred @colander.deferred
def partner_widget(node, kw): def partner_widget(node, kw):
......
import colander import colander
from deform import FileData, widget
from opensipkd.base.views.dati2 import dati2_widget from opensipkd.base.views.dati2 import dati2_widget
from opensipkd.base.views.desa import desa_widget from opensipkd.base.views.desa import desa_widget
from opensipkd.base.views.kecamatan import kecamatan_widget from opensipkd.base.views.kecamatan import kecamatan_widget
from opensipkd.base.views.provinsi import provinsi_widget from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.tools import mem_tmp_store
class NamaSchema(colander.Schema): class NamaSchema(colander.Schema):
kode = colander.SchemaNode( kode = colander.SchemaNode(
...@@ -20,6 +23,12 @@ class NamaSchema(colander.Schema): ...@@ -20,6 +23,12 @@ class NamaSchema(colander.Schema):
class PartnerSchema(NamaSchema): class PartnerSchema(NamaSchema):
idcard = colander.SchemaNode(
FileData(),
widget=widget.FileUploadWidget(mem_tmp_store),
missing=colander.drop,
title="ID Card"
)
alamat_1 = colander.SchemaNode( alamat_1 = colander.SchemaNode(
colander.String(), colander.String(),
missing=colander.drop, missing=colander.drop,
......
...@@ -5,8 +5,8 @@ from pyramid.view import ( ...@@ -5,8 +5,8 @@ from pyramid.view import (
view_config, view_config,
) )
from ..models import DBSession from opensipkd.models import DBSession
from ..models import (Partner, Departemen, from opensipkd.models import (Partner, Departemen,
) )
from opensipkd.tools.report import ( from opensipkd.tools.report import (
open_rml_row, open_rml_row,
......
...@@ -2,7 +2,7 @@ import colander ...@@ -2,7 +2,7 @@ import colander
from deform import (widget, ) from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from ..models import Permission from opensipkd.models import Permission
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah permission gagal' SESS_ADD_FAILED = 'Tambah permission gagal'
......
...@@ -6,9 +6,9 @@ from pyramid.view import (view_config, ) ...@@ -6,9 +6,9 @@ from pyramid.view import (view_config, )
from sqlalchemy import or_ from sqlalchemy import or_
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased
from ..models import DBSession as PartnerDBSession, DBSession, ResCompany from opensipkd.models import DBSession as PartnerDBSession, DBSession, ResCompany
from ..models import Departemen, Jabatan from opensipkd.models import Departemen, Jabatan
from ..models import Partner, PartnerDepartemen from opensipkd.models import Partner, PartnerDepartemen
from opensipkd.tools import dmy, date_from_str from opensipkd.tools import dmy, date_from_str
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close from opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
......
...@@ -5,8 +5,8 @@ from pyramid.view import ( ...@@ -5,8 +5,8 @@ from pyramid.view import (
view_config, view_config,
) )
from ..models import DBSession as PartnerDBSession from opensipkd.models import DBSession as PartnerDBSession
from ..models import ( from opensipkd.models import (
Departemen, Departemen,
Jabatan, Jabatan,
Partner, Partner,
......
...@@ -3,7 +3,7 @@ from deform import (widget, ) ...@@ -3,7 +3,7 @@ from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os from . import widget_os
from ..models import DBSession, ResProvinsi, kategori_provinsi from opensipkd.models import DBSession, ResProvinsi, kategori_provinsi
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah provinsi gagal' SESS_ADD_FAILED = 'Tambah provinsi gagal'
......
...@@ -30,7 +30,7 @@ import os ...@@ -30,7 +30,7 @@ import os
import colander import colander
from deform import (widget, Button, FileData) from deform import (widget, Button, FileData)
from opensipkd.tools import Upload from opensipkd.tools import Upload, mem_tmp_store, image_validator
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.security import forget from pyramid.security import forget
...@@ -40,9 +40,9 @@ from ziggurat_foundations.models.services.user import UserService ...@@ -40,9 +40,9 @@ from ziggurat_foundations.models.services.user import UserService
from opensipkd.base import get_params from opensipkd.base import get_params
from opensipkd.base.views.user import email_validator, add_member_count from opensipkd.base.views.user import email_validator, add_member_count
from . import widget_os from . import widget_os
from .base_views import store, image_validator, need_captcha, need_verify, get_url_captcha from .base_views import need_captcha, need_verify, get_url_captcha
from .user_login import regenerate_security_code, get_login_headers, send_email_security_code, send_email_pending from .user_login import regenerate_security_code, get_login_headers, send_email_security_code, send_email_pending
from ..models import User, DBSession, Partner, Group, UserGroup, ExternalIdentity from opensipkd.models import User, DBSession, Partner, Group, UserGroup, ExternalIdentity
from ..views import BaseView from ..views import BaseView
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
...@@ -88,9 +88,9 @@ class AddSchema(colander.Schema): ...@@ -88,9 +88,9 @@ class AddSchema(colander.Schema):
title=_("ID Number"), title=_("ID Number"),
# missing=colander.drop, # missing=colander.drop,
oid="kode") oid="kode")
self["doc_id_card"] = colander.SchemaNode( self["idcard"] = colander.SchemaNode(
FileData(), FileData(),
widget=widget.FileUploadWidget(store), widget=widget.FileUploadWidget(mem_tmp_store),
title=_("ID Card"), title=_("ID Card"),
validator=image_validator) validator=image_validator)
if not request.user and need_captcha(): if not request.user and need_captcha():
...@@ -178,8 +178,14 @@ class Registrasi(BaseView): ...@@ -178,8 +178,14 @@ class Registrasi(BaseView):
raise exc raise exc
def err_user(): def err_user():
raise colander.Invalid( if 'user_name' in form:
form['user_name'], 'User name %s sudah ada yang menggunakan' % value['user_name']) raise colander.Invalid(
form['user_name'], 'User name %s sudah ada yang menggunakan' % value['user_name'])
else:
raise colander.Invalid(
form['email'], 'User name %s sudah ada yang menggunakan' % value['email'])
def err_nik(): def err_nik():
if "kode" in form: if "kode" in form:
...@@ -198,11 +204,13 @@ class Registrasi(BaseView): ...@@ -198,11 +204,13 @@ class Registrasi(BaseView):
ses_captcha = request.session.pop('captcha') ses_captcha = request.session.pop('captcha')
if captcha != ses_captcha: if captcha != ses_captcha:
err_captcha() err_captcha()
is_logged = form.request.user is_logged = form.request.user
if not "email" in value and "id_info" in session: if not "email" in value and "id_info" in session:
value["email"] = session["id_info"]["email"] value["email"] = session["id_info"]["email"]
if "user_name" not in value or not value["user_name"]:
value["user_name"] = value["email"]
if 'user_name' in value: if 'user_name' in value:
user_name = value["user_name"] user_name = value["user_name"]
user = user_found(user_name) user = user_found(user_name)
...@@ -212,8 +220,7 @@ class Registrasi(BaseView): ...@@ -212,8 +220,7 @@ class Registrasi(BaseView):
if user and is_logged: if user and is_logged:
if user.id != is_logged.id: if user.id != is_logged.id:
err_user() err_user()
if "user_name" not in value or not value["user_name"]:
value["user_name"] = value["mobile"]
email = value["email"] email = value["email"]
user = user_found(email) user = user_found(email)
...@@ -263,19 +270,6 @@ class Registrasi(BaseView): ...@@ -263,19 +270,6 @@ class Registrasi(BaseView):
result.update(dict(captcha=get_url_captcha(self.req))) result.update(dict(captcha=get_url_captcha(self.req)))
return result return result
def before_save(self, row, values):
if "doc_id_card" not in values or not values["doc_id_card"]:
return row
path = get_params('reg_folder', '/tmp/registrasi')
if not os.path.exists(path):
os.makedirs(path)
upload = Upload(path)
values["doc_id_card"] = upload.save(self.req, 'upload')
row.doc_id_card = values["doc_id_card"]
return row
def after_save(self, row, values): def after_save(self, row, values):
if not self.req.user: # User Baru if not self.req.user: # User Baru
if 'groups' in values and values['groups']: if 'groups' in values and values['groups']:
...@@ -355,7 +349,7 @@ class Registrasi(BaseView): ...@@ -355,7 +349,7 @@ class Registrasi(BaseView):
forget(self.req) forget(self.req)
self.ses.delete() self.ses.delete()
@view_config(route_name='register', renderer='templates/form_input.pt') @view_config(route_name='register', renderer='templates/form.pt')
def view_register(self): def view_register(self):
if "g_state" in self.req.cookies: if "g_state" in self.req.cookies:
if "id_info" not in self.ses or not self.ses["id_info"]: if "id_info" not in self.ses or not self.ses["id_info"]:
...@@ -390,7 +384,7 @@ class Registrasi(BaseView): ...@@ -390,7 +384,7 @@ class Registrasi(BaseView):
form.set_appstruct(values) form.set_appstruct(values)
return form return form
@view_config(route_name='profile', renderer='templates/form_input.pt', @view_config(route_name='profile', renderer='templates/form.pt',
permission='view') permission='view')
def view_profile(self): def view_profile(self):
reg_form = get_params("reg_form") reg_form = get_params("reg_form")
...@@ -398,3 +392,11 @@ class Registrasi(BaseView): ...@@ -398,3 +392,11 @@ class Registrasi(BaseView):
return HTTPFound(location=self.req.route_url(reg_form)) return HTTPFound(location=self.req.route_url(reg_form))
self.bindings = dict(user=self.req.user) self.bindings = dict(user=self.req.user)
return super(Registrasi, self).view_edit() return super(Registrasi, self).view_edit()
def save_request(self, values, row=None):
if "idcard" in values and values["idcard"]:
path = get_params('idcard_folder', '/tmp/idcard')
upload = Upload(path)
values["idcard"] = upload.save(self.req, 'upload')
row = super().save_request(values, row)
return row
\ No newline at end of file \ No newline at end of file
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
# # from . import get_login_headers # # from . import get_login_headers
# # from .register import mobile_found_partner, save_partner, nik_found # # from .register import mobile_found_partner, save_partner, nik_found
# from .user_group import save as save_groups # from .user_group import save as save_groups
# from ..models import DBSession, Partner, Group, ExternalIdentity, User, ExternalIdentityService # from opensipkd.models import DBSession, Partner, Group, ExternalIdentity, User, ExternalIdentityService
# from opensipkd.tools import get_settings # from opensipkd.tools import get_settings
# from opensipkd.tools.captcha import get_captcha # from opensipkd.tools.captcha import get_captcha
# from ..views import BaseView # from ..views import BaseView
......
...@@ -4,7 +4,7 @@ from opensipkd.tools.buttons import btn_view, btn_edit, btn_delete ...@@ -4,7 +4,7 @@ from opensipkd.tools.buttons import btn_view, btn_edit, btn_delete
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView
from ..models import (DBSession, Route, ) from opensipkd.models import (DBSession, Route, )
class EditSchema(colander.Schema): class EditSchema(colander.Schema):
......
<html metal:use-macro="load: ./base.pt"> <html metal:use-macro="load: ./base3.1.pt">
<js metal:fill-slot="js_files"> <js metal:fill-slot="js_files">
<script src="${home}/static/v3/js/plugin/datatables/jquery.dataTables.min.js"></script> <script src="${home}/static/v3/js/plugin/datatables/jquery.dataTables.min.js"></script>
<script src="${home}/static/v3/js/plugin/datatables/dataTables.colVis.min.js"></script> <script src="${home}/static/v3/js/plugin/datatables/dataTables.colVis.min.js"></script>
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
group_path ['group', 'group-add', 'group-edit', 'group-view', 'group-delete']; group_path ['group', 'group-add', 'group-edit', 'group-view', 'group-delete'];
param_path ['parameter', 'parameter-add', 'parameter-edit', 'parameter-view', 'parameter-delete']; param_path ['parameter', 'parameter-add', 'parameter-edit', 'parameter-view', 'parameter-delete'];
dep_path ['departemen', 'departemen-add', 'departemen-edit', 'departemen-view', 'departemen-delete']; dep_path ['departemen', 'departemen-add', 'departemen-edit', 'departemen-view', 'departemen-delete'];
partner_path ['partner', 'partner-add', 'partner-edt', 'partner-view', 'partner-del']; partner_path ['partner', 'partner-add', 'partner-edit', 'partner-view', 'partner-delete'];
company_path ['company', 'company-add', 'company-edt', 'company-view', 'company-del']; company_path ['company', 'company-add', 'company-edit', 'company-view', 'company-delete'];
part_dep_path ['partner-departemen', 'partner-departemen-add', 'partner-departemen-edit', 'partner-departemen-view', 'partner-departemen-delete']; part_dep_path ['partner-departemen', 'partner-departemen-add', 'partner-departemen-edit', 'partner-departemen-view', 'partner-departemen-delete'];
jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view', 'jabatan-delete']; jabatan_path ['jabatan', 'jabatan-add', 'jabatan-edit', 'jabatan-view', 'jabatan-delete'];
eselon_path ['eselon', 'eselon-add', 'eselon-edit', 'eselon-view', 'eselon-delete']; eselon_path ['eselon', 'eselon-add', 'eselon-edit', 'eselon-view', 'eselon-delete'];
......
...@@ -14,7 +14,7 @@ from . import BaseView ...@@ -14,7 +14,7 @@ from . import BaseView
from .company import company_widget from .company import company_widget
from .user_login import ( from .user_login import (
regenerate_security_code, send_email_security_code, generate_api_key, ) regenerate_security_code, send_email_security_code, generate_api_key, )
from ..models import (DBSession, User, Group, UserGroup, ResCompany, ) from opensipkd.models import (DBSession, User, Group, UserGroup, ResCompany, )
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
# ) # )
# from sqlalchemy.orm import aliased # from sqlalchemy.orm import aliased
# #
# from ..models import DBSession # from opensipkd.models import DBSession
# from ..models import DepartemenUser, User, Departemen # from opensipkd.models import DepartemenUser, User, Departemen
# from ..views import ColumnDT, DataTables, BaseView # from ..views import ColumnDT, DataTables, BaseView
# #
# SESS_ADD_FAILED = 'Tambah departemen gagal' # SESS_ADD_FAILED = 'Tambah departemen gagal'
......
...@@ -6,7 +6,7 @@ from pyramid.i18n import TranslationStringFactory ...@@ -6,7 +6,7 @@ from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView
from ..models import (DBSession, User, ExternalIdentity) from opensipkd.models import (DBSession, User, ExternalIdentity)
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
......
...@@ -12,7 +12,7 @@ from deform import ( ...@@ -12,7 +12,7 @@ from deform import (
widget, widget,
ValidationFailure, ValidationFailure,
) )
from ..models import ( from opensipkd.models import (
DBSession, DBSession,
User, User,
Group, Group,
......
...@@ -34,7 +34,7 @@ from ziggurat_foundations.models.services.external_identity import \ ...@@ -34,7 +34,7 @@ from ziggurat_foundations.models.services.external_identity import \
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
from opensipkd.base import DBSession, get_params from opensipkd.base import DBSession, get_params
from opensipkd.base.models import User, ExternalIdentity from opensipkd.models import User, ExternalIdentity
from opensipkd.tools import create_now, set_user_log, get_settings from opensipkd.tools import create_now, set_user_log, get_settings
from opensipkd.base.views import _, one_hour, two_minutes, BaseView from opensipkd.base.views import _, one_hour, two_minutes, BaseView
from pyramid_mailer.message import Message from pyramid_mailer.message import Message
...@@ -323,7 +323,8 @@ def reset_password_validator(form, value): ...@@ -323,7 +323,8 @@ def reset_password_validator(form, value):
def security_code_age(user): def security_code_age(user):
return create_now() - user.security_code_date now = create_now()
return now - user.security_code_date
def send_email_security_code( def send_email_security_code(
......
...@@ -18,8 +18,8 @@ from .user import EmailValidator as EmailValidatorBase ...@@ -18,8 +18,8 @@ from .user import EmailValidator as EmailValidatorBase
from .user_group import save as save_groups from .user_group import save as save_groups
from .user_login import (ChangePassword, change_password_validator, from .user_login import (ChangePassword, change_password_validator,
regenerate_security_code, send_email_security_code) regenerate_security_code, send_email_security_code)
from ..models import DBSession, UserService, Departemen from opensipkd.models import DBSession, UserService, Departemen
from ..models import (User, Partner, Group, UserGroup, PartnerDepartemen) from opensipkd.models import (User, Partner, Group, UserGroup, PartnerDepartemen)
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
...@@ -93,18 +93,19 @@ def login(request, data): ...@@ -93,18 +93,19 @@ def login(request, data):
:param request: :param request:
:param data: :param data:
{ {
user_name: "user_name": "user_name",
password: "password": "password"
device_id:
}
:return:{
"user_name": user_name,
"token": token,
"nik": nik,
"nama": nik,
"group": [group],
"departemens": departemen
} }
:return:
result: "data":
{
"user_name": "user_name",
"nik": nik,
"nama": nik,
"group": [group],
"departemens": [departemen]
}
error:"error":{}
""" """
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
...@@ -125,7 +126,6 @@ def logout(request, data): ...@@ -125,7 +126,6 @@ def logout(request, data):
:return:{ :return:{
} }
""" """
# token_auth(request, logout=True)
headers = forget(request) headers = forget(request)
request.session.delete() request.session.delete()
request.response.headers.update(headers) request.response.headers.update(headers)
...@@ -155,7 +155,7 @@ def get_profile(request, data): ...@@ -155,7 +155,7 @@ def get_profile(request, data):
Digunakan untuk memperoleh profile user yang sedang login Digunakan untuk memperoleh profile user yang sedang login
parameter parameter
@param request: Request @param request: Request
@param data: Dict(password=password) @param data: {"password": password}
@return: @return:
""" """
user = request.user user = request.user
...@@ -257,6 +257,8 @@ def set_profile(request, data): ...@@ -257,6 +257,8 @@ def set_profile(request, data):
email="", email="",
mobile="", mobile="",
nama="", nama="",
alamat_1="",
alamat_2=""
) )
:return: :return:
""" """
...@@ -288,13 +290,14 @@ def register_user(request, data): ...@@ -288,13 +290,14 @@ def register_user(request, data):
""" """
Digunakan untuk registrasi user dan profile Digunakan untuk registrasi user dan profile
:param request: :param request:
:param data:Dict( :param data:{
user_name="", "user_name"="",
nik="", "email"="",
email="", "mobile"="",
mobile="", "nama"="",
nama="", "alamat_1"="",
) "alamat_2"=""
}
:return: :return:
""" """
is_list = type(data) is list is_list = type(data) is list
...@@ -341,6 +344,16 @@ def get_password_(request, data): ...@@ -341,6 +344,16 @@ def get_password_(request, data):
@jsonrpc_method(method='get-password', endpoint='rpc-user') @jsonrpc_method(method='get-password', endpoint='rpc-user')
@jsonrpc_method(method='get_password', endpoint='rpc-user') @jsonrpc_method(method='get_password', endpoint='rpc-user')
def get_password(request, data): def get_password(request, data):
"""
Digunakan untuk request password
:param request:
:param data: {
"email": email
}
:return:
success: {"result": {}}
error: {"error": {}}
"""
return get_password_(request, data) return get_password_(request, data)
......
from deform.widget import * import json
from deform.widget import (
SchemaType,
DateInputWidget as DeformDateInputWidget)
from colander import null, Invalid
class _FieldStorage(SchemaType): class _FieldStorage(SchemaType):
def deserialize(self, node, cstruct): def deserialize(self, node, cstruct):
...@@ -9,3 +13,53 @@ class _FieldStorage(SchemaType): ...@@ -9,3 +13,53 @@ class _FieldStorage(SchemaType):
if not hasattr(cstruct, 'file'): if not hasattr(cstruct, 'file'):
raise Invalid(node, "%s is not a FieldStorage instance" % cstruct) raise Invalid(node, "%s is not a FieldStorage instance" % cstruct)
return cstruct return cstruct
class DateInputWidget(DeformDateInputWidget):
"""
Renders a date picker widget.
The default rendering is as a native HTML5 date input widget,
falling back to pickadate (https://github.com/amsul/pickadate.js.)
Most useful when the schema node is a ``colander.Date`` object.
**Attributes/Arguments**
options
Dictionary of options for configuring the widget (eg: date format)
template
The template name used to render the widget. Default:
``dateinput``.
readonly_template
The template name used to render the widget in read-only mode.
Default: ``readonly/textinput``.
"""
default_options = (
("format", "yyyy-mm-dd"),
("selectMonths", True),
("selectYears", True),
("formatSubmit", "yyyy-mm-dd"),
)
def serialize(self, field, cstruct, **kw):
if cstruct in (null, None):
cstruct = ""
readonly = kw.get("readonly", self.readonly)
template = readonly and self.readonly_template or self.template
options = dict(
kw.get("options") or self.options or self.default_options
)
kw.setdefault("options_json", json.dumps(options))
values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, **values)
def deserialize(self, field, pstruct):
if pstruct in ("", null):
return null
try:
validated = self._pstruct_schema.deserialize(pstruct)
except Invalid as exc:
raise Invalid(field.schema, "Invalid pstruct: %s" % exc)
return validated["date_submit"] or validated["date"]
<tal:block tal:define="oid oid|field.oid; <tal:block tal:define="oid oid|field.oid;
css_class css_class|field.widget.css_class; css_class css_class|field.widget.css_class;
style style|field.widget.style;"> style style|field.widget.style;">
${field.start_mapping()} ${field.start_mapping()}
<input type="file" name="upload" id="${oid}" <input type="file" name="upload" id="${oid}"
tal:attributes="style style; tal:attributes="style style;
accept accept|field.widget.accept; accept accept|field.widget.accept;
data-filename cstruct.get('filename'); data-filename cstruct.get('filename');
attributes|field.widget.attributes|{};"/> attributes|field.widget.attributes|{};"/>
<input tal:define="uid cstruct.get('uid')" <input tal:define="uid cstruct.get('uid')"
tal:condition="uid" tal:condition="uid"
type="hidden" name="uid" value="${uid}"/> type="hidden" name="uid" value="${uid}"/>
${field.end_mapping()} <a tal:define="preview_url cstruct.get('preview_url');
<script type="text/javascript"> filename cstruct.get('filename')"
deform.addCallback('${oid}', function (oid) { tal:condition="preview_url" href="${structure: preview_url}"
$('#' + oid).upload(); target="_blank">Show</a>
});
</script> ${field.end_mapping()}
<script type="text/javascript">
deform.addCallback('${oid}', function (oid) {
$('#' + oid).upload();
});
</script>
</tal:block> </tal:block>
<p id="${oid|field.oid}" class="form-control-static deform-readonly-text" <p tal:define="preview_url cstruct.get('preview_url')">
tal:content="cstruct.get('filename') or ''"> <a tal:condition="preview_url" href="${structure: preview_url}"
target="_blank">Show</a>
<p tal:condition="not preview_url" id="${oid|field.oid}"
class="form-control-static deform-readonly-text"
tal:content="cstruct.get('filename') or ''"></p>
</p> </p>
from sqlalchemy import event
from .base import *
from .common import *
from .users import *
from .wilayah import *
from .partner import *
from .departemen import *
from .pegawai import *
# from .meta import *
# from .targets import *
# from .wilayah import *
def has_permission(action):
pass
@event.listens_for(User, 'before_delete', has_permission('delete'))
def receive_before_delete(mapper, connection, target):
"listen for the 'before_delete' event"
# ... (event handling logic) ...
pass
ALL_TABLES = {}
for sub_class in Base.__subclasses__():
if hasattr(sub_class, "__tablename__"):
tablename = sub_class.__tablename__
if tablename not in ALL_TABLES:
ALL_TABLES.update({tablename: sub_class})
def query_table(table_name, fields=None, domain=None):
cls = ALL_TABLES[table_name]
if fields:
query = DBSession.query().select_from(cls)
# for field in fields:
query = query.add_columns(*[getattr(cls, c) for c in fields])
else:
query = DBSession.query(cls)
if domain:
filter_expressions = []
for d in domain:
field = getattr(cls, d[0])
operator = d[1]
value = d[2]
filter_expressions.append(field.op(operator)(value))
query = query.filter(
*[
e for i, e in enumerate(filter_expressions)
if e is not None]
)
return query
from sqlalchemy import (Column, Integer, String, DateTime, func, ) from sqlalchemy import (Column, Integer, String, DateTime, func, )
from sqlalchemy.orm import (scoped_session, sessionmaker, ) from sqlalchemy.orm import (scoped_session, sessionmaker, )
from opensipkd.base import Base from opensipkd.base import Base
from opensipkd.base.models import CommonModel from opensipkd.models import CommonModel
factory = sessionmaker(autoflush=True, autocommit=True) factory = sessionmaker(autoflush=True, autocommit=True)
LogDBSession = scoped_session(factory) LogDBSession = scoped_session(factory)
......
...@@ -6,12 +6,13 @@ from sqlalchemy import ( ...@@ -6,12 +6,13 @@ from sqlalchemy import (
DateTime, ForeignKey DateTime, ForeignKey
) )
from opensipkd.base.models.common import NamaModel from .common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2 from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from .meta import (Base) from .meta import (Base)
class PartnerModel(NamaModel): class PartnerModel(NamaModel):
idcard = Column(String(256))
status = Column(Integer, default=1) status = Column(Integer, default=1)
alamat_1 = Column(String(128)) alamat_1 = Column(String(128))
alamat_2 = Column(String(128)) alamat_2 = Column(String(128))
......
...@@ -13,7 +13,7 @@ from sqlalchemy.orm import ( ...@@ -13,7 +13,7 @@ from sqlalchemy.orm import (
backref backref
) )
from opensipkd.base.models import Partner from opensipkd.models import Partner
from ..models import DBSession, Base from ..models import DBSession, Base
from ..models import (DefaultModel, NamaModel, TABLE_ARGS, from ..models import (DefaultModel, NamaModel, TABLE_ARGS,
User, Departemen) User, Departemen)
......
from datetime import datetime from datetime import datetime
import pytz
from ziggurat_foundations import ziggurat_model_init from ziggurat_foundations import ziggurat_model_init
import sqlalchemy as sa import sqlalchemy as sa
...@@ -18,7 +20,7 @@ from ziggurat_foundations.models.user_group import UserGroupMixin ...@@ -18,7 +20,7 @@ from ziggurat_foundations.models.user_group import UserGroupMixin
from ziggurat_foundations.models.user_permission import UserPermissionMixin from ziggurat_foundations.models.user_permission import UserPermissionMixin
from ziggurat_foundations.models.user_resource_permission import UserResourcePermissionMixin from ziggurat_foundations.models.user_resource_permission import UserResourcePermissionMixin
from ziggurat_foundations.models.services.external_identity import ExternalIdentityService from ziggurat_foundations.models.services.external_identity import ExternalIdentityService
from opensipkd.tools import as_timezone from opensipkd.tools import as_timezone, get_timezone
from .base import CommonModel, DBSession, DefaultModel from .base import CommonModel, DBSession, DefaultModel
from .meta import Base from .meta import Base
...@@ -71,6 +73,10 @@ class User(UserMixin, BaseModel, CommonModel, Base): ...@@ -71,6 +73,10 @@ class User(UserMixin, BaseModel, CommonModel, Base):
registered_date = Column(DateTime(timezone=True), registered_date = Column(DateTime(timezone=True),
nullable=False, nullable=False,
default=datetime.utcnow) default=datetime.utcnow)
security_code_date = Column(DateTime(timezone=True),
default=datetime(2000, 1, 1, tzinfo=pytz.timezone('Asia/Jakarta')),
server_default="2000-01-01 01:01+7",
)
api_key = Column(String(256)) api_key = Column(String(256))
partner_id = Column(Integer) #, ForeignKey(Partner.id)) partner_id = Column(Integer) #, ForeignKey(Partner.id))
company_id = Column(Integer) #, ForeignKey(Partner.id)) company_id = Column(Integer) #, ForeignKey(Partner.id))
......
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship, backref
from opensipkd.base.models import TABLE_ARGS from opensipkd.models import TABLE_ARGS
from sqlalchemy import ( from sqlalchemy import (
Column, Column,
ForeignKey, ForeignKey,
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!