add text_printers table and related views, schemas, and permissions

Co-authored-by: Copilot <copilot@github.com>
1 parent 97ac8b38
......@@ -14,6 +14,8 @@ config = context.config
if config.config_file_name is not None:
fileConfig(config.config_file_name)
tables = ["text_printers"]
#alembic revision --autogenerate -m "Initial table creation"
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
......@@ -27,7 +29,7 @@ target_metadata = Base.metadata
def include_object(object, name, type_, reflected, compare_to):
if type_ == "table" and name != "users":
if tables and type_ == "table" and name not in tables:
return False
return True
......@@ -73,7 +75,8 @@ def run_migrations_online() -> None:
with connectable.connect() as connection:
context.configure(
connection=connection, target_metadata=target_metadata,
version_table='alembic_base'
version_table='alembic_base',
include_object=include_object
)
with context.begin_transaction():
......
"""Initial table creation
Revision ID: d2dc53a168c8
Revises: 1be80caf7f0a
Create Date: 2026-04-30 01:39:46.558393
"""
# revision identifiers, used by Alembic.
revision = 'd2dc53a168c8'
down_revision = '1be80caf7f0a'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('text_printers',
sa.Column('nama', sa.String(length=128), nullable=False),
sa.Column('kode', sa.String(length=32), nullable=False),
sa.Column('status', sa.SmallInteger(), nullable=False),
sa.Column('created', sa.DateTime(), nullable=True),
sa.Column('updated', sa.DateTime(), nullable=True),
sa.Column('create_uid', sa.Integer(), nullable=True),
sa.Column('update_uid', sa.Integer(), nullable=True),
sa.Column('id', sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_text_printers')),
schema='public'
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('text_printers', schema='public')
# ### end Alembic commands ###
......@@ -9,3 +9,4 @@ from .targets import *
from .user_area import *
from .departmen import _Departemen, Departemen
from .pegawai import *
from .utils import TextPrinters
\ No newline at end of file
from sqlalchemy import Column
from . import Base, NamaModel, TABLE_ARGS
class TextPrinters(Base, NamaModel):
__tablename__ = 'text_printers'
__table_args__ = TABLE_ARGS
......@@ -2,4 +2,4 @@ group_id/groups.group_name,perm_name
Superuser,admin
Web Service,web-service
Pindah Departemen,departemen-all
Guest," ""guest"""
\ No newline at end of file
Guest,"guest"
\ No newline at end of file
......@@ -13,3 +13,4 @@ parameter,Parameter
permission,Permission
web-service,WEB SERVICE RPC
departemen-all,Pindah antar Departemen
printers,Setting Printer
\ No newline at end of file
......@@ -101,12 +101,21 @@ base-pangkat-add,/pangkat/add,base,pangkat,,,,admin,base-pangkat,Pangkat Add,1,0
base-pangkat-edit,/pangkat/{id}/edit,base,pangkat,,,,admin,base-pangkat,Pangkat Edit,1,0,,,form6.pt,
base-pangkat-view,/pangkat/{id}/view,base,pangkat,,,,admin,base-pangkat,Pangkat View,1,0,,,form6.pt,
base-pangkat-delete,/pangkat/{id}/delete,base,pangkat,,,,admin,base-pangkat,Pangkat Delete,1,0,,,form6.pt,
,,,,,,,,,,,,,,,
base-eselon,/eselon,base,eselon,,view_list,,admin,base-admin,Eselon,1,0,,1,form.pt,
base-eselon-act,/eselon/{act}/act,base,eselon,,,,admin,base-eselon,Eselon Action,1,0,,,json,
base-eselon-add,/eselon/add,base,eselon,,,,admin,base-eselon,Eselon Add,1,0,,,form6.pt,
base-eselon-edit,/eselon/{id}/edit,base,eselon,,,,admin,base-eselon,Eselon Edit,1,0,,,form6.pt,
base-eselon-view,/eselon/{id}/view,base,eselon,,,,admin,base-eselon,Eselon View,1,0,,,form6.pt,
base-eselon-delete,/eselon/{id}/delete,base,eselon,,,,admin,base-eselon,Eselon Delete,1,0,,,form6.pt,
,,,,,,,,,,,,,,,
base-printer,/printer,base,printers,,view_list,,printers,base-admin,Printer,1,0,,1,form.pt,
base-printer-act,/printer/{act}/act,base,printers,,,,printers,base-printer,Printer Action,1,0,,,json,
base-printer-add,/printer/add,base,printers,,,,printers,base-printer,Printer Add,1,0,,,form6.pt,
base-printer-edit,/printer/{id}/edit,base,printers,,,,printers,base-printer,Printer Edit,1,0,,,form6.pt,
base-printer-view,/printer/{id}/view,base,printers,,,,printers,base-printer,Printer View,1,0,,,form6.pt,
base-printer-delete,/printer/{id}/delete,base,printers,,,,printers,base-printer,Printer Delete,1,0,,,form6.pt,
base-xhr-test,/xhr/test,,xhr_test,,view_list,,admin,base-admin,Test,1,0,,1,test_list.pt
base-xhr-test-act,/xhr/test/{act}/act,base,xhr_test,,,,admin,base-test,Test Action,1,0,,,json,
base-xhr-test-add,/xhr/test/add,base,xhr_test,,,,admin,base-test,Test Add,1,0,,,test_form.pt,
......
import logging
import stat
from translationstring import TranslationStringFactory
import colander
from pyramid.httpexceptions import (
......@@ -114,3 +115,20 @@ class Home(BaseView):
request=request
)
return dict(modules=modules, logo=logo, submodules=[])
class KodeSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator = colander.Length(max=32),
title="Kode",
global_search=True
)
class NamaSchema(KodeSchema):
nama = colander.SchemaNode(
colander.String(),
validator = colander.Length(max=100),
title="Nama",
global_search=True
)
\ No newline at end of file
import logging
import re
import colander
from deform import (widget,)
from pyramid.i18n import TranslationStringFactory
from ..models import TextPrinters
from . import BaseView, NamaSchema
log = logging.getLogger(__name__)
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah partner gagal'
SESS_EDIT_FAILED = 'Edit partner gagal'
class AddSchema(NamaSchema):
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),
title="Status")
def after_bind(self, schema, kw):
schema["kode"].title = "IP Address"
schema["kode"].widget = widget.TextInputWidget(
mask="999.999.999.999", # Use specialized mask format
# If required
mask_mapping={'Z': {'pattern': '[0-9]', 'optional': True}},
# css_class='ip_address'
)
# schema["kode"].validator = colander.Regex(
# r'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'
# )
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.Integer(),
missing=colander.drop,
widget=widget.HiddenWidget(),
)
class ListSchema(EditSchema):
pass
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_route = 'base-printer'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = TextPrinters
self.list_schema = ListSchema
# self.list_buttons = (btn_delete,)
self.save_state = True
self.allow_check = True
self.list_view_field = 'nama'
def list_filter(self, query, **kwargs):
if not self.req.has_permission('admin'):
query = query.filter_by(create_uid=self.req.user.id)
return query
def form_validator(self, form, value):
exc = colander.Invalid(form, None)
ip = value['kode'].split('.')
err = []
err_format = 'Format IP salah'
if not re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', value['kode']):
err.append(err_format+' 123.123.123.123')
if len(ip) != 4:
err.append(err_format+' harus 4 oktet')
for i in ip:
if not i.isdigit():
err.append(err_format)
if int(i) < 0 or int(i) > 255:
err.append(err_format+' setiap oktet harus antara 0-255')
if ip[0] == '0':
err.append(err_format+' tidak boleh diawali 0')
if err:
exc['kode'] = '\n'.join(err)
raise exc
def after_save(self, values, row):
self.db_session.flush()
if values['status'] == 1:
printers = TextPrinters.query().filter_by(create_uid=row.create_uid).all()
for printer in printers:
if printer.id == row.id:
continue
printer.status = 0
self.db_session.add(printer)
self.db_session.flush()
return row
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, )
from sqlalchemy import (func, true, )
from ziggurat_foundations.models.services.user import UserService
from opensipkd.tools import create_now
from opensipkd.tools.buttons import btn_delete
......@@ -34,6 +37,13 @@ class ListSchema(colander.Schema):
registered = colander.SchemaNode(colander.String(), width=100,
field="registered_date",
searchable=False)
multi_device = colander.SchemaNode(colander.Integer(), width=50,
widget=widget.CheckboxWidget(),
searchable=False
)
def after_bind(self, node, kw):
if not BASE_CLASS.single_device:
del node['multi_device']
class Views(BaseView):
......@@ -309,18 +319,21 @@ class AddSchema(colander.Schema):
is_api_key = colander.SchemaNode(
colander.String(), widget=api_key_widget, title=_('API Key'),
missing=colander.drop)
multi_device = colander.SchemaNode(colander.Integer(), title=_('Multi Device'),
widget=widget.CheckboxWidget(true_val="1", false_val="0"),)
password = colander.SchemaNode(
colander.String(), widget=widget.CheckedPasswordWidget(),
missing=colander.drop)
# company_id = colander.SchemaNode(
# colander.Integer(), widget=company_widget,
# title="Company",
# missing=colander.drop)
status = colander.SchemaNode(
colander.String(), widget=widget.CheckboxWidget(true_val="1", false_val="0"), title=_('Status'))
def after_bind(self, node, kw):
if not BASE_CLASS.single_device:
del node['multi_device']
class EditSchema(AddSchema):
status = colander.SchemaNode(
colander.String(), widget=widget.CheckboxWidget(true_val="1", false_val="0"), title=_('Status'))
id = colander.SchemaNode(colander.Integer(), missing=colander.drop,
widget=widget.HiddenWidget())
def get_group_list():
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!