Commit 51d26cb1 by Ari Agung Prasetiyo

Merge branch '5.0.3' of https://git.opensipkd.com/aa.gusti/opensipkd-base into 5.0.3

2 parents 266eb772 5be4c97a
5.0.4 2026-06-01
1. Penambahan parameter
- ws_print_url
- is_pylpr
2. Penambahan Table
- tabel text_printer
3. Penambahan URL
- printer
- printer-add
- printer-edit
- printer-edit
- printer-delete
5.0.3 2026-04-28
- Penambahan field session_id pada table users digunakan untuk membatasi jumlah
login hanya bisa ada pada satu device
......
......@@ -520,14 +520,18 @@ class BaseApp():
self.reg_nip = 0
self.single_device = "false"
self.is_pylpr = False
self.wsp_url = ""
self.wsp_client_id = ""
self.wsp_client_key = ""
def get_route_file(self, filename="routes.csv"):
fullpath = os.path.join(self.base_dir, 'scripts', 'data', filename)
return open(fullpath)
return open(fullpath, encoding="utf-8")
def static_view(self, config, settings=None):
if not settings:
settings = get_settings()
settings = settings or config.registry.settings
# if not settings:
# settings = get_settings()
self.temp_files = settings.get("temp_files")
if not os.path.exists(self.temp_files):
os.makedirs(self.temp_files)
......@@ -564,6 +568,9 @@ class BaseApp():
self.login_tpl = get_params("login_tpl", "", settings=settings)
self.login_captcha = int(get_params(
"login_captcha", 0, settings=settings))
self.wsp_url = settings.get("wsp_url", "")
self.wsp_client_id = settings.get("wsp_client_id", "")
self.wsp_client_key = settings.get("wsp_client_key", "")
def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views",
template_path="views/templates/"):
......@@ -784,18 +791,33 @@ def set_routes(config, app_id=None):
from pyramid.httpexceptions import HTTPBadRequest, HTTPFound
from pyramid.security import forget
from pyramid.view import exception_view_config
from pyramid.response import Response
import json
@exception_view_config(HTTPBadRequest)
def bad_request_view(exc, request):
if request.matched_route.name=='base-login' :
# Bersihkan sesi autentikasi (logout)
headers = forget(request)
# Arahkan ulang ke halaman login (misalnya route 'login')
request.session.flash("Permintaan tidak valid. Silakan ulangi kembali. atau origin tidak diizinkan.", "error")
_logging.debug(f"Bad Request: {exc} from {request.url}")
referrer = request.route_url('base-home')
referrer = request.route_url('base-login')
response = HTTPFound(location=referrer)
response.headers.extend(headers)
return response
elif request.is_xhr:
payload = {
"status": "error",
"message": exc.detail or str(exc)
}
return Response(
json_body=payload,
status=400,
content_type='application/json'
)
return exc
from .depreciated_base import *
......@@ -15,7 +15,6 @@ from pyramid.request import Response
from sqlalchemy import Table
# from opensipkd.base.views.upload import tmpstore
from opensipkd.tools.captcha import img_captcha
from opensipkd.tools import dmy, get_settings, get_ext, \
date_from_str, get_random_string, Upload, InvalidExtension, mem_tmp_store
from opensipkd.tools.buttons import (
......@@ -77,8 +76,6 @@ class CSRFSchema(colander.Schema):
import re
from pyramid.interfaces import IRoutesMapper
from pyramid.threadlocal import get_current_registry
import io
import xlsxwriter
class BaseView(object):
def __init__(self, request):
......@@ -107,7 +104,9 @@ class BaseView(object):
self.list_route = 'home'
# self.list_col_defs = ""
# self.list_cols = ""
self.list_report = (btn_csv, btn_pdf)
self.list_report = (btn_csv, btn_xls)
self.list_csvpdf = (btn_csv, btn_pdf)
self.list_pdf = (btn_pdf,)
self.list_buttons = (btn_add,)
self.list_upload = (btn_upload,)
self.list_view_field = None
......@@ -556,7 +555,8 @@ class BaseView(object):
elif url_dict['act'] == 'csv':
return self.csv_response(**kwargs)
elif url_dict['act'] == 'csv1':
return self.csv1_response(**kwargs)
elif url_dict['act'] == 'pdf':
return self.pdf_response(**kwargs)
......@@ -671,7 +671,7 @@ class BaseView(object):
filename = jasper_export(self.report_file)
return file_response(self.req, filename=filename[0])
def csv_response(self, **kwargs):
def csv1_response(self, **kwargs):
query = self.table.query_register()
row = query.first()
header = row._mapping.keys()
......@@ -725,6 +725,12 @@ class BaseView(object):
for i, value in enumerate(row):
if isinstance(value, str):
row[i] = self.remove_tags(value)
elif isinstance(value, datetime):
is_aware_utc = value.tzinfo is not None \
and value.tzinfo.utcoffset(value) is not None
if is_aware_utc:
value = value.astimezone().replace(tzinfo=None)
row[i] = value
value = {
'header': header,
......@@ -732,11 +738,14 @@ class BaseView(object):
}
return value
def xls_response(self, **kwargs):
value = self.xls_data()
return xls_response(self.req, value)
def csv_response(self, **kwargs):
value = self.xls_data()
return csv_response(self.req, value)
def get_bindings(self, row=None):
return {"row": row}
......
......@@ -30,13 +30,16 @@ class AddSchema(colander.Schema):
validator=colander.Length(max=32),
oid="kode")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
validator=colander.Length(max=32), oid="kode",
global_search=True,)
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(
values=kategori_dati2),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
oid="kode",
global_search=True,)
nama = colander.SchemaNode(colander.String(), oid="nama",
global_search=True,)
class EditSchema(AddSchema):
......
......@@ -86,8 +86,10 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action", visible=False)
kode = colander.SchemaNode(colander.String(), title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
kode = colander.SchemaNode(colander.String(), title="Kode",
global_search=True,)
nama = colander.SchemaNode(colander.String(), title="Nama",
global_search=True,)
status = colander.SchemaNode(colander.Boolean(), title="Status", width='50pt',
widget=widget.CheckboxWidget())
level_id = colander.SchemaNode(
......
......@@ -43,12 +43,15 @@ class AddSchema(colander.Schema):
oid="kecamatan_id",
title="Kecamatan")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
validator=colander.Length(max=32), oid="kode",
global_search=True,)
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(
values=kategori_desa),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
validator=colander.Length(max=32), oid="kode",
global_search=True,)
nama = colander.SchemaNode(colander.String(), oid="nama",
global_search=True,)
class EditSchema(AddSchema):
......
......@@ -42,8 +42,10 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), visible=False, title="Action")
group_name = colander.SchemaNode(
colander.String(), )
description = colander.SchemaNode(colander.String())
colander.String(),
global_search=True, )
description = colander.SchemaNode(colander.String(),
global_search=True,)
class Views(BaseView):
......
......@@ -32,17 +32,21 @@ class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
oid="kode",
global_search=True,)
nama = colander.SchemaNode(
colander.String(),
oid="nama")
oid="nama",
global_search=True,)
nama_pendek = colander.SchemaNode(
colander.String(),
oid="nama_pendek",
global_search=True,
missing=colander.drop)
nama_lain = colander.SchemaNode(
colander.String(),
oid="nama_lain",
global_search=True,
missing=colander.drop)
jenis = colander.SchemaNode(
colander.Integer(),
......
$(function () {
$('#deformcheck').click(function (e) {
var url = '%s';
e.preventDefault();
console.log('Check button clicked: ' + url);
$.get(url, function (data) {
console.log("Data loaded:", data);
$('#errors').hide();
$('#success').text(data.message).show();
}).fail(function (jqXHR, textStatus, errorThrown,) {
var err = ("Error printing: " + errorThrown + " " + jqXHR.responseJSON.message);
$('#success').hide();
$('#errors').text(err).show();
});
});
});
\ No newline at end of file
......@@ -41,8 +41,10 @@ class AddSchema(colander.Schema):
oid="dati2_id")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
validator=colander.Length(max=32), oid="kode",
global_search=True,)
nama = colander.SchemaNode(colander.String(), oid="nama",
global_search=True,)
class EditSchema(AddSchema):
......
......@@ -70,15 +70,18 @@ class ListSchema(colander.Schema):
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
width="100pt",
global_search=True)
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
oid="nama",
global_search=True)
email = colander.SchemaNode(
colander.String(),
oid="email")
oid="email",
global_search=True)
idcard = colander.SchemaNode(
colander.String(),
oid="idcard",
......
......@@ -18,12 +18,14 @@ class ListSchema(colander.Schema):
perm_name = colander.SchemaNode(
colander.String(),
oid="perm_name",
title="Nama")
title="Nama",
global_search=True)
description = colander.SchemaNode(
colander.String(),
missing=colander.drop,
oid="description",
title="Diskripsi")
title="Diskripsi",
global_search=True)
class EditSchema(ListSchema):
pass
......
......@@ -27,14 +27,17 @@ def provinsi_widget(node, kw):
class AddSchema(colander.Schema):
kode = colander.SchemaNode(colander.String(),
oid="kode",
validator=colander.Length(max=32), )
validator=colander.Length(max=32),
global_search=True, )
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(
values=kategori_provinsi),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
nama = colander.SchemaNode(colander.String(), oid="nama",
global_search=True,)
ibu_kota = colander.SchemaNode(
colander.String(), oid="nama", missing=colander.drop)
colander.String(), oid="nama", missing=colander.drop,
global_search=True,)
class EditSchema(AddSchema):
......
import os
import re
from shapely import node
import colander
from deform import (widget, )
from opensipkd.base import BASE_CLASS
from pyramid.i18n import TranslationStringFactory
from sqlalchemy import (func, true, )
from sqlalchemy import (func )
from ziggurat_foundations.models.services.user import UserService
from opensipkd.tools import create_now
from opensipkd.tools.buttons import btn_delete
from . import BaseView
# from .company import company_widget
from .user_login import (
regenerate_security_code, send_email_security_code, generate_api_key, )
from ..models.users import (DBSession, User, Group, UserGroup,)
......@@ -25,9 +23,11 @@ class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(),
title="Action",
searchable=False)
email = colander.SchemaNode(colander.String())
email = colander.SchemaNode(colander.String(),
global_search=True)
user_name = colander.SchemaNode(colander.String(),
title=_("user-name", default="User Name"))
title=_("user-name", default="User Name"),
global_search=True)
status = colander.SchemaNode(colander.Integer(),
widget=widget.CheckboxWidget(),
width=50, searchable=False)
......
......@@ -14,14 +14,16 @@ class ListSchema(colander.Schema):
user_name = colander.SchemaNode(
colander.String(),
field=User.user_name,
title="User"
title="User",
global_search=True,
)
desa_kd = colander.SchemaNode(
colander.String(),
field=ResDesa.kode)
desa_name = colander.SchemaNode(
colander.String(),
field=ResDesa.nama)
field=ResDesa.nama,
global_search=True,)
class AddSchema(colander.Schema):
......
......@@ -190,6 +190,14 @@ class DeTable(field.Field):
window.location = o%sUri+'/csv/act%s&'+paramString;}
""" % (
tableid, tableid, params),
"csv2": """{
params = o%s.ajax.params();
paramString = $.param(params);
console.log(params);
window.location = o%sUri+'/csv2/act%s&'+paramString;}
""" % (
tableid, tableid, params),
"xls": """{
params = o%s.ajax.params();
paramString = $.param(params);
......
......@@ -38,6 +38,8 @@ dependencies = [
'wheezy.captcha',
'ziggurat-foundations',
'zope.sqlalchemy',
'websockets',
"asyncio",
]
requires-python = '>= 3.8'
authors = [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!