register

1 parent 9d5001ab
Showing 942 changed files with 1238 additions and 3059 deletions
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
*$py.class *$py.class
.vs/ .vs/
.vscode/ .vscode/
# C extensions # C extensions
*.so *.so
# Distribution / packaging # Distribution / packaging
.Python .Python
bak/ bak/
env/ env/
env*/ env*/
build/ build/
develop-eggs/ develop-eggs/
dist/ dist/
downloads/ downloads/
eggs/ eggs/
.eggs/ .eggs/
lib/ lib/
lib64/ lib64/
parts/ parts/
sdist/ sdist/
var/ var/
wheels/ wheels/
inventori/ inventori/
*.egg-info/ *.egg-info/
.installed.cfg .installed.cfg
*.egg *.egg
# PyInstaller # PyInstaller
# Usually these files are written by a python script from a template # Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it. # before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest *.manifest
*.spec *.spec
# Installer logs # Installer logs
pip-log.txt pip-log.txt
pip-delete-this-directory.txt pip-delete-this-directory.txt
# Unit test / coverage reports # Unit test / coverage reports
htmlcov/ htmlcov/
.tox/ .tox/
.coverage .coverage
.coverage.* .coverage.*
.cache .cache
nosetests.xml nosetests.xml
coverage.xml coverage.xml
*,cover *,cover
.hypothesis/ .hypothesis/
# Translations # Translations
*.mo *.mo
*.pot *.pot
# Django stuff: # Django stuff:
*.log *.log
local_settings.py local_settings.py
# Flask stuff: # Flask stuff:
instance/ instance/
.webassets-cache .webassets-cache
# Scrapy stuff: # Scrapy stuff:
.scrapy .scrapy
# Sphinx documentation # Sphinx documentation
docs/_build/ docs/_build/
# PyBuilder # PyBuilder
target/ target/
# Jupyter Notebook # Jupyter Notebook
.ipynb_checkpoints .ipynb_checkpoints
# pyenv # pyenv
.python-version .python-version
# celery beat schedule file # celery beat schedule file
celerybeat-schedule celerybeat-schedule
# SageMath parsed files # SageMath parsed files
*.sage.py *.sage.py
# dotenv # dotenv
.env .env
# bat file # bat file
*.bat *.bat
# virtualenv # virtualenv
.venv .venv
venv/ venv/
ENV/ ENV/
# Spyder project settings # Spyder project settings
.spyderproject .spyderproject
# Rope project settings # Rope project settings
.ropeproject .ropeproject
live.ini live.ini
.idea/ .idea/
.project/ .project/
.DS_Store .DS_Store
opensipkd/base/static/img/* opensipkd/base/static/img/*
opensipkd/base/static/icon/* opensipkd/base/static/icon/*
!opensipkd/base/static/icon/default.png !opensipkd/base/static/icon/default.png
!opensipkd/base/static/img/pyramid.png !opensipkd/base/static/img/pyramid.png
!opensipkd/base/static/img/opensipkd.png !opensipkd/base/static/img/opensipkd.png
!opensipkd/base/static/img/opensipkd_bg.png !opensipkd/base/static/img/opensipkd_bg.png
!opensipkd/base/static/img/ajax-loader.gif !opensipkd/base/static/img/ajax-loader.gif
!opensipkd/base/static/img/line.png !opensipkd/base/static/img/line.png
!opensipkd/base/static/img/bootstrap.png !opensipkd/base/static/img/bootstrap.png
!opensipkd/base/static/img/postgree.png !opensipkd/base/static/img/postgree.png
alembic.ini alembic.ini
alembic_local.ini alembic_local.ini
.vs* .vs*
activate activate
4.0.0 17-11-2024 4.0.0 17-11-2024
Penambahan Field pada tabel routes Penambahan Field pada tabel routes
Tabel Routes berfungsi juga sebagai menu generator Tabel Routes berfungsi juga sebagai menu generator
4.0.0 09-07-2024 4.0.0 09-07-2024
Perubahan Colander>2.0 Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0 Perubahan SQLAlchemy>2.0
beaker>=1.12.1 beaker>=1.12.1
3.0.2 13-07-2023 3.0.2 13-07-2023
Perubahan Colander>2.0 Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0 Perubahan SQLAlchemy>2.0
beaker>=1.12.1 beaker>=1.12.1
Ini sepertinya gak jadi Ini sepertinya gak jadi
3.0.1 25-04-2022 3.0.1 25-04-2022
Penambahan Feature ```detable``` Penambahan Feature ```detable```
3.0.0 26-08-2021 3.0.0 26-08-2021
1. Penghapusan folder src 1. Penghapusan folder src
2. Perubahan ke base ciamis 2. Perubahan ke base ciamis
3. Penambahan api sicantik 3. Penambahan api sicantik
2.1.5 06-03-2021 2.1.5 06-03-2021
Minor change Minor change
1. Perbaikan datatable sorting dengan inherite data di common.py 1. Perbaikan datatable sorting dengan inherite data di common.py
2. Penghapusan dukungan ke web-r authentication 2. Penghapusan dukungan ke web-r authentication
3. Penambahan module External module login 3. Penambahan module External module login
2.1.4 06-01-2021 2.1.4 06-01-2021
1. Penambahan function request.api_has_permission 1. Penambahan function request.api_has_permission
2.0.3 25-12-2020 2.0.3 25-12-2020
1. Penambahan tinymce 1. Penambahan tinymce
2. Perubahan MaskMoney 2. Perubahan MaskMoney
3. Pengurangan library static 3. Pengurangan library static
2.0.2 22-11-2020 2.0.2 22-11-2020
1. Penambahan field app_id pada tabel routes 1. Penambahan field app_id pada tabel routes
2. Perubahan struktur csv di scripts/data/routes.csv mejadi 2. Perubahan struktur csv di scripts/data/routes.csv mejadi
kode,path,nama,app_id,status,type kode,path,nama,app_id,status,type
3. Functionality penggunakan config pyramid.includes 3. Functionality penggunakan config pyramid.includes
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
pyramid_beaker pyramid_beaker
pyramid_chameleon pyramid_chameleon
pyramid_rpc.jsonrpc pyramid_rpc.jsonrpc
bjb.samsat bjb.samsat
pyramid_debugtoolbar pyramid_debugtoolbar
4. Penggunaan Parameter modules depreceated 4. Penggunaan Parameter modules depreceated
Setiap modules harus terdapat function includeme Setiap modules harus terdapat function includeme
def includeme(): def includeme():
app_id = 1 app_id = 1
set_routes(app_id set_routes(app_id
config.scan('.') config.scan('.')
5. function main() pada modules.__init__ depreceated 5. function main() pada modules.__init__ depreceated
6. config(ini) depreceated 6. config(ini) depreceated
modules = module1, module2, ... modules = module1, module2, ...
7. Penambahan Logging terhadap database:: 7. Penambahan Logging terhadap database::
[handlers] [handlers]
keys = console, tabel, dblog keys = console, tabel, dblog
[handler_dblog] [handler_dblog]
class = opensipkd.base.handlers.SQLAlchemyHandler class = opensipkd.base.handlers.SQLAlchemyHandler
args = () args = ()
level = INFO level = INFO
[logger_root] [logger_root]
level = INFO level = INFO
handlers = console, filelog, dblog handlers = console, filelog, dblog
[logger_opensipkd] [logger_opensipkd]
level = INFO level = INFO
handlers = dblog handlers = dblog
qualname = opensipkd qualname = opensipkd
[handler_filelog] [handler_filelog]
class = FileHandler class = FileHandler
args = ('file_location','a') args = ('file_location','a')
level = INFO level = INFO
formatter = generic formatter = generic
8. Penambahan script import_log: 8. Penambahan script import_log:
Digunakan untuk import data dari file log ke database Digunakan untuk import data dari file log ke database
Sebaiknya diimport pada saat akan berpindah logging Sebaiknya diimport pada saat akan berpindah logging
$import_log config log_file $import_log config log_file
2.0.1 16-08-2020 2.0.1 16-08-2020
Penambahan Error Rpc Penambahan Error Rpc
2.0.0 16-08-2020 2.0.0 16-08-2020
Pembuatan Branch Ciamis Pembuatan Branch Ciamis
Perbaikan Step PIP install Perbaikan Step PIP install
Perubahan setup.py Perubahan setup.py
Perubahan ini file nama aplikasi opensipkd.base menjadi opensipkd_base Perubahan ini file nama aplikasi opensipkd.base menjadi opensipkd_base
Perubahan penamaan folder src/opensipkd/base menjadi opensipkd/base Perubahan penamaan folder src/opensipkd/base menjadi opensipkd/base
Penambahan Template Horizontal Penambahan Template Horizontal
Old Old
${structure form} ${structure form}
Label Label
Input Input
New New
${structure form} ${structure form}
Label Input Label Input
0.1.4 08-11-2019 0.1.4 08-11-2019
---------------- ----------------
Pembuatan Branch Bandung Pembuatan Branch Bandung
Penambahan method pada models user Penambahan method pada models user
Penambahan custom render Penambahan custom render
0.1.3 08-11-2019 0.1.3 08-11-2019
---------------- ----------------
- ZopeTransactionExtension diganti dengan register(). - ZopeTransactionExtension diganti dengan register().
- README yang lebih baik. - README yang lebih baik.
0.1.2 10-02-2019 0.1.2 10-02-2019
---------------- ----------------
- Penambahan parameter 'db_session=DBSession' pada append_csv berfungsi apabila - Penambahan parameter 'db_session=DBSession' pada append_csv berfungsi apabila
caller mempunyai Session database yang berbeda caller mempunyai Session database yang berbeda
- Penambahan modules tools sub api.py, db.py, pbb.py - Penambahan modules tools sub api.py, db.py, pbb.py
0.1.1 17-12-2018 0.1.1 17-12-2018
---------------- ----------------
- Form edit user bisa ubah password karena user non-manusia (host to host) - Form edit user bisa ubah password karena user non-manusia (host to host)
tidak punya email. tidak punya email.
- .gitignore ditambah .DS_Store. - .gitignore ditambah .DS_Store.
0.1 12-12-2018 0.1 12-12-2018
-------------- --------------
- get_login_headers() menyimpan user.id pada cookie ketimbang user.user_email. - get_login_headers() menyimpan user.id pada cookie ketimbang user.user_email.
Akhirnya ini berdampak pada group_finder(). Akhirnya ini berdampak pada group_finder().
- RootFactory yang lebih efisien yaitu cukup berisi daftar hak akses, tidak - RootFactory yang lebih efisien yaitu cukup berisi daftar hak akses, tidak
perlu melibatkan request. perlu melibatkan request.
- groups.py kini menyertakan hak akses dengan memanfaatkan tabel - groups.py kini menyertakan hak akses dengan memanfaatkan tabel
groups_permissions bawaan ziggurat. Sebagai pendukung dibuatlah tabel groups_permissions bawaan ziggurat. Sebagai pendukung dibuatlah tabel
permissions yang berisi daftar hak akses sebagaimana yang tertera pada permissions yang berisi daftar hak akses sebagaimana yang tertera pada
function argument permission di setiap view function. function argument permission di setiap view function.
- Hak akses yang lebih ringkas dimana user.py dan groups.py menggunakan - Hak akses yang lebih ringkas dimana user.py dan groups.py menggunakan
satu hak akses saja yang bernama user-edit yang bermakna bisa SELECT, INSERT, satu hak akses saja yang bernama user-edit yang bermakna bisa SELECT, INSERT,
UPDATE, dan DELETE tabel users dan tabel groups. Jika nanti ada kebutuhan UPDATE, dan DELETE tabel users dan tabel groups. Jika nanti ada kebutuhan
grup yang hanya bisa SELECT maka bisa dibuat hak akses bernama user-view. grup yang hanya bisa SELECT maka bisa dibuat hak akses bernama user-view.
- initializedb.py saat INSERT data kini menggunakan format csv saja - initializedb.py saat INSERT data kini menggunakan format csv saja
dengan menggunakan dua fungsi: dengan menggunakan dua fungsi:
- restore_csv() yang akan INSERT data hanya jika tabelnya masih kosong. Ini - restore_csv() yang akan INSERT data hanya jika tabelnya masih kosong. Ini
cocok untuk tabel users. cocok untuk tabel users.
- append_csv() yang akan INSERT data jika key pada tabel tidak ditemukan. - append_csv() yang akan INSERT data jika key pada tabel tidak ditemukan.
- Jika field pada csv merupakan foreign key maka nama field ditulis dengan - Jika field pada csv merupakan foreign key maka nama field ditulis dengan
susunan nama-field-tabel-csv/nama-tabel-foreign.nama-field-foreign, contoh: susunan nama-field-tabel-csv/nama-tabel-foreign.nama-field-foreign, contoh:
pemda_id/va_pemda.kode. pemda_id/va_pemda.kode.
- Tabel user_ws diganti dengan field users.api_key. - Tabel user_ws diganti dengan field users.api_key.
- Admin bisa membuatkan API Key saat membuat user baru atau saat sedang edit. - Admin bisa membuatkan API Key saat membuat user baru atau saat sedang edit.
- User bisa membuat ulang API Key jika memang terisi. - User bisa membuat ulang API Key jika memang terisi.
- Ada prosedur lupa password. - Ada prosedur lupa password.
0.0.1 21-10-2017 0.0.1 21-10-2017
---------------- ----------------
- Penambahan Field type pada route default 0 - Penambahan Field type pada route default 0
- alter table routes add type not null default 0 - alter table routes add type not null default 0
- Field ini digunakan untuk menentukan jenis-renderer - Field ini digunakan untuk menentukan jenis-renderer
- 0 Route Standar - 0 Route Standar
- 1 Route JSON_RPC - 1 Route JSON_RPC
0.0 24-9-2017 aa.gusti 0.0 24-9-2017 aa.gusti
---------------------- ----------------------
- Penambahan tabel parameters - Penambahan tabel parameters
0.0 0.0
--- ---
- Initial version - Initial version
\ No newline at end of file \ No newline at end of file
include *.txt *.ini *.rst *.tpl *.csv *.ttf *.woff *.woff2 *.svg include *.txt *.ini *.rst *.tpl *.csv *.ttf *.woff *.woff2 *.svg
recursive-include opensipkd *.ico *.png *.css *.gif *.jpg *.pt *.txt *.js *.html *.xml *.csv *.ttf *.woff *.woff2 *.svg recursive-include opensipkd *.ico *.png *.css *.gif *.jpg *.pt *.txt *.js *.html *.xml *.csv *.ttf *.woff *.woff2 *.svg
# DeTable
Feature yang digunakan untuk memudahkan merender datatable dalam html
```python
import colander
from opensipkd.detable import DeTable
from opensipkd.tools.buttons import btn_view, btn_add, btn_edit, btn_delete, btn_close
from datatables import ColumnDT
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(), searchable=False,
orderable=False, visible=False)
kode = colander.SchemaNode(colander.String(), width='100pt')
nama = colander.SchemaNode(colander.String())
@view_config(route_name='provinsi',
renderer='templates/list.pt',
permission='provinsi')
def view_list(self):
table = DeTable(ListSchema(), action=f"{self.home}/provinsi",
action_suffix="/grid/act",
buttons=(btn_view, btn_add, btn_edit, btn_delete, btn_close))
return dict(table=table.render(), scripts="")
# /provinsi/add
@view_config(route_name='provinsi-add',
renderer='templates/form_input.pt',
permission='provinsi')
def view_add(request):
pass
# /provinsi/{id}/edit
@view_config(route_name='provinsi-edit',
renderer='templates/form_input.pt',
permission='provinsi')
def view_edit(request):
pass
# /provinsi/{id}/delete
@view_config(route_name='provinsi-delete',
renderer='templates/form_input.pt',
permission='provinsi')
def view_delete(request):
pass
# /provinsi/{id}/view
@view_config(route_name='provinsi-view',
renderer='templates/form_input.pt',
permission='provinsi')
def view_view(request):
pass
# /provinsi/{act}/act
@view_config(route_name='provinsi-act',
renderer='json',
permission='provinsi')
def view_act(request):
url_dict = request.matchdict
if url_dict['act'] == 'grid':
columns = [ColumnDT(ResProvinsi.id, mData='id'),
ColumnDT(ResProvinsi.kode, mData='kode'),
ColumnDT(ResProvinsi.nama, mData='nama'),
ColumnDT(ResProvinsi.status, mData='status'), ]
query = DBSession.query().select_from(ResProvinsi)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
```
## Contoh HTML
```html
<html metal:use-macro="load: ./base3.1.pt"
tal:define="
home request.route_url('home');">
<div metal:fill-slot="content">
<div class="jarviswidget jarviswidget-color-blueLight"> <!-- jarviswidget -->
<div tal:content="structure table"></div>
</div>
</div>
</html>
```
## DeTable Parameter
Lihat di deklarasi `class DeTable(field.Field):`
## SchemaNode Items
```python
colander.SchemaNode(
NodeType, -> colander.Integer(), colander.String()
searchable=False,
orderable=False,
visible=False,
width="20pt",
thousands=dict(separator='.', decimal=',', point=2) (not implemented),
widget=widget (not implemented)
)
\ No newline at end of file \ No newline at end of file
### ###
# app configuration # app configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html # http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
### ###
[app:main] [app:main]
;[app:opensipkd_base] ;[app:opensipkd_base]
use = egg:opensipkd_base use = egg:opensipkd_base
reload_templates = true reload_templates = true
pyramid.debug_all = true pyramid.debug_all = true
pyramid.debug_authorization = false pyramid.debug_authorization = false
pyramid.debug_notfound = true pyramid.debug_notfound = true
pyramid.debug_routematch = true pyramid.debug_routematch = true
pyramid.debug_templates = true pyramid.debug_templates = true
default_locale_name = id default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
;pbb.url = oracle+oracledb://pbb:A@10.8.50.62:1521/simpbb session.url = postgresql://aagusti:a@localhost:5432/demo2
pbb.url = oracle://pbb:A@10.8.50.62:1521/simpbb
lib_dir = C:\app\instantclient_11_2 pyramid.includes =
temp_dir = C:\tmp pyramid_tm
pbb_pemda = 32.79 pyramid_beaker
allow_register = true pyramid_chameleon
pyramid.includes = pyramid_debugtoolbar
pyramid_tm pyramid_rpc.jsonrpc
pyramid_beaker
pyramid_chameleon
pyramid_debugtoolbar session.type = ext:database
pyramid_rpc.jsonrpc session.secret = s0s3cr3ts
opensipkd.tools session.cookie_expires = true
opensipkd.pjdl.models session.key = WhatEver
opensipkd.pjdl.apps session.timeout = 3000
opensipkd.bphtb.models session.lock_dir = %(here)s/tmp
opensipkd.bphtb.apps timezone = Asia/Jakarta
pjdl_invoice_sspd=99 ;localization = id_ID.UTF-8
pjdl_invoice_sptpd=1 #localization = Indonesian_indonesia.1252
pjdl_invoice_stpd=False localization = English_Australia.1252
pjdl_report_files=False #Isikan daftar file-report jika bukan default
# Base Configuration
devel = true temp_files = C:\tmp
session.type = ext:database partner_doc = C:\\tmp\\docs\\partner\\
session.secret = s0s3cr3ts # Registrasi User
session.cookie_expires = true allow_register = 1
session.key = WhatEver reg_form =
session.url = postgresql://aagusti:a@localhost:5433/magelang reg_idcard = 1
session.timeout = 3000 reg_captcha = 1
session.lock_dir = %(here)s/tmp reg_verify = 1
;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt
timezone = Asia/Jakarta ;reg_form =
;localization = id_ID.UTF-8 login_tpl =
#localization = Indonesian_indonesia.1252 login_captcha = 1
localization = English_Australia.1252
;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt
;static_files = %(here)s/../files
;captcha_files = /tmp/captcha ;static_files = %(here)s/../files
;company = Opensipkd ;captcha_files = /tmp/captcha
;ibukota = Bekasi ;company = Opensipkd
;departement = IT ;ibukota = Bekasi
;address_1 = Jalan.... ;departement = IT
;address_2 = Bekasi ... ;address_1 = Jalan....
; ;address_2 = Bekasi ...
;center.phone = 021123456789 ;
;center.mobile = 081311045668 ;center.phone = 021123456789
;center.email = aa.gustiana@gmail.com ;center.mobile = 081311045668
;center.email_password = ;center.email = aa.gustiana@gmail.com
;center.smtp_server = ;center.email_password =
; ;center.smtp_server =
;#_host = http://localhost:5433/demo2 ;
; ;#_host = http://localhost:5433/demo2
unoconv_py = C:\Program Files\LibreOffice\program\python.exe ;
unoconv_bin = C:\product\venv-lates\Scripts\unoconv ;unoconv_py = C:\Program Files\LibreOffice\program\python.exe
; ;unoconv_bin = C:\product\venv-lates\Scripts\unoconv
;modules = ;
menus = login:Login ;modules =
pjdl:PJDL menus = login:Login
bphtb:BPHTB ; pjdl:PJDL
five:Five ; bphtb:BPHTB
;app_name = GAJI ASN ; five:Five
;app_name = GAJI ASN
;change_unit = False
;departemen_chg_id = 3 ;change_unit = False
;departemen_chg_id = 3
# Registrasi User
captcha_files = /tmp/captcha
reg_captcha = 0
;reg_idcard = 1 # digunakan jika akan menggunakan form registrasi sendiri
reg_verify = 1
reg_form = ; PROXY
;login_tpl = ;trusted_proxy_headers = "forwarded x-forwarded-for x-forwarded-host x-forwarded-proto x-forwarded-port"
;url_prefix='/wsgi'
# digunakan jika akan menggunakan form registrasi sendiri
;
; PROXY ;[composite:main]
;trusted_proxy_headers = "forwarded x-forwarded-for x-forwarded-host x-forwarded-proto x-forwarded-port" ;use = egg:rutter#urlmap
;url_prefix='/wsgi' ;/ = opensipkd_base
;/wsgi/ = opensipkd_base
;
;[composite:main]
;use = egg:rutter#urlmap ;[filter:proxy-prefix]
;/ = opensipkd_base ;use = egg:PasteDeploy#prefix
;/wsgi/ = opensipkd_base ;prefix = /wsgi
;
;[pipeline:main]
;[filter:proxy-prefix] ;pipeline =
;use = egg:PasteDeploy#prefix ; proxy-prefix
;prefix = /wsgi ; opensipkd_base
;
;[pipeline:main]
;pipeline = [server:main]
; proxy-prefix use = egg:waitress#main
; opensipkd_base host = 0.0.0.0
port = 6543
[server:main] # Begin logging configuration
use = egg:waitress#main
host = 0.0.0.0 [loggers]
port = 6543 keys = root, opensipkd, sqlalchemy
# Begin logging configuration [handlers]
keys = console
[loggers] #, filelog, tabel
keys = root, opensipkd, sqlalchemy
[formatters]
[handlers] keys = generic
keys = console
#, filelog, tabel [logger_root]
level = WARN
[formatters] handlers = console
keys = generic #, filelog, tabel
[logger_root] [logger_opensipkd]
level = WARN level = DEBUG
handlers = console handlers =
#, filelog, tabel qualname = opensipkd
[logger_opensipkd] [logger_sqlalchemy]
level = DEBUG level = WARN
handlers = handlers =
qualname = opensipkd qualname = sqlalchemy.engine
# "level = INFO" logs SQL queries.
[logger_sqlalchemy] # "level = DEBUG" logs SQL queries and results.
level = WARN # "level = WARN" logs neither. (Recommended for production systems.)
handlers =
qualname = sqlalchemy.engine [handler_filelog]
# "level = INFO" logs SQL queries. class = FileHandler
# "level = DEBUG" logs SQL queries and results. args = ('log_file_location','a')
# "level = WARN" logs neither. (Recommended for production systems.) level = INFO
formatter = generic
[handler_filelog]
class = FileHandler
args = ('log_file_location','a') [handler_console]
level = INFO class = StreamHandler
formatter = generic args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_console]
class = StreamHandler [handler_tabel]
args = (sys.stderr,) class = opensipkd.base.handlers.SQLAlchemyHandler
level = NOTSET args = ()
formatter = generic level = WARN
formatter = generic
[handler_tabel]
class = opensipkd.base.handlers.SQLAlchemyHandler [formatter_generic]
args = () format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
level = WARN
formatter = generic # End logging configuration
[formatter_generic] [alembic_ziggurat]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s script_location = ziggurat_foundations:migrations
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[alembic_ziggurat]
script_location = ziggurat_foundations:migrations [alembic_base]
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang script_location = opensipkd.base.scripts:alembic
# End logging configuration sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[alembic_base] [pytest]
script_location = opensipkd.base:alembic filterwarnings =
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang error
ignore::UserWarning
[alembic_models]
script_location = opensipkd.models:alembic
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang
[alembic_pjdl]
script_location = opensipkd.pjdl.models:alembic
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang
[pytest]
filterwarnings =
error
ignore::UserWarning
ignore:function ham\(\) is deprecated:DeprecationWarning ignore:function ham\(\) is deprecated:DeprecationWarning
\ No newline at end of file \ No newline at end of file
###
# app configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
###
[app:main]
;[app:opensipkd_base]
use = egg:opensipkd_base
reload_templates = true
pyramid.debug_all = true
pyramid.debug_authorization = false
pyramid.debug_notfound = true
pyramid.debug_routematch = true
pyramid.debug_templates = true
default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
session.url = postgresql://aagusti:a@localhost:5433/demo2
temp_dir = C:\tmp
allow_register = true
pyramid.includes =
pyramid_tm
pyramid_beaker
pyramid_chameleon
pyramid_debugtoolbar
pyramid_rpc.jsonrpc
session.type = ext:database
session.secret = s0s3cr3ts
session.cookie_expires = true
session.key = WhatEver
session.timeout = 3000
session.lock_dir = %(here)s/tmp
timezone = Asia/Jakarta
;localization = id_ID.UTF-8
#localization = Indonesian_indonesia.1252
localization = English_Australia.1252
;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt
;static_files = %(here)s/../files
;captcha_files = /tmp/captcha
;company = Opensipkd
;ibukota = Bekasi
;departement = IT
;address_1 = Jalan....
;address_2 = Bekasi ...
;
;center.phone = 021123456789
;center.mobile = 081311045668
;center.email = aa.gustiana@gmail.com
;center.email_password =
;center.smtp_server =
;
;#_host = http://localhost:5433/demo2
;
;unoconv_py = C:\Program Files\LibreOffice\program\python.exe
;unoconv_bin = C:\product\venv-lates\Scripts\unoconv
;
;modules =
menus = login:Login
; pjdl:PJDL
; bphtb:BPHTB
; five:Five
;app_name = GAJI ASN
;change_unit = False
;departemen_chg_id = 3
# Registrasi User
;captcha_files = /tmp/captcha
;reg_captcha = 0
;reg_idcard = 1
;reg_verify = 1
;reg_form =
;login_tpl =
# digunakan jika akan menggunakan form registrasi sendiri
; PROXY
;trusted_proxy_headers = "forwarded x-forwarded-for x-forwarded-host x-forwarded-proto x-forwarded-port"
;url_prefix='/wsgi'
;
;[composite:main]
;use = egg:rutter#urlmap
;/ = opensipkd_base
;/wsgi/ = opensipkd_base
;[filter:proxy-prefix]
;use = egg:PasteDeploy#prefix
;prefix = /wsgi
;
;[pipeline:main]
;pipeline =
; proxy-prefix
; opensipkd_base
[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543
# Begin logging configuration
[loggers]
keys = root, opensipkd, sqlalchemy
[handlers]
keys = console
#, filelog, tabel
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
#, filelog, tabel
[logger_opensipkd]
level = DEBUG
handlers =
qualname = opensipkd
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
# "level = INFO" logs SQL queries.
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither. (Recommended for production systems.)
[handler_filelog]
class = FileHandler
args = ('log_file_location','a')
level = INFO
formatter = generic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[handler_tabel]
class = opensipkd.base.handlers.SQLAlchemyHandler
args = ()
level = WARN
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
# End logging configuration
[alembic_ziggurat]
script_location = ziggurat_foundations:migrations
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[alembic_base]
script_location = opensipkd.base:alembic
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demo2
[pytest]
filterwarnings =
error
ignore::UserWarning
ignore:function ham\(\) is deprecated:DeprecationWarning
\ No newline at end of file \ No newline at end of file
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
\ No newline at end of file \ No newline at end of file
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
"""add partner_id to user
Revision ID: 044041bb09ef
Revises: 37ca8f816946
Create Date: 2021-12-14 15:35:58.361667
"""
# revision identifiers, used by Alembic.
revision = '044041bb09ef'
down_revision = '37ca8f816946'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
pass
def downgrade():
pass
"""add_route_type
Revision ID: 23f0ecac4377
Revises: 8ad1f7810384
Create Date: 2020-11-30 23:02:43.713034
"""
# revision identifiers, used by Alembic.
revision = '23f0ecac4377'
down_revision = '8ad1f7810384'
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('routes', 'type'):
op.add_column('routes', sa.Column('type', sa.Integer, default=0))
if not helpers.table_has_column('routes', 'app_id'):
op.add_column('routes', sa.Column('app_id', sa.Integer, default=0))
def downgrade():
pass
"""alter users date fields with time zone
Revision ID: 35f453a443
Revises:
Create Date: 2015-02-06 15:59:42.859656
"""
# revision identifiers, used by Alembic.
revision = '35f453a443'
down_revision = None
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
op.alter_column('users', 'last_login_date',
type_=sa.DateTime(timezone=True),
existing_type=sa.DateTime(timezone=False))
op.alter_column('users', 'registered_date',
type_=sa.DateTime(timezone=True),
existing_type=sa.DateTime(timezone=False))
op.alter_column('users', 'security_code_date',
type_=sa.DateTime(timezone=True),
existing_type=sa.DateTime(timezone=False))
def downgrade():
pass
"""add partner_id to user
Revision ID: 37ca8f816946
Revises: 72dd62d47460
Create Date: 2021-12-01 16:28:19.147741
"""
# revision identifiers, used by Alembic.
revision = '37ca8f816946'
down_revision = '72dd62d47460'
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('users', 'partner_id'):
op.add_column('users', sa.Column('partner_id', sa.Integer))
if not helpers.table_has_column('users', 'company_id'):
op.add_column('users', sa.Column('company_id', sa.Integer))
if not helpers.table_has_column('partner', 'company_id'):
op.add_column('partner', sa.Column('company_id', sa.Integer))
def downgrade():
pass
"""partner_rt_rw
Revision ID: 56a7d9c8b0c6
Revises: 91f07d138fe9
Create Date: 2022-08-21 21:32:37.318361
"""
# revision identifiers, used by Alembic.
revision = '56a7d9c8b0c6'
down_revision = '91f07d138fe9'
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', 'rt'):
op.add_column('partner', sa.Column('rt', sa.String(3)))
if not helpers.table_has_column('partner', 'rw'):
op.add_column('partner', sa.Column('rw', sa.String(3)))
if not helpers.table_has_column('partner', 'tempat_lahir'):
op.add_column('partner', sa.Column('tempat_lahir', sa.String(128)))
if not helpers.table_has_column('partner', 'tgl_lahir'):
op.add_column('partner',
sa.Column('tgl_lahir', sa.DateTime(timezone=False)))
if not helpers.table_has_column('partner', 'jenis_kelamin'):
op.add_column('partner', sa.Column('jenis_kelamin', sa.String(1)))
if not helpers.table_has_column('partner', 'gol_darah'):
op.add_column('partner', sa.Column('gol_darah', sa.String(2)))
if not helpers.table_has_column('partner', 'agama'):
op.add_column('partner', sa.Column('agama', sa.String(32)))
if not helpers.table_has_column('partner', 'perkawinan'):
op.add_column('partner', sa.Column('perkawinan', sa.String(2)))
if not helpers.table_has_column('partner', 'pekerjaan'):
op.add_column('partner', sa.Column('pekerjaan', sa.String(32)))
if not helpers.table_has_column('partner', 'kewarganegaraan'):
op.add_column('partner', sa.Column('kewarganegaraan', sa.String(10)))
def downgrade():
pass
"""menus add valu and action
Revision ID: 671617e55c56
Revises: f95c10a7ae98
Create Date: 2022-12-27 17:59:55.766347
"""
# revision identifiers, used by Alembic.
revision = '671617e55c56'
down_revision = 'f95c10a7ae98'
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('menus', 'valu'):
op.add_column('menus',
sa.Column('valu', sa.String(256)))
if not helpers.table_has_column('menus', 'meth'):
op.add_column('menus',
sa.Column('meth', sa.String(256)))
if not helpers.table_has_column('menus', 'page_typ'):
op.add_column('menus',
sa.Column('page_typ', sa.String(256)))
def downgrade():
pass
"""change_route_status_null
Revision ID: 72dd62d47460
Revises: 23f0ecac4377
Create Date: 2020-11-30 23:08:14.118795
"""
# revision identifiers, used by Alembic.
revision = '72dd62d47460'
down_revision = '23f0ecac4377'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
pass
# op.alter_column('routes', 'status', nullable=False)
def downgrade():
pass
"""Add Wilayah to Partner
Revision ID: 86c1b4a1da16
Revises: 044041bb09ef
Create Date: 2022-04-14 23:50:08.268569
"""
# revision identifiers, used by Alembic.
revision = '86c1b4a1da16'
down_revision = '044041bb09ef'
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', 'provinsi_id'):
op.add_column('partner', sa.Column('provinsi_id', sa.Integer, default=0))
if not helpers.table_has_column('partner', 'dati2_id'):
op.add_column('partner', sa.Column('dati2_id', sa.Integer, default=0))
if not helpers.table_has_column('partner', 'kecamatan_id'):
op.add_column('partner', sa.Column('kecamatan_id', sa.Integer, default=0))
if not helpers.table_has_column('partner', 'desa_id'):
op.add_column('partner', sa.Column('desa_id', sa.Integer, default=0))
if not helpers.table_has_column('partner', 'company_id'):
op.add_column('partner', sa.Column('company_id', sa.Integer, default=0))
def downgrade():
pass
"""add_route_updated
Revision ID: 8ad1f7810384
Revises: da566162d3fb
Create Date: 2020-11-30 22:58:34.288664
"""
# revision identifiers, used by Alembic.
revision = '8ad1f7810384'
down_revision = 'da566162d3fb'
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('routes', 'updated'):
op.add_column('routes', sa.Column('updated', sa.DateTime, default=0))
if not helpers.table_has_column('routes', 'create_uid'):
op.add_column('routes', sa.Column('create_uid', sa.Integer, default=0))
if not helpers.table_has_column('routes', 'update_uid'):
op.add_column('routes', sa.Column('update_uid', sa.Integer, default=0))
def downgrade():
pass
"""penambahan user device expired
Revision ID: 8e7057155823
Revises: 86c1b4a1da16
Create Date: 2022-07-08 14:58:39.378811
"""
# revision identifiers, used by Alembic.
revision = '8e7057155823'
down_revision = '86c1b4a1da16'
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('user_device', 'expired'):
op.add_column('user_device', sa.Column('expired', sa.DateTime(timezone=True)))
op.alter_column('user_device', sa.Column('expired', sa.DateTime(timezone=True)))
if not helpers.table_has_column('routes', 'create_uid'):
op.add_column('routes', sa.Column('create_uid', sa.Integer, default=0))
if not helpers.table_has_column('routes', 'update_uid'):
op.add_column('routes', sa.Column('update_uid', sa.Integer, default=0))
def downgrade():
pass
"""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
"""add app_id to route
Revision ID: c35162ddf851
Revises: e628a2dc0b23
Create Date: 2020-11-23 14:41:33.244797
"""
# revision identifiers, used by Alembic.
revision = 'c35162ddf851'
down_revision = 'e628a2dc0b23'
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('routes', 'app_id'):
op.add_column('routes', sa.Column('app_id', sa.SmallInteger, default=0))
def downgrade():
pass
"""add_route_creted
Revision ID: da566162d3fb
Revises: c35162ddf851
Create Date: 2020-11-30 22:28:10.604024
"""
# revision identifiers, used by Alembic.
revision = 'da566162d3fb'
down_revision = 'c35162ddf851'
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('routes', 'created'):
op.add_column('routes', sa.Column('created', sa.DateTime, default=0))
def downgrade():
pass
"""add users api_key
Revision ID: e628a2dc0b23
Revises: 35f453a443
Create Date: 2018-12-10 19:29:52.211689
"""
# revision identifiers, used by Alembic.
revision = 'e628a2dc0b23'
down_revision = '35f453a443'
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('users', 'api_key'):
op.add_column('users', sa.Column('api_key', sa.String(256)))
def downgrade():
pass
"""Add nip to partner
Revision ID: f95c10a7ae98
Revises: 56a7d9c8b0c6
Create Date: 2022-08-22 18:17:00.798094
"""
# revision identifiers, used by Alembic.
revision = 'f95c10a7ae98'
down_revision = '56a7d9c8b0c6'
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', 'nip'):
op.add_column('partner', sa.Column('nip', sa.String(32)))
if not helpers.table_has_column('partner', 'npwp'):
op.add_column('partner', sa.Column('npwp', sa.String(32)))
def downgrade():
pass
import logging
import traceback
from datetime import datetime
from hashlib import md5
import transaction
from opensipkd.models.handlers import (
Log,
LogDBSession,
)
class SQLAlchemyHandler(logging.Handler):
# A very basic logger that commits a LogRecord to the SQL Db
def emit(self, record):
trace = None
exc = record.__dict__['exc_info']
if exc:
trace = traceback.format_exc()
if 'waitress' in record.__dict__['name']:
return
t = datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f')
level = record.__dict__['levelname']
logger = record.__dict__['name']
msg = record.__dict__['msg']
line_id = f'{t} {level} {msg}'
line_id = md5(line_id.encode('utf-8'))
line_id = line_id.hexdigest()
log = Log(
line_id=line_id, logger=logger, level=level, trace=trace,
msg=msg)
with transaction.manager:
LogDBSession.add(log)
#
# Indonesian translations for PACKAGE package
# This file is distributed under the same license as the PACKAGE package.
# <aagusti@desktop-pa2epik.localdomain>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2022-07-30 20:57+0700\n"
"PO-Revision-Date: 2022-07-30 20:58+0700\n"
"Last-Translator: <aagusti@desktop-pa2epik.localdomain>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Lingua 4.15.0\n"
#. Default: User Name
#: opensipkd/base/views/user.py:28
msgid "user-name"
msgstr "Nama User"
#: opensipkd/base/views/user.py:50
msgid "Active"
msgstr ""
#: opensipkd/base/views/user.py:51
msgid "Archived"
msgstr ""
#: opensipkd/base/views/user.py:55
msgid "Hapus"
msgstr ""
#: opensipkd/base/views/user.py:58
msgid "Tidak ada"
msgstr ""
#: opensipkd/base/views/user.py:59
msgid "Buatkan"
msgstr ""
#. Default: ${username} berhasil ditambahkan.
#: opensipkd/base/views/user.py:129
msgid "user-added-with-password"
msgstr ""
#. Default: ${email} berhasil ditambahkan dan email untuk ubah kata kunci sudah
#. dikirim.
#: opensipkd/base/views/user.py:137
msgid "user-added"
msgstr ""
#. Default: User ${email} ID ${uid} has been deleted
#: opensipkd/base/views/user.py:199
msgid "user-deleted"
msgstr ""
#. Default: Email ${email} already used by user ID ${uid}
#: opensipkd/base/views/user.py:250
msgid "email-already-used"
msgstr ""
#: opensipkd/base/views/user.py:257
msgid "Invalid email format"
msgstr ""
#. Default: Only A-Z a-z, 0-9, and - characters are allowed
#: opensipkd/base/views/user.py:277
msgid "username-only-contain"
msgstr ""
#. Default: Only A-Z a-z or 0-9 at the start and end
#: opensipkd/base/views/user.py:283
msgid "username-first-end-alphanumeric"
msgstr ""
#. Default: Username ${username} already used by ID ${uid}
#: opensipkd/base/views/user.py:293
msgid "username-already-used"
msgstr ""
#: opensipkd/base/views/user.py:325
msgid "Email"
msgstr ""
#: opensipkd/base/views/user.py:327
msgid "Username"
msgstr ""
#: opensipkd/base/views/user.py:330
msgid "Group"
msgstr ""
#: opensipkd/base/views/user.py:332
msgid "API Key"
msgstr ""
#: opensipkd/base/views/user.py:345
msgid "Status"
msgstr ""
#
# Indonesian translations for PACKAGE package
# This file is distributed under the same license as the PACKAGE package.
# <aagusti@desktop-pa2epik.localdomain>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2022-07-30 20:57+0700\n"
"PO-Revision-Date: 2022-07-30 20:58+0700\n"
"Last-Translator: <aagusti@desktop-pa2epik.localdomain>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Lingua 4.15.0\n"
#. Default: User Name
#: opensipkd/base/views/user.py:28
msgid "user-name"
msgstr "Nama User"
#: opensipkd/base/views/user.py:50
msgid "Active"
msgstr ""
#: opensipkd/base/views/user.py:51
msgid "Archived"
msgstr ""
#: opensipkd/base/views/user.py:55
msgid "Hapus"
msgstr ""
#: opensipkd/base/views/user.py:58
msgid "Tidak ada"
msgstr ""
#: opensipkd/base/views/user.py:59
msgid "Buatkan"
msgstr ""
#. Default: ${username} berhasil ditambahkan.
#: opensipkd/base/views/user.py:129
msgid "user-added-with-password"
msgstr ""
#. Default: ${email} berhasil ditambahkan dan email untuk ubah kata kunci sudah
#. dikirim.
#: opensipkd/base/views/user.py:137
msgid "user-added"
msgstr ""
#. Default: User ${email} ID ${uid} has been deleted
#: opensipkd/base/views/user.py:199
msgid "user-deleted"
msgstr ""
#. Default: Email ${email} already used by user ID ${uid}
#: opensipkd/base/views/user.py:250
msgid "email-already-used"
msgstr ""
#: opensipkd/base/views/user.py:257
msgid "Invalid email format"
msgstr ""
#. Default: Only A-Z a-z, 0-9, and - characters are allowed
#: opensipkd/base/views/user.py:277
msgid "username-only-contain"
msgstr ""
#. Default: Only A-Z a-z or 0-9 at the start and end
#: opensipkd/base/views/user.py:283
msgid "username-first-end-alphanumeric"
msgstr ""
#. Default: Username ${username} already used by ID ${uid}
#: opensipkd/base/views/user.py:293
msgid "username-already-used"
msgstr ""
#: opensipkd/base/views/user.py:325
msgid "Email"
msgstr ""
#: opensipkd/base/views/user.py:327
msgid "Username"
msgstr ""
#: opensipkd/base/views/user.py:330
msgid "Group"
msgstr ""
#: opensipkd/base/views/user.py:332
msgid "API Key"
msgstr ""
#: opensipkd/base/views/user.py:345
msgid "Status"
msgstr ""
log = __import__("logging").getLogger(__name__) from .meta import *
log.warning('Use opensipkd.models') from .common import *
from opensipkd.models import * from .base import *
from .users import *
from .wilayah import *
from .partner import *
...@@ -11,7 +11,6 @@ from zope.sqlalchemy import register ...@@ -11,7 +11,6 @@ from zope.sqlalchemy import register
_logging = logging.getLogger(__name__) _logging = logging.getLogger(__name__)
class MySession(Session): class MySession(Session):
def execute(self, clause, params=None, mapper=None, **kw): def execute(self, clause, params=None, mapper=None, **kw):
# Your magic with clause here # Your magic with clause here
...@@ -69,8 +68,7 @@ class CommonModel(object): ...@@ -69,8 +68,7 @@ class CommonModel(object):
def from_dict(self, values, date_format="%d-%m-%Y"): def from_dict(self, values, date_format="%d-%m-%Y"):
for column in self.__table__.columns: for column in self.__table__.columns:
if column.name in values: if column.name in values:
_logging.debug( _logging.debug(f"{column.name}: {column.type}: {values[column.name]}")
f"{column.name}: {column.type}: {values[column.name]}")
if type(column.type) is DateTime and date_format: if type(column.type) is DateTime and date_format:
if values[column.name] and type(values[column.name]) is String: if values[column.name] and type(values[column.name]) is String:
setattr(self, column.name, setattr(self, column.name,
...@@ -112,7 +110,7 @@ class DefaultModel(CommonModel): ...@@ -112,7 +110,7 @@ class DefaultModel(CommonModel):
return query return query
@classmethod @classmethod
def query_from(cls, columns=None, filters=None, db_session=DBSession): def query_from(cls, db_session=DBSession, columns=None, filters=None):
query = db_session.query().select_from(cls) query = db_session.query().select_from(cls)
for c in columns: for c in columns:
query = query.add_columns(c) query = query.add_columns(c)
...@@ -222,4 +220,4 @@ class NamaModel(KodeModel): ...@@ -222,4 +220,4 @@ class NamaModel(KodeModel):
@classmethod @classmethod
def get_list(cls): def get_list(cls):
return cls.query_list().all() return cls.query_list().all()
\ No newline at end of file \ No newline at end of file
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, ForeignKey
from sqlalchemy.orm import relationship, backref
from .base import NamaModel, DefaultModel, DBSession, KodeModel
from .meta import Base
# from .partner import Partner
from .users import User
class Route(Base, NamaModel):
__tablename__ = 'routes'
__table_args__ = {'extend_existing': True}
id = Column(Integer, primary_key=True)
kode = Column(String(128), unique=True)
path = Column(String(256), nullable=False, unique=True)
status = Column(Integer, nullable=False, server_default='1')
type = Column(SmallInteger, nullable=False, server_default='0')
app_id = Column(SmallInteger, nullable=False, server_default='0')
module = Column(String(256))
is_menu = Column(SmallInteger)
parent_id = Column(Integer, ForeignKey("routes.id"))
order_id = Column(Integer)
permission = Column(String(256))
class_view = Column(String(256))
def_func = Column(String(256))
template = Column(String(256))
icon = Column(String(256))
children = relationship(
"Route", backref=backref('parent', remote_side=[id]),
order_by="Route.order_id")
class Parameter(Base, NamaModel):
__tablename__ = 'parameters'
__table_args__ = {'extend_existing': True}
value = Column(String(256), nullable=False)
class Holiday(Base, DefaultModel):
__tablename__ = 'holiday'
tanggal = Column(DateTime)
@classmethod
def query_tanggal(cls, tanggal, db_session=DBSession):
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(timezone=True))
expired = Column(DateTime(timezone=True))
user = relationship(User, backref=backref("devices"))
# class ResCompany(Base, NamaModel):
# __tablename__ = 'company'
# id = Column(Integer, primary_key=True)
# partner_id = Column(Integer, ForeignKey(Partner.id))
# partner = relationship("Partner", backref=backref("company"))
# parent_id = Column(Integer, ForeignKey("company.id"))
# children = relationship("ResCompany")
# parent = relationship(
# "ResCompany", remote_side=[id], primaryjoin="ResCompany.parent_id==ResCompany.id",
# overlaps="children"
# )
\ No newline at end of file \ No newline at end of file
from sqlalchemy import (Column, Integer, String, DateTime, func, )
from sqlalchemy.orm import (scoped_session, sessionmaker, )
from ..models.base import CommonModel
from ..models.meta import Base
factory = sessionmaker(autoflush=True, autocommit=True)
LogDBSession = scoped_session(factory)
class Log(Base, CommonModel):
__tablename__ = 'logs'
id = Column(Integer, primary_key=True) # auto incrementing
line_id = Column(String(32), nullable=False, unique=True)
logger = Column(String) # the name of the logger. (e.g. myapp.views)
level = Column(String) # info, debug, or error?
trace = Column(String) # the full traceback printout
msg = Column(String, nullable=False)
created_at = Column(
DateTime(timezone=True),
nullable=False,
server_default=func.now()) # the current timestamp
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import MetaData
# Recommended naming convention used by Alembic, as various different database
# providers will autogenerate vastly different names making migrations more
# difficult. See: http://alembic.zzzcomputing.com/en/latest/naming.html
NAMING_CONVENTION = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
metadata = MetaData(naming_convention=NAMING_CONVENTION)
Base = declarative_base(metadata=metadata)
from sqlalchemy import (
Column,
Integer,
String,
SmallInteger,
DateTime, ForeignKey
)
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.orm import backref
from .base import NamaModel, StandarModel
from .meta import (Base)
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
class PartnerModel(NamaModel):
idcard = Column(String(256))
status = Column(Integer, default=1)
alamat_1 = Column(String(128))
alamat_2 = Column(String(128))
email = Column(String(40))
phone = Column(String(16))
fax = Column(String(16))
mobile = Column(String(16))
website = Column(String(64))
# pic = Column(String(16))
# pic_mobile = Column(String(16))
# pic_email = Column(String(16))
# pic_jabatan = Column(String(16))
@classmethod
def query_email(cls, email):
return cls.query().filter_by(email=email)
@classmethod
def query_mobile(cls, mobile):
return cls.query().filter_by(mobile=mobile)
class Partner(Base, PartnerModel):
__tablename__ = 'partner'
kelurahan = Column(String(128))
kecamatan = Column(String(128))
kota = Column(String(128))
provinsi = Column(String(128))
is_vendor = Column(SmallInteger, nullable=False, )
is_customer = Column(SmallInteger, nullable=False, )
# bank = Column(String(16))
# bank_accnt = Column(String(16))
# user_id = Column(Integer, ForeignKey(User.id), nullable=True) # referensi ke login
# departemen_id = Column(Integer, ForeignKey(Departemen.id)) # referensi ke default skpd
# users = relationship("User", backref=backref('partner'))
# departemen = relationship('Departemen', backref=backref('partner'))
rt = Column(String(3))
rw = Column(String(3))
tempat_lahir = Column(String(128))
tgl_lahir = Column(DateTime(timezone=False))
jenis_kelamin = Column(String(1))
gol_darah = Column(String(2))
agama = Column(String(32))
perkawinan = Column(String(2))
pekerjaan = Column(String(32))
kewarganegaraan = Column(String(10))
provinsi_id = Column(Integer, ForeignKey(ResProvinsi.id))
dati2_id = Column(Integer, ForeignKey(ResDati2.id))
kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id))
desa_id = Column(Integer, ForeignKey(ResDesa.id))
company_id = Column(Integer)
nip = Column(String(32))
res_provinsi = relationship(
"ResProvinsi", backref=backref('partner'))
res_dati2 = relationship(
"ResDati2", backref=backref('partner'))
res_kecamatan = relationship(
"ResKecamatan", backref=backref('partner'))
res_desa = relationship(
"ResDesa", backref=backref('partner'))
partner_files: Mapped["PartnerFiles"] = relationship(back_populates="partner")
# npwp = Column(String(16))
# npwpd = Column(String(16))
#
# @classmethod
# def query_user_id(cls, user_id):
# return cls.query().filter_by(user_id=user_id)
#
# @classmethod
# def query_user(cls, user):
# return cls.query_user_id(user.id)
@classmethod
def query_identity(cls, ident):
row = cls.query().filter_by(kode=ident).first()
if not row:
row = cls.query().filter_by(email=ident).first()
if not row:
row = cls.query().filter_by(mobile=ident).first()
return row
class PartnerFiles(Base, StandarModel):
__tablename__ = 'partner_files'
partner_id: Mapped[int] = mapped_column(ForeignKey(Partner.id))
file_name: Mapped[str] = mapped_column(String(256))
description: Mapped[str] = mapped_column(String(256), nullable=True)
partner: Mapped["Partner"] = relationship(back_populates="partner_files")
# class PartnerUserModel(Base, DefaultModel):
# __tablename__ = 'partner_user'
# partner_id = Column(Integer, ForeignKey(Partner.id))
# user_id = Column(Integer, ForeignKey(User.id))
\ No newline at end of file \ No newline at end of file
from sqlalchemy import (
Column,
ForeignKey,
String,
SmallInteger,
)
from sqlalchemy.orm import relationship, backref
from . import TABLE_ARGS
from .common import (NamaModel)
from .meta import Base
kategori_provinsi = (
("provinsi", "Provinsi"),
("provinsi administratif", "Provinsi Administratif"),
)
class ResProvinsi(Base, NamaModel):
__tablename__ = 'res_provinsi'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
kategori_dati2 = (
("kota", "Kota"),
("kabupaten", "Kabupaten"),
("kota administratif", "Kota Administratif"),
("kabupaten administratif", "Kabupaten Administratif"),
)
class ResDati2(Base, NamaModel):
__tablename__ = 'res_dati2'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
provinsi_id = Column(SmallInteger, ForeignKey(ResProvinsi.id))
provinsi = relationship(ResProvinsi, backref=backref("dati2"))
@classmethod
def get_list(cls, provinsi_id):
qry = cls.query_list()
if provinsi_id:
qry = qry.filter(cls.provinsi_id == provinsi_id)
return qry.all()
class ResKecamatan(Base, NamaModel):
__tablename__ = 'res_kecamatan'
__table_args__ = (TABLE_ARGS,)
ibu_kota = Column(String(64))
dati2_id = Column(SmallInteger, ForeignKey(ResDati2.id))
dati2 = relationship(ResDati2, backref=backref("kecamatan"))
@classmethod
def get_list(cls, dati2_id=None):
qry = cls.query_list()
if dati2_id:
qry = qry.filter(cls.dati2_id == dati2_id)
return qry.all()
kategori_desa = (
("desa", "Desa"),
("kelurahan", "Kelurahan")
)
class ResDesa(Base, NamaModel):
__tablename__ = 'res_desa'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
kecamatan_id = Column(SmallInteger, ForeignKey(ResKecamatan.id))
kecamatan = relationship(ResKecamatan, backref=backref("desa"))
@classmethod
def get_list(cls, kecamatan_id=None):
qry = cls.query_list()
if kecamatan_id:
qry = qry.filter(cls.kecamatan_id == kecamatan_id)
return qry.all()
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document>
<template pagesize="21cm, 29.7cm">
<pageTemplate id="page1">
<pageGraphics>
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="10.5cm" y="27.5cm">PEMERINTAH {company}</drawCenteredString >
<setFont name="Helvetica-Bold" size="10"/>
<drawCenteredString x="10.5cm" y="26.9cm">DAFTAR SKPD {departement}</drawCenteredString>
<!-- <setFont name="Helvetica-Bold" size="8"/>
<drawCenteredString x="10.5cm" y="26.7cm">{alamat}</drawCenteredString > -->
<image file="{logo}" preserveAspectRatio="1" x="2cm" y="749" width="50" height="50"/>
<image file="{line}" preserveAspectRatio="0" x="2cm" y="740" width="17cm" height="10"/>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="24cm"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="title"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="5"
alignment="center"/>
<paraStyle name="tableTitleCenter"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="10"
alignment="center"/>
<paraStyle name="tableBody"
fontName="Helvetica"
fontSize="8"
spaceAfter="5"/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<blockTableStyle id="table">
<blockFont name="Helvetica" size="10"/>
<blockFont name="Helvetica-Bold" size="10" start="2,0" stop="2,0"/>
<lineStyle kind="GRID" colorName="black"/>
<!-- <lineStyle kind="OUTLINE" colorName="black" thickness="2"/> -->
<!-- <blockBackground colorName="pink" start="0,0" stop="-1,0"/> -->
<blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
</blockTableStyle>
<paraStyle name="h1" fontName="Helvetica-BoldOblique" fontSize="14" leading="36" spaceBefore="12"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="10" leading="10" />
<paraStyle name="spaced" fontName="Helvetica" fontSize="10" leading="12" spaceBefore="12" spaceAfter="12"/>
<paraStyle name="intro" fontName="Helvetica" fontSize="12" leading="12" spaceAfter="12"/>
</stylesheet>
<story>
<setNextTemplate name="page1"/>
<!-- <para style="title">DAFTAR SKPD UNIT KERJA</para> -->
<blockTable colWidths="2cm,13cm,2.5cm" style="table" >
<tr>
<td><para style="tableTitleCenter">Kode</para></td>
<td><para style="tableTitleCenter">Uraian</para></td>
<td><para style="tableTitleCenter">Status</para></td>
</tr>
{rows}
</blockTable>
<namedString id="last-page"><pageNumber/></namedString>
</story>
</document>
<tr>
<td><para style="tableBody">{kode}</para></td>
<td><para style="tableBody">{nama}</para></td>
<td><para style="tableBody">{status}</para></td>
</tr>
header ="""
JENIS GAJI : {jenis_gaji}
BULAN : {bulan}
KODE UNIT : {unit_kd}
UNIT KERJA : {unit_nm}
+----+------------------------------+-----+---------------------------------+---------------------+---------------+------+
| | | STA | P E N G H A S I L A N | P O T O N G A N | | |
| | |KAWIN|-----------+----------+----------+----------+----------| | |
| | NAMA | |GAPOK |-T.UMUM |-T.PPH |-PFK.BULOG|-I.ASKES | JUMLAH | |
|NO. | NIP.PEGAWAI | JML |TUNJ. KEL |-T.STRUK |-I.ASKES |-IWP. |-I.JKK/JKM| PENGHASILAN |TANDA |
|URUT| STATUS PEG. (PNS/CPNS) |ANAK/|a.IST/SUAMI|-T.FUNGS |-I.JKK/JKM|-TAPERUM |-LAIN-LAIN| BERSIH YANG |TANGAN|
| | |JIWA |b.ANAK |-T.TMBH.UM|-P BULAT |-PPH.PS.21| | DIBAYARKAN | |
| | | | |-T.BERAS |JML.KOTOR |-SEWA RMH |JML.POTNGN| | |
|----+------------------------------+-----+-----------+----------+----------+----------+----------+---------------+------|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|----+------------------------------+-----+-----------+----------+----------+----------+----------+---------------+------|
"""
+----+------------------------------+-----+---------------------------------+---------------------+---------------+------+
|{no}|{nama} | |GAPOK |-T.UMUM |-T.PPH |-PFK.BULOG|-I.ASKES | JUMLAH | |
| |{nip} {tgl_lahir} | JML |TUNJ. KEL |-T.STRUK |-I.ASKES |-IWP. |-I.JKK/JKM| PENGHASILAN |TANDA |
| |{peg_st}/{peg_kd}.{peg_tm} | NAK/|a.IST/SUAMI|-T.FUNGS |-I.JKK/JKM|-TAPERUM |-LAIN-LAIN| BERSIH YANG |TANGAN|
| |{gol_kd} - {gol_nm} |JIWA |b.ANAK |-T.TMBH.UM|-P BULAT |-PPH.PS.21| | DIBAYARKAN | |
| |MKG: {mk} Thn,{th} Bln.{bl} | | |-T.BERAS |JML.KOTOR |-SEWA RMH |JML.POTNGN| | |
|----+------------------------------+-----+-----------+----------+----------+----------+----------+---------------+------|
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document>
<template pagesize="21cm, 29.7cm">
<pageTemplate id="page1">
<pageGraphics>
<setFont name="Helvetica-Bold" size="14"/>
<!-- <drawString x="2cm" y="27.4cm">PEMERINTAH {company}</drawString > -->
<drawCenteredString x="11.5cm" y="27.7cm">PEMERINTAH {company}</drawCenteredString >
<!-- <drawRightString x="19cm" y="27.7cm">PEMERINTAH {company}</drawRightString > -->
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="11.5cm" y="27.2cm">{departement}</drawCenteredString>
<setFont name="Helvetica-Bold" size="8"/>
<drawCenteredString x="11.5cm" y="26.7cm">{address}</drawCenteredString >
<image file="{logo}" preserveAspectRatio="1" x="2cm" y="749" width="50" height="50"/>
<image file="{line}" preserveAspectRatio="0" x="2cm" y="740" width="17cm" height="10"/>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="24cm"/>
</pageTemplate>
<pageTemplate id="page2">
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="27.7cm">{waktu}</drawString>
<drawRightString x="19cm" y="27.7cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="26cm"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="title1"
fontName="Helvetica-Bold"
fontSize="16"
spaceAfter="16"
align="center"/>
<paraStyle name="title2"
fontName="Helvetica-Bold"
fontSize="14"
spaceAfter="10"/>
<paraStyle name="heading1"
fontName="Helvetica-Bold"
fontSize="12"
spaceAfter="12"/>
<paraStyle name="tableTitle"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="10"/>
<paraStyle name="tableBody"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<blockTableStyle id="table">
<blockValign start="0,0" stop="-1,-1" value="TOP"/>
<blockAlignment value="left" start="0,0" stop="0,-1"/>
<blockAlignment value="centre" start="2,0" stop="2,-1"/>
<blockFont name="Helvetica" size="10"/>
<blockFont name="Helvetica-Bold" size="10" start="2,0" stop="2,0"/>
<lineStyle kind="GRID" colorName="black"/>
<!-- <lineStyle kind="OUTLINE" colorName="black" thickness="2"/> -->
<!-- <blockBackground colorName="pink" start="0,0" stop="-1,0"/> -->
<blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
</blockTableStyle>
<paraStyle name="h1" fontName="Helvetica-BoldOblique" fontSize="14" leading="36" spaceBefore="12"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="10" leading="10" />
<paraStyle name="spaced" fontName="Helvetica" fontSize="10" leading="12" spaceBefore="12" spaceAfter="12"/>
<paraStyle name="intro" fontName="Helvetica" fontSize="12" leading="12" spaceAfter="12"/>
</stylesheet>
<story>
<setNextTemplate name="page2"/>
<para style="heading1">DAFTAR GROUP APLIKASI</para>
<blockTable colWidths="4cm,10cm,3cm" style="table" repeatRows="1">
<tr>
<td><para style="tableTitle">Group</para></td>
<td><para style="tableTitle">Deskripsi</para></td>
<td>Anggota</td>
</tr>
{rows}
</blockTable>
<namedString id="last-page"><pageNumber/></namedString>
</story>
</document>
<tr>
<td style="tableBody">{group_name}</td>
<td style="tableBody"><para style="tableBody">{description}</para></td>
<td style="tableBody">{member_count}</td>
</tr>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document>
<template pagesize="21cm, 29.7cm">
<pageTemplate id="page1">
<pageGraphics>
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="10.5cm" y="27.5cm">PEMERINTAH {company}</drawCenteredString >
<setFont name="Helvetica-Bold" size="10"/>
<drawCenteredString x="10.5cm" y="26.9cm">DAFTAR PARTNER</drawCenteredString>
<!-- <setFont name="Helvetica-Bold" size="8"/>
<drawCenteredString x="10.5cm" y="26.7cm">{alamat}</drawCenteredString > -->
<image file="{logo}" preserveAspectRatio="1" x="2cm" y="749" width="50" height="50"/>
<image file="{line}" preserveAspectRatio="0" x="2cm" y="740" width="17cm" height="10"/>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="24cm"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="title"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="5"
alignment="center"/>
<paraStyle name="tableTitleCenter"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="10"
alignment="center"/>
<paraStyle name="tableBody"
fontName="Helvetica"
fontSize="8"
spaceAfter="5"/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<blockTableStyle id="table">
<blockValign start="0,0" stop="-1,-1" value="middle"/>
<blockFont name="Helvetica" size="10"/>
<blockFont name="Helvetica-Bold" size="10" start="2,0" stop="2,0"/>
<lineStyle kind="GRID" colorName="black"/>
<!-- <lineStyle kind="OUTLINE" colorName="black" thickness="2"/> -->
<!-- <blockBackground colorName="pink" start="0,0" stop="-1,0"/> -->
<blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
</blockTableStyle>
<paraStyle name="h1" fontName="Helvetica-BoldOblique" fontSize="14" leading="36" spaceBefore="12"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="10" leading="10" />
<paraStyle name="spaced" fontName="Helvetica" fontSize="10" leading="12" spaceBefore="12" spaceAfter="12"/>
<paraStyle name="intro" fontName="Helvetica" fontSize="12" leading="12" spaceAfter="12"/>
</stylesheet>
<story>
<setNextTemplate name="page1"/>
<!-- <para style="title">DAFTAR PARTNER</para> -->
<blockTable colWidths="4cm,6cm,2.3cm,2.3cm,2.3cm" style="table" >
<tr>
<td><para style="tableTitleCenter">Kode</para></td>
<td><para style="tableTitleCenter">Nama Partner</para></td>
<td><para style="tableTitleCenter">Vendor</para></td>
<td><para style="tableTitleCenter">Customer</para></td>
<td><para style="tableTitleCenter">Status</para></td>
</tr>
{rows}
</blockTable>
<namedString id="last-page"><pageNumber/></namedString>
</story>
</document>
<tr>
<td vAlign="top"><para style="tableBody">{kode}</para></td>
<td vAlign="top"><para style="tableBody">{nama}</para></td>
<td vAlign="top"><para style="tableBody">{vendor}</para></td>
<td vAlign="top"><para style="tableBody">{is_customer}</para></td>
<td vAlign="top"><para style="tableBody">{status}</para></td>
</tr>
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document>
<template pagesize="21cm, 29.7cm">
<pageTemplate id="page1">
<pageGraphics>
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="10.5cm" y="27.5cm">PEMERINTAH {company}</drawCenteredString >
<setFont name="Helvetica-Bold" size="10"/>
<drawCenteredString x="10.5cm" y="26.9cm">DAFTAR PERMISSION</drawCenteredString>
<!-- <setFont name="Helvetica-Bold" size="8"/>
<drawCenteredString x="10.5cm" y="26.7cm">{alamat}</drawCenteredString > -->
<image file="{logo}" preserveAspectRatio="1" x="2cm" y="749" width="50" height="50"/>
<image file="{line}" preserveAspectRatio="0" x="2cm" y="740" width="17cm" height="10"/>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="24cm"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="title"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="5"
alignment="center"/>
<paraStyle name="tableTitleCenter"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="10"
alignment="center"/>
<paraStyle name="tableBody"
fontName="Helvetica"
fontSize="8"
spaceAfter="5"/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<blockTableStyle id="table">
<blockValign start="0,0" stop="-1,-1" value="middle"/>
<blockFont name="Helvetica" size="10"/>
<blockFont name="Helvetica-Bold" size="10" start="2,0" stop="2,0"/>
<lineStyle kind="GRID" colorName="black"/>
<!-- <lineStyle kind="OUTLINE" colorName="black" thickness="2"/> -->
<!-- <blockBackground colorName="pink" start="0,0" stop="-1,0"/> -->
<blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
</blockTableStyle>
<paraStyle name="h1" fontName="Helvetica-BoldOblique" fontSize="14" leading="36" spaceBefore="12"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="10" leading="10" />
<paraStyle name="spaced" fontName="Helvetica" fontSize="10" leading="12" spaceBefore="12" spaceAfter="12"/>
<paraStyle name="intro" fontName="Helvetica" fontSize="12" leading="12" spaceAfter="12"/>
</stylesheet>
<story>
<setNextTemplate name="page1"/>
<!-- <para style="title">DAFTAR PARTNER</para> -->
<blockTable colWidths="4cm,6cm,2.3cm,2.3cm,2.3cm" style="table" >
<tr>
<td><para style="tableTitleCenter">Nama</para></td>
<td><para style="tableTitleCenter">Diskripsi</para></td>
</tr>
{rows}
</blockTable>
<namedString id="last-page"><pageNumber/></namedString>
</story>
</document>
<tr>
<td style="tableBody">{perm_name}</td>
<td style="tableBody">{description}</td>
</tr>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
<!DOCTYPE document SYSTEM "rml_1_0.dtd">
<document>
<template pagesize="21cm, 29.7cm">
<pageTemplate id="page1">
<pageGraphics>
<setFont name="Helvetica-Bold" size="14"/>
<!-- <drawString x="2cm" y="27.4cm">PEMERINTAH {company}</drawString > -->
<drawCenteredString x="11.5cm" y="27.7cm">PEMERINTAH {company}</drawCenteredString >
<!-- <drawRightString x="19cm" y="27.7cm">PEMERINTAH {company}</drawRightString > -->
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="11.5cm" y="27.2cm">{departement}</drawCenteredString>
<setFont name="Helvetica-Bold" size="8"/>
<drawCenteredString x="11.5cm" y="26.7cm">{address}</drawCenteredString >
<image file="{logo}" preserveAspectRatio="1" x="2cm" y="749" width="50" height="50"/>
<image file="{line}" preserveAspectRatio="0" x="2cm" y="740" width="17cm" height="10"/>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="24cm"/>
</pageTemplate>
<pageTemplate id="page2">
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="27.7cm">{waktu}</drawString>
<drawRightString x="19cm" y="27.7cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<pageGraphics>
<setFont name="Helvetica" size="10"/>
<drawString x="2cm" y="1.5cm">{waktu}</drawString>
<drawRightString x="19cm" y="1.5cm">Halaman <pageNumber/> / <getName id="last-page" default="1"/></drawRightString>
</pageGraphics>
<frame id="content" x1="2cm" y1="2cm" width="17cm" height="26cm"/>
</pageTemplate>
</template>
<stylesheet>
<paraStyle name="title1"
fontName="Helvetica-Bold"
fontSize="16"
spaceAfter="16"
align="center"/>
<paraStyle name="title2"
fontName="Helvetica-Bold"
fontSize="14"
spaceAfter="10"/>
<paraStyle name="heading1"
fontName="Helvetica-Bold"
fontSize="12"
spaceAfter="12"/>
<paraStyle name="tableTitle"
fontName="Helvetica-Bold"
fontSize="10"
spaceAfter="10"/>
<paraStyle name="tableBody"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<paraStyle name="body"
fontName="Helvetica"
fontSize="10"
spaceAfter="10"/>
<blockTableStyle id="table">
<blockValign start="0,0" stop="-1,-1" value="TOP"/>
<blockAlignment value="left" start="0,0" stop="0,-1"/>
<blockAlignment value="centre" start="2,0" stop="2,-1"/>
<blockFont name="Helvetica" size="10"/>
<blockFont name="Helvetica-Bold" size="10" start="2,0" stop="2,0"/>
<lineStyle kind="GRID" colorName="black"/>
<!-- <lineStyle kind="OUTLINE" colorName="black" thickness="2"/> -->
<!-- <blockBackground colorName="pink" start="0,0" stop="-1,0"/> -->
<blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
</blockTableStyle>
<paraStyle name="h1" fontName="Helvetica-BoldOblique" fontSize="14" leading="36" spaceBefore="12"/>
<paraStyle name="normal" fontName="Helvetica" fontSize="10" leading="10" />
<paraStyle name="spaced" fontName="Helvetica" fontSize="10" leading="12" spaceBefore="12" spaceAfter="12"/>
<paraStyle name="intro" fontName="Helvetica" fontSize="12" leading="12" spaceAfter="12"/>
</stylesheet>
<story>
<!-- <storyPlace x="4cm" y="700" width="500" height="73" origin="page"> -->
<!-- <para style="title1">PEMERINTAH {company}</para> -->
<!-- <hr color="white" thickness="8pt"/> -->
<!-- <para style="title2">{departement}</para> -->
<!-- <hr color="white" thickness="8pt"/> -->
<!-- <para style="heading1">{address}</para> -->
<!-- <illustration height="3" width="500" align="center"> -->
<!-- <fill color= "(0,0.5,0.5,0.0)" /> -->
<!-- <rect x="0" y = "-12" width="500" height="3" round="1" fill="1" stroke = "Yes" /> -->
<!-- </illustration> -->
<!-- </storyPlace> -->
<!-- <graphicsMode> -->
<!-- <drawCenteredString x="10.5cm" y="23cm">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx</drawCenteredString > -->
<!-- </graphicsMode> -->
<setNextTemplate name="page2"/>
<para style="heading1">DAFTAR USER APLIKASI</para>
<blockTable colWidths="4cm,10cm,3cm" style="table" repeatRows="1">
<tr>
<td><para style="tableTitle">User ID</para></td>
<td><para style="tableTitle">E-mail</para></td>
<td>Registrasi</td>
</tr>
{rows}
</blockTable>
<namedString id="last-page"><pageNumber/></namedString>
</story>
</document>
<tr>
<td style="tableBody">{user_name}</td>
<td style="tableBody"><para style="tableBody">{email}</para></td>
<td style="tableBody">{registered_date}</td>
</tr>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.20.0.final using JasperReports Library version 6.20.0-2bc7ab61c56f459e8176eb05c7705e145cd400ad -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="users" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="cc1a9dab-bb8a-4181-94ac-73c3dc91137c">
<property name="ireport.zoom" value="1.3310000000000004"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="New Data Adapter"/>
<queryString>
<![CDATA[SELECT * FROM users]]>
</queryString>
<field name="userid" class="java.lang.String"/>
<field name="nama" class="java.lang.String"/>
<field name="created" class="java.sql.Timestamp"/>
<field name="disabled" class="java.lang.Integer"/>
<field name="passwd" class="java.lang.String"/>
<field name="id" class="java.lang.Integer"/>
<field name="kd_kantor" class="java.lang.String"/>
<field name="kd_kanwil" class="java.lang.String"/>
<field name="kd_tp" class="java.lang.String"/>
<field name="kd_kanwil_bank" class="java.lang.String"/>
<field name="kd_kppbb_bank" class="java.lang.String"/>
<field name="kd_bank_tunggal" class="java.lang.String"/>
<field name="kd_bank_persepsi" class="java.lang.String"/>
<field name="nip" class="java.lang.String"/>
<field name="jabatan" class="java.lang.String"/>
<field name="handphone" class="java.lang.String"/>
<field name="token" class="java.lang.String"/>
<field name="security_code" class="java.lang.String"/>
<field name="last_login_date" class="java.sql.Timestamp"/>
<field name="user_name" class="java.lang.String"/>
<field name="user_password" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<field name="status" class="java.lang.Integer"/>
<field name="registered_date" class="java.sql.Timestamp"/>
<field name="security_code_date" class="java.sql.Timestamp"/>
<field name="api_key" class="java.lang.String"/>
<field name="partner_id" class="java.lang.Integer"/>
<field name="company_id" class="java.lang.Integer"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="21" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="20" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="100" height="20" uuid="45c2cace-4a3f-495c-9002-be2f2ac8eca4"/>
<textElement>
<font isBold="true" isUnderline="true"/>
</textElement>
<text><![CDATA[User Name]]></text>
</staticText>
<staticText>
<reportElement x="100" y="0" width="255" height="20" uuid="3a03e8b0-96f7-4754-b00e-ceae1a0e5aa9"/>
<textElement>
<font isBold="true" isUnderline="true"/>
</textElement>
<text><![CDATA[Email]]></text>
</staticText>
<staticText>
<reportElement x="355" y="0" width="100" height="20" uuid="f19e05c8-f1bf-4d94-927d-07111ed068df"/>
<textElement>
<font isBold="true" isUnderline="true"/>
</textElement>
<text><![CDATA[Status]]></text>
</staticText>
<staticText>
<reportElement x="455" y="0" width="100" height="20" uuid="8a8040c2-e6ba-4473-835f-c9cfe3568fb9"/>
<textElement>
<font isBold="true" isUnderline="true"/>
</textElement>
<text><![CDATA[Last Login]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="22" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20" uuid="aec5f07a-b9fb-4ce1-9e7e-957f6315acb0"/>
<textFieldExpression><![CDATA[$F{user_name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="255" height="20" uuid="04eef3a7-87ca-4a27-9392-1368a6ba2fd1"/>
<textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="455" y="0" width="100" height="20" uuid="24a12a8f-a1e1-4ae3-adb7-bbcf450560ee"/>
<textFieldExpression><![CDATA[$F{registered_date}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="355" y="2" width="100" height="20" uuid="47051f05-f634-4c32-97cc-ce9af7b8f382"/>
<textFieldExpression><![CDATA[$F{status}.equals( 1 ) ? "Aktif" : ""]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
# kode, path, nama
routes = [
# ("user-area", "/user/area", "User Area"),
# ("user-area-add", "/user/area/add", "Tambah User Area"),
# ("user-area-edit", "/user/area/{id}/edit", "Edit User Area"),
# ("user-area-delete", "/user/area/{id}/delete", "Hapus User Area"),
# ("user-area-view", "/user/area/{id}/view", "Lihat User Area"),
# ("user-area-act", "/user/area/{act}/act", "Action User Area"),
# ("user-area-upload", "/user/area/upload", "Upload User Area"),
# ("user-departemen", "/user/departemen", "User Departemen"),
# ("user-departemen-add", "/user/departemen/add", "Tambah User Departemen"),
# ("user-departemen-edit",
# "/user/departemen/{id}/edit", "Edit User Departemen"),
# ("user-departemen-delete",
# "/user/departemen/{id}/delete", "Hapus User Departemen"),
# ("user-departemen-view",
# "/user/departemen/{id}/view", "Lihat User Departemen"),
# ("user-departemen-act",
# "/user/departemen/{act}/act", "Action User Departemen"),
# ("user-departemen-upload", "/user/departemen/upload", "Upload User Departemen"),
]
import os
import sys
import transaction
from sqlalchemy import engine_from_config
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from opensipkd.models import (
DBSession,
Route,
)
MAIN_TPL = """RouteData = [
{data}
]
"""
ROW_TPL = """\
dict(
id={id},
kode='{kode}',
nama='{nama}',
path='{path}',
perm_name='{perm_name}',
),"""
def usage(argv):
cmd = os.path.basename(argv[0])
print('usage: %s <config_uri>\n'
'(example: "%s development.ini")' % (cmd, cmd))
sys.exit(1)
def main(argv=sys.argv):
if len(argv) != 2:
usage(argv)
config_uri = argv[1]
setup_logging(config_uri)
settings = get_appsettings(config_uri)
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
q = DBSession.query(Route).order_by('id')
data = []
for row in q:
row_s = ROW_TPL.format(id=row.id, kode=row.kode, nama=row.nama,
path=row.path, perm_name=row.perm_name)
data.append(row_s)
data_s = '\n'.join(data)
main_s = MAIN_TPL.format(data=data_s)
print(main_s)
import os
import re
import base64
from sqlalchemy import (
Table,
MetaData,
)
from sqlalchemy.schema import PrimaryKeyConstraint
from sqlalchemy.sql.expression import text
from opensipkd.models import (
Base,
BaseModel,
CommonModel,
DBSession,
User,
)
from .tools import get_fullpath
SQL_TABLE = """
SELECT c.oid, n.nspname, c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = :table_name
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 2, 3
"""
SQL_TABLE_SCHEMA = """
SELECT c.oid, n.nspname, c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = :table_name
AND n.nspname = :schema
ORDER BY 2, 3
"""
SQL_FIELDS = """
SELECT a.attname,
pg_catalog.format_type(a.atttypid, a.atttypmod),
(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
FROM pg_catalog.pg_attrdef d
WHERE d.adrelid = a.attrelid
AND d.adnum = a.attnum
AND a.atthasdef) AS substring,
a.attnotnull, a.attnum,
(SELECT c.collname
FROM pg_catalog.pg_collation c, pg_catalog.pg_type t
WHERE c.oid = a.attcollation
AND t.oid = a.atttypid
AND a.attcollation <> t.typcollation) AS attcollation,
NULL AS indexdef,
NULL AS attfdwoptions
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = :table_id AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum"""
def split_tablename(tablename):
t = tablename.split('.')
if t[1:]:
schema = t[0]
tablename = t[1]
else:
schema = None
return schema, tablename
def get_pkeys(table):
r = []
for c in table.constraints:
if c.__class__ is PrimaryKeyConstraint:
for col in c:
r.append(col.name)
return r
return r
def execute(engine, sql_file):
sql_file_ = get_fullpath(sql_file)
f = open(sql_file_)
sql = f.read()
f.close()
engine.execute(sql)
Generic single-database configuration.
alembic -c config -n section_name revision -m "notes "
\ No newline at end of file \ No newline at end of file
Generic single-database configuration.
\ No newline at end of file \ No newline at end of file
"""Pyramid bootstrap environment. """ """Pyramid bootstrap environment. """
import os import logging
import importlib.machinery import os
from alembic import context import importlib.machinery
from pyramid.paster import ( from alembic import context
get_appsettings, from pyramid.paster import (
setup_logging, get_appsettings,
) setup_logging,
from sqlalchemy import engine_from_config )
from opensipkd.models.meta import Base from sqlalchemy import engine_from_config
from opensipkd.base.models.meta import Base
config = context.config
config = context.config
setup_logging(config.config_file_name)
setup_logging(config.config_file_name)
settings = get_appsettings(config.config_file_name)
target_metadata = Base.metadata settings = get_appsettings(config.config_file_name)
logging.info(settings)
current_dir = os.path.split(__file__)[0] target_metadata = Base.metadata
helper_file = os.path.join(current_dir, 'helpers.py')
loader = importlib.machinery.SourceFileLoader('alembic_helpers', helper_file) current_dir = os.path.split(__file__)[0]
helpers = loader.load_module() helper_file = os.path.join(current_dir, 'helpers.py')
loader = importlib.machinery.SourceFileLoader('alembic_helpers', helper_file)
helpers = loader.load_module()
def run_migrations_offline():
"""Run migrations in 'offline' mode. version_table = 'alembic_models'
version_table_schema = 'public'
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation def run_migrations_offline():
we don't even need a DBAPI to be available. """Run migrations in 'offline' mode.
Calls to context.execute() here emit the given string to the This configures the context with just a URL
script output. and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
""" we don't even need a DBAPI to be available.
context.configure(url=settings['sqlalchemy.url'],
version_table='alembic_base') Calls to context.execute() here emit the given string to the
with context.begin_transaction(): script output.
context.run_migrations()
"""
context.configure(url=settings['sqlalchemy.url'],
def run_migrations_online(): version_table=version_table)
"""Run migrations in 'online' mode. with context.begin_transaction():
context.run_migrations()
In this scenario we need to create an Engine
and associate a connection with the context.
def run_migrations_online():
""" """Run migrations in 'online' mode.
engine = engine_from_config(settings, prefix='sqlalchemy.')
In this scenario we need to create an Engine
connection = engine.connect() and associate a connection with the context.
context.configure(
connection=connection, """
target_metadata=target_metadata, engine = engine_from_config(settings, prefix='sqlalchemy.')
helpers=helpers,
version_table='alembic_base', connection = engine.connect()
version_table_schema='public' context.configure(
) connection=connection,
try: target_metadata=target_metadata,
with context.begin_transaction(): helpers=helpers,
context.run_migrations() version_table=version_table,
finally: version_table_schema=version_table_schema
connection.close() )
try:
with context.begin_transaction():
if context.is_offline_mode(): context.run_migrations()
run_migrations_offline() finally:
else: connection.close()
run_migrations_online()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
\ No newline at end of file \ No newline at end of file
# http://www.derstappen-it.de/tech-blog/sqlalchemie-alembic-check-if-table-has-column # http://www.derstappen-it.de/tech-blog/sqlalchemie-alembic-check-if-table-has-column
from alembic import op from alembic import op
from sqlalchemy.engine import reflection from sqlalchemy.engine import reflection
import sqlalchemy as sa import sqlalchemy as sa
def has_table(table, schema=None, insp=None):
def has_table(table, schema=None, insp=None): if not insp:
if not insp: engine = op.get_bind()
engine = op.get_bind() insp = reflection.Inspector.from_engine(engine)
insp = reflection.Inspector.from_engine(engine) return insp.has_table(table, schema=schema)
return insp.has_table(table, schema=schema)
def table_has_column(table, column, schema=None):
def table_has_column(table, column, schema=None): engine = op.get_bind()
engine = op.get_bind() insp = reflection.Inspector.from_engine(engine)
insp = reflection.Inspector.from_engine(engine) has_column = False
has_column = False
if has_table(table, schema, insp):
if has_table(table, schema, insp): for col in insp.get_columns(table, schema=schema):
for col in insp.get_columns(table, schema=schema): if column != col['name']:
if column != col['name']: continue
continue has_column = True
has_column = True return has_column
else:
has_column = True
return has_column def fields_update(table, field, typ, schema="public"):
context = op.get_context()
helpers = context.opts['helpers']
def table_has_seq(table, name, schema=None): if not helpers.table_has_column(table, field, schema):
engine = op.get_bind() op.add_column(table,
insp = reflection.Inspector.from_engine(engine) sa.Column(field, typ), schema=schema)
has_seq = False
if has_table(table, schema, insp):
for seq in insp.get_sequence_names(schema=schema):
if name != seq:
continue
has_seq = True
else:
has_seq = True
return has_seq
def fields_update(table, field, typ, schema=None, **kw):
context = op.get_context()
helpers = context.opts['helpers']
if not helpers.table_has_column(table, field, schema):
op.add_column(table, sa.Column(field, typ), schema=schema)
nullable = kw.get("nullable", None)
if nullable != None and nullable == False:
default = kw.get("default")
if default != None:
op.execute(
f"UPDATE {schema}.{table} SET {field} = {default}")
op.alter_column(table, field, nullable=False, schema=schema)
\ No newline at end of file \ No newline at end of file
"""${message} """${message}
Revision ID: ${up_revision} Revision ID: ${up_revision}
Revises: ${down_revision | comma,n} Revises: ${down_revision | comma,n}
Create Date: ${create_date} Create Date: ${create_date}
""" """
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = ${repr(up_revision)} revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)} down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)} branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)} depends_on = ${repr(depends_on)}
from alembic import op from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
${imports if imports else ""} ${imports if imports else ""}
def upgrade(): def upgrade():
${upgrades if upgrades else "pass"} ${upgrades if upgrades else "pass"}
def downgrade(): def downgrade():
${downgrades if downgrades else "pass"} ${downgrades if downgrades else "pass"}
urut,kode,nama,ibu_kota,kategori,provinsi_id/res_provinsi.kode
01,ID-JB.01,Kabupaten Bandung,Soreang,kabupaten,ID-JB
02,ID-JB.02,Kabupaten Bandung Barat,Ngamprah,kabupaten,ID-JB
03,ID-JB.03,Kabupaten Bekasi,Cikarang Pusat,kabupaten,ID-JB
04,ID-JB.04,Kabupaten Bogor,Cibinong,kabupaten,ID-JB
05,ID-JB.05,Kabupaten Ciamis,Ciamis,kabupaten,ID-JB
06,ID-JB.06,Kabupaten Cianjur,Cianjur,kabupaten,ID-JB
07,ID-JB.07,Kabupaten Cirebon,Sumber,kabupaten,ID-JB
08,ID-JB.08,Kabupaten Garut,Tarogong Kidul,kabupaten,ID-JB
09,ID-JB.9,Kabupaten Indramayu,Indramayu,kabupaten,ID-JB
10,ID-JB.10,Kabupaten Karawang,Karawang Barat,kabupaten,ID-JB
11,ID-JB.11,Kabupaten Kuningan,Kuningan,kabupaten,ID-JB
12,ID-JB.12,Kabupaten Majalengka,Majalengka,kabupaten,ID-JB
13,ID-JB.13,Kabupaten Pangandaran,Parigi,kabupaten,ID-JB
14,ID-JB.14,Kabupaten Purwakarta,Purwakarta,kabupaten,ID-JB
15,ID-JB.15,Kabupaten Subang,Subang,kabupaten,ID-JB
16,ID-JB.16,Kabupaten Sukabumi,Palabuhanratu,kabupaten,ID-JB
17,ID-JB.17,Kabupaten Sumedang,Sumedang Utara,kabupaten,ID-JB
18,ID-JB.18,Kabupaten Tasikmalaya,Singaparna,kabupaten,ID-JB
19,ID-JB.19,Kota Bandung,Bandung,kota,ID-JB
20,ID-JB.20,Kota Banjar,Banjar,kota,ID-JB
21,ID-JB.21,Kota Bekasi,Bekasi,kota,ID-JB
22,ID-JB.22,Kota Bogor,Bogor,kota,ID-JB
23,ID-JB.23,Kota Cimahi,Cimahi,kota,ID-JB
24,ID-JB.24,Kota Cirebon,Cirebon,kota,ID-JB
25,ID-JB.25,Kota Depok,Depok,kota,ID-JB
26,ID-JB.26,Kota Sukabumi,Sukabumi,kota,ID-JB
27,ID-JB.27,Kota Tasikmalaya,Tasikmalaya,kota,ID-JB
urut,kode,nama,ibu_kota,kategori,provinsi_id/res_propinsi.kode
01,ID-JB.01,Kabupaten Bandung,Soreang,kabupaten,ID-JB
02,ID-JB.02,Kabupaten Bandung Barat,Ngamprah,kabupaten,ID-JB
03,ID-JB.03,Kabupaten Bekasi,Cikarang Pusat,kabupaten,ID-JB
04,ID-JB.04,Kabupaten Bogor,Cibinong,kabupaten,ID-JB
05,ID-JB.05,Kabupaten Ciamis,Ciamis,kabupaten,ID-JB
06,ID-JB.06,Kabupaten Cianjur,Cianjur,kabupaten,ID-JB
07,ID-JB.07,Kabupaten Cirebon,Sumber,kabupaten,ID-JB
08,ID-JB.08,Kabupaten Garut,Tarogong Kidul,kabupaten,ID-JB
09,ID-JB.9,Kabupaten Indramayu,Indramayu,kabupaten,ID-JB
10,ID-JB.10,Kabupaten Karawang,Karawang Barat,kabupaten,ID-JB
11,ID-JB.11,Kabupaten Kuningan,Kuningan,kabupaten,ID-JB
12,ID-JB.12,Kabupaten Majalengka,Majalengka,kabupaten,ID-JB
13,ID-JB.13,Kabupaten Pangandaran,Parigi,kabupaten,ID-JB
14,ID-JB.14,Kabupaten Purwakarta,Purwakarta,kabupaten,ID-JB
15,ID-JB.15,Kabupaten Subang,Subang,kabupaten,ID-JB
16,ID-JB.16,Kabupaten Sukabumi,Palabuhanratu,kabupaten,ID-JB
17,ID-JB.17,Kabupaten Sumedang,Sumedang Utara,kabupaten,ID-JB
18,ID-JB.18,Kabupaten Tasikmalaya,Singaparna,kabupaten,ID-JB
19,ID-JB.19,Kota Bandung,Bandung,kota,ID-JB
20,ID-JB.20,Kota Banjar,Banjar,kota,ID-JB
21,ID-JB.21,Kota Bekasi,Bekasi,kota,ID-JB
22,ID-JB.22,Kota Bogor,Bogor,kota,ID-JB
23,ID-JB.23,Kota Cimahi,Cimahi,kota,ID-JB
24,ID-JB.24,Kota Cirebon,Cirebon,kota,ID-JB
25,ID-JB.25,Kota Depok,Depok,kota,ID-JB
26,ID-JB.26,Kota Sukabumi,Sukabumi,kota,ID-JB
27,ID-JB.27,Kota Tasikmalaya,Tasikmalaya,kota,ID-JB
No preview for this file type
kode,nama,dati2_id/res_dati2.kode
32.76.01,Pancoran Mas,ID-JB.25
32.76.02,Cimanggis,ID-JB.25
32.76.03,Sawangan,ID-JB.25
32.76.04,Limo,ID-JB.25
32.76.05,Sukmajaya,ID-JB.25
32.76.06,Beji,ID-JB.25
32.76.07,Cipayung,ID-JB.25
32.76.08,Cilodong,ID-JB.25
32.76.09,Cinere,ID-JB.25
32.76.10,Tapos,ID-JB.25
32.76.11,Bojongsari,ID-JB.25
kode,nama,kecamatan_id/res_kecamatan.kode,,,,,,,,,,,
32.76.01.01,Depok,32.76.01,,,,,,,,,,,
32.76.01.02,Depok Jaya,32.76.01,,,,,,,,,,,
32.76.01.03,Mampang,32.76.01,,,,,,,,,,,
32.76.01.04,Pancoran Mas,32.76.01,,,,,,,,,,,
32.76.01.05,Rangkapan Jaya,32.76.01,,,,,,,,,,,
32.76.01.06,Rangkapan Jaya Baru,32.76.01,,,,,,,,,,,
32.76.02.01,Cisalak Pasar,32.76.02,,,,,,,,,,,
32.76.02.02,Curug,32.76.02,,,,,,,,,,,
32.76.02.03,Harjamukti,32.76.02,,,,,,,,,,,
32.76.02.04,Mekarsari,32.76.02,,,,,,,,,,,
32.76.02.05,Pasir Gunung Selatan,32.76.02,,,,,,,,,,,
32.76.02.06,Tugu,32.76.02,,,,,,,,,,,
32.76.03.01,Bedahan,32.76.03,,,,,,,,,,,
32.76.03.02,Cinangka,32.76.03,,,,,,,,,,,
32.76.03.03,Kedaung,32.76.03,,,,,,,,,,,
32.76.03.04,Pasir Putih,32.76.03,,,,,,,,,,,
32.76.03.05,Pengasinan,32.76.03,,,,,,,,,,,
32.76.03.06,Sawangan Baru,32.76.03,,,,,,,,,,,
32.76.03.07,Sawangan Lama,32.76.03,,,,,,,,,,,
32.76.04.01,Grogol,32.76.04,,,,,,,,,,,
32.76.04.02,Krukut,32.76.04,,,,,,,,,,,
32.76.04.03,Limo,32.76.04,,,,,,,,,,,
32.76.04.04,Meruyung,32.76.04,,,,,,,,,,,
32.76.05.01,Abadijaya,32.76.05,,,,,,,,,,,
32.76.05.02,Baktijaya,32.76.05,,,,,,,,,,,
32.76.05.03,Cisalak,32.76.05,,,,,,,,,,,
32.76.05.04,Mekarjaya,32.76.05,,,,,,,,,,,
32.76.05.05,Sukmajaya,32.76.05,,,,,,,,,,,
32.76.05.06,Tirtajaya,32.76.05,,,,,,,,,,,
32.76.06.01,Beji,32.76.06,,,,,,,,,,,
32.76.06.02,Beji Timur,32.76.06,,,,,,,,,,,
32.76.06.03,Kemirimuka,32.76.06,,,,,,,,,,,
32.76.06.04,Kukusan,32.76.06,,,,,,,,,,,
32.76.06.05,Pondokcina,32.76.06,,,,,,,,,,,
32.76.06.06,Tanahbaru,32.76.06,,,,,,,,,,,
32.76.07.01,Cipayung,32.76.07,,,,,,,,,,,
32.76.07.02,Bojong Pondok Terong,32.76.07,,,,,,,,,,,
32.76.07.03,Cipayung,32.76.07,,,,,,,,,,,
32.76.07.04,Cipayung Jaya,32.76.07,,,,,,,,,,,
32.76.07.05,Pondok Jaya,32.76.07,,,,,,,,,,,
32.76.07.06,Ratujaya,32.76.07,,,,,,,,,,,
32.76.08.01,Cilodong,32.76.08,,,,,,,,,,,
32.76.08.02,Jatimulya,32.76.08,,,,,,,,,,,
32.76.08.03,Kalibaru,32.76.08,,,,,,,,,,,
32.76.08.04,Kalimulya,32.76.08,,,,,,,,,,,
32.76.08.05,Sukamaju,32.76.08,,,,,,,,,,,
32.76.09.01,Cinere,32.76.09,,,,,,,,,,,
32.76.09.02,Gandul,32.76.09,,,,,,,,,,,
32.76.09.03,Pangkalan Jati,32.76.09,,,,,,,,,,,
32.76.09.04,Pangkalan Jati Baru,32.76.09,,,,,,,,,,,
32.76.10.01,Cilangkap,32.76.10,,,,,,,,,,,
32.76.10.02,Cimpaeun,32.76.10,,,,,,,,,,,
32.76.10.03,Jatijajar,32.76.10,,,,,,,,,,,
32.76.10.04,Leuwinanggung,32.76.10,,,,,,,,,,,
32.76.10.05,Sukamaju Baru,32.76.10,,,,,,,,,,,
32.76.10.06,Sukatani,32.76.10,,,,,,,,,,,
32.76.10.07,Tapos,32.76.10,,,,,,,,,,,
32.76.11.01,Bojongsari Lama,32.76.11,,,,,,,,,,,
32.76.11.02,Bojongsaribaru,32.76.11,,,,,,,,,,,
32.76.11.03,Curug,32.76.11,,,,,,,,,,,
32.76.11.04,Durenmekar,32.76.11,,,,,,,,,,,
32.76.11.05,Durenseribu,32.76.11,,,,,,,,,,,
32.76.11.06,Pondokpetir,32.76.11,,,,,,,,,,,
32.76.11.07,Serua,32.76.11,,,,,,,,,,,
\ No newline at end of file \ No newline at end of file
kecamatan_id/res_kecamatan.kode,kecamatan,nama,urut,kode
32.07.37,Banjaranyar,Banjaranyar,01,32.07.37.01
32.07.37,,Cigayam,02,32.07.37.02
32.07.37,,Cikaso,03,32.07.37.03
32.07.37,,Cikupa,04,32.07.37.04
32.07.37,,Kalijaya,05,32.07.37.05
32.07.37,,Karyamukti,06,32.07.37.06
32.07.37,,Langkapsari,07,32.07.37.07
32.07.37,,Pasawahan,08,32.07.37.08
32.07.37,,Sindangrasa,09,32.07.37.09
32.07.37,,Tanjungsari,10,32.07.37.10
32.07.18,Banjarsari,Banjarsari,01,32.07.18.01
32.07.18,,Cibadak,02,32.07.18.02
32.07.18,,Cicapar,03,32.07.18.03
32.07.18,,Ciherang,04,32.07.18.04
32.07.18,,Ciulu,05,32.07.18.05
32.07.18,,Kawasen,06,32.07.18.06
32.07.18,,Purwasari,07,32.07.18.07
32.07.18,,Ratawangi,08,32.07.18.08
32.07.18,,Sindangasih,09,32.07.18.09
32.07.18,,Sindanghayu,10,32.07.18.10
32.07.18,,Sindangsari,11,32.07.18.11
32.07.18,,Sukasari,12,32.07.18.12
32.07.32,Baregbeg,Baregbeg,01,32.07.32.01
32.07.32,,Jelat,02,32.07.32.02
32.07.32,,Karang Ampel,03,32.07.32.03
32.07.32,,Mekarjaya,04,32.07.32.04
32.07.32,,Petir Hilir,05,32.07.32.05
32.07.32,,Pusakanagara,06,32.07.32.06
32.07.32,,Saguling,07,32.07.32.07
32.07.32,,Sukamaju,08,32.07.32.08
32.07.32,,Sukamulya,09,32.07.32.09
32.07.01,Ciamis,Cisadap,01,32.07.01.01
32.07.01,,Imbanagara Raya,02,32.07.01.02
32.07.01,,Imbanagara,03,32.07.01.03
32.07.01,,Panyingkiran,04,32.07.01.04
32.07.01,,Pawindan,05,32.07.01.05
32.07.01,,Benteng,06,32.07.01.06
32.07.01,,Ciamis,07,32.07.01.07
32.07.01,,Cigembor,08,32.07.01.08
32.07.01,,Kertasari,09,32.07.01.09
32.07.01,,Linggasari,10,32.07.01.10
32.07.01,,Maleber,11,32.07.01.11
32.07.01,,Sindangrasa,12,32.07.01.12
32.07.05,Cidolog,Cidolog,01,32.07.05.01
32.07.05,,Ciparay,02,32.07.05.02
32.07.05,,Hegarmanah,03,32.07.05.03
32.07.05,,Janggala,04,32.07.05.04
32.07.05,,Jelegong,05,32.07.05.05
32.07.05,,Sukasari,06,32.07.05.06
32.07.06,Cihaurbeuti,Cihaurbeuti,01,32.07.06.01
32.07.06,,Cijulang,02,32.07.06.02
32.07.06,,Padamulya,03,32.07.06.03
32.07.06,,Pamokolan,04,32.07.06.04
32.07.06,,Pasirtamiang,05,32.07.06.05
32.07.06,,Sukahaji,06,32.07.06.06
32.07.06,,Sukahurip,07,32.07.06.07
32.07.06,,Sukamaju,08,32.07.06.08
32.07.06,,Sukamulya,09,32.07.06.09
32.07.06,,Sukasetia,10,32.07.06.10
32.07.06,,Sumberjaya,11,32.07.06.11
32.07.03,Cijeungjing,Bojongmengger,01,32.07.03.01
32.07.03,,Ciharalang,02,32.07.03.02
32.07.03,,Cijeungjing,03,32.07.03.03
32.07.03,,Dewasari,04,32.07.03.04
32.07.03,,Handapherang,05,32.07.03.05
32.07.03,,Karanganyar,06,32.07.03.06
32.07.03,,Karangkamulyan,07,32.07.03.07
32.07.03,,Kertabumi,08,32.07.03.08
32.07.03,,Kertaharja,09,32.07.03.09
32.07.03,,Pamalayan,10,32.07.03.10
32.07.03,,Utama,11,32.07.03.11
32.07.02,Cikoneng,Cikoneng,01,32.07.02.01
32.07.02,,Cimari,02,32.07.02.02
32.07.02,,Darmacaang,03,32.07.02.03
32.07.02,,Gegempalan,04,32.07.02.04
32.07.02,,Kujang,05,32.07.02.05
32.07.02,,Margaluyu,06,32.07.02.06
32.07.02,,Nasol,07,32.07.02.07
32.07.02,,Panaragan,08,32.07.02.08
32.07.02,,Sindangsari,09,32.07.02.09
32.07.29,Cimaragas,Beber,01,32.07.29.01
32.07.29,,Bojongmalang,02,32.07.29.02
32.07.29,,Cimaragas,03,32.07.29.03
32.07.29,,Jayakarsa,04,32.07.29.04
32.07.29,,Raksabaya,05,32.07.29.05
32.07.11,Cipaku,Bangbayang,01,32.07.11.01
32.07.11,,Buniseuri,02,32.07.11.02
32.07.11,,Ciakar,03,32.07.11.03
32.07.11,,Cieurih,04,32.07.11.04
32.07.11,,Cipaku,05,32.07.11.05
32.07.11,,Gereba,06,32.07.11.06
32.07.11,,Jalatrang,07,32.07.11.07
32.07.11,,Mekarsari,08,32.07.11.08
32.07.11,,Muktisari,09,32.07.11.09
32.07.11,,Pusakasari,10,32.07.11.10
32.07.11,,Selacai,11,32.07.11.11
32.07.11,,Selamanik,12,32.07.11.12
32.07.11,,Sukawening,13,32.07.11.13
32.07.30,Cisaga,Bangunharja,01,32.07.30.01
32.07.30,,Cisaga,02,32.07.30.02
32.07.30,,Danasari,03,32.07.30.03
32.07.30,,Girimukti,04,32.07.30.04
32.07.30,,Kepel,05,32.07.30.05
32.07.30,,Karyamulya,06,32.07.30.06
32.07.30,,Mekarmukti,07,32.07.30.07
32.07.30,,Sidamulya,08,32.07.30.08
32.07.30,,Sukahurip,09,32.07.30.09
32.07.30,,Tanjungjaya,10,32.07.30.10
32.07.30,,Wangunjaya,11,32.07.30.11
32.07.12,Jatinagara,Bayasari,01,32.07.12.01
32.07.12,,Cintanagara,02,32.07.12.02
32.07.12,,Dayeuhluhur,03,32.07.12.03
32.07.12,,Jatinagara,04,32.07.12.04
32.07.12,,Mulyasari,05,32.07.12.05
32.07.12,,Sukanagara,06,32.07.12.06
32.07.09,Kawali,Citeureup,01,32.07.09.01
32.07.09,,Karangpawitan,02,32.07.09.02
32.07.09,,Kawali,03,32.07.09.03
32.07.09,,Kawalimukti,04,32.07.09.04
32.07.09,,Linggapura,05,32.07.09.05
32.07.09,,Margamulya,06,32.07.09.06
32.07.09,,Purwasari,07,32.07.09.07
32.07.09,,Selasari,08,32.07.09.08
32.07.09,,Sindangsari,09,32.07.09.09
32.07.09,,Talagasari,10,32.07.09.10
32.07.09,,Winduraja,11,32.07.09.11
32.07.17,Lakbok,Baregbeg,01,32.07.17.01
32.07.17,,Cintajaya,02,32.07.17.02
32.07.17,,Cintaratu,03,32.07.17.03
32.07.17,,Kalapasawit,04,32.07.17.04
32.07.17,,Kertajaya,05,32.07.17.05
32.07.17,,Puloerang,06,32.07.17.06
32.07.17,,Sidaharja,07,32.07.17.07
32.07.17,,Sindangangin,08,32.07.17.08
32.07.17,,Sukanagara,09,32.07.17.09
32.07.17,,Tambakreja,10,32.07.17.10
32.07.34,Lumbung,Awiluar,01,32.07.34.01
32.07.34,,Cikupa,02,32.07.34.02
32.07.34,,Darmaraja,03,32.07.34.03
32.07.34,,Lumbung,04,32.07.34.04
32.07.34,,Lumbungsari,05,32.07.34.05
32.07.34,,Rawa,06,32.07.34.06
32.07.34,,Sadewata,07,32.07.34.07
32.07.34,,Sukaraharja,08,32.07.34.08
32.07.19,Pamarican,Bangunsari,01,32.07.19.01
32.07.19,,Bantarsari,02,32.07.19.02
32.07.19,,Kertahayu,03,32.07.19.03
32.07.19,,Margajaya,04,32.07.19.04
32.07.19,,Mekarmulya,05,32.07.19.05
32.07.19,,Neglasari,06,32.07.19.06
32.07.19,,Pamarican,07,32.07.19.07
32.07.19,,Pasirnagara,08,32.07.19.08
32.07.19,,Sidaharja,09,32.07.19.09
32.07.19,,Sidamulih,10,32.07.19.10
32.07.19,,Sukahurip,11,32.07.19.11
32.07.19,,Sukajadi,12,32.07.19.12
32.07.19,,Sukajaya,13,32.07.19.13
32.07.19,,Sukamukti,14,32.07.19.14
32.07.08,Panjalu,Bahara,01,32.07.08.01
32.07.08,,Ciomas,02,32.07.08.02
32.07.08,,Hujungtiwu,03,32.07.08.03
32.07.08,,Kertamandala,04,32.07.08.04
32.07.08,,Mandalare,05,32.07.08.05
32.07.08,,Maparah,06,32.07.08.06
32.07.08,,Panjalu,07,32.07.08.07
32.07.08,,Sandingtaman,08,32.07.08.08
32.07.10,Panawangan,Bangunjaya,01,32.07.10.01
32.07.10,,Cinyasag,02,32.07.10.02
32.07.10,,Gardujaya,03,32.07.10.03
32.07.10,,Girilaya,04,32.07.10.04
32.07.10,,Indragiri,05,32.07.10.05
32.07.10,,Jagabaya,06,32.07.10.06
32.07.10,,Karangpaningal,07,32.07.10.07
32.07.10,,Kertajaya,08,32.07.10.08
32.07.10,,Kertayasa,09,32.07.10.09
32.07.10,,Mekarbuana,10,32.07.10.10
32.07.10,,Nagarajati,11,32.07.10.11
32.07.10,,Nagarajaya,12,32.07.10.12
32.07.10,,Nagarapageuh,13,32.07.10.13
32.07.10,,Nagarawangi,14,32.07.10.14
32.07.10,,Natanegara,15,32.07.10.15
32.07.10,,Panawangan,16,32.07.10.16
32.07.10,,Sadapaingan,17,32.07.10.17
32.07.10,,Sagalaherang,18,32.07.10.18
32.07.07,Panumbangan,Banjarangsana,01,32.07.07.01
32.07.07,,Buanamekar,02,32.07.07.02
32.07.07,,Golat,03,32.07.07.03
32.07.07,,Jayagiri,04,32.07.07.04
32.07.07,,Kertaraharja,05,32.07.07.05
32.07.07,,Medanglayang,06,32.07.07.06
32.07.07,,Panumbangan,07,32.07.07.07
32.07.07,,Payungagung,08,32.07.07.08
32.07.07,,Payungsari,09,32.07.07.09
32.07.07,,Sindangbarang,10,32.07.07.10
32.07.07,,Sindangherang,11,32.07.07.11
32.07.07,,Sindangmukti,12,32.07.07.12
32.07.07,,Sukakerta,13,32.07.07.13
32.07.07,,Tanjungmulya,14,32.07.07.14
32.07.35,Purwadadi,Bantardawa,01,32.07.35.01
32.07.35,,Karangpaningal,02,32.07.35.02
32.07.35,,Kutawaringin,03,32.07.35.03
32.07.35,,Padaringan,04,32.07.35.04
32.07.35,,Pasirlawang,05,32.07.35.05
32.07.35,,Purwadadi,06,32.07.35.06
32.07.35,,Purwajaya,07,32.07.35.07
32.07.35,,Sidarahayu,08,32.07.35.08
32.07.35,,Sukamulya,09,32.07.35.09
32.07.13,Rajadesa,Andapraja,01,32.07.13.01
32.07.13,,Purwaraja,02,32.07.13.02
32.07.13,,Rajadesa,03,32.07.13.03
32.07.13,,Sirnabaya,04,32.07.13.04
32.07.13,,Sirnajaya,05,32.07.13.05
32.07.13,,Sukaharja,06,32.07.13.06
32.07.13,,Sukajaya,07,32.07.13.07
32.07.13,,Tanjungjaya,08,32.07.13.08
32.07.13,,Tanjungsari,09,32.07.13.09
32.07.13,,Tanjungsukur,10,32.07.13.10
32.07.13,,Tigaherang,11,32.07.13.11
32.07.15,Rancah,Bojonggedang,01,32.07.15.01
32.07.15,,Cileungsir,02,32.07.15.02
32.07.15,,Cisontrol,03,32.07.15.03
32.07.15,,Dadiharja,04,32.07.15.04
32.07.15,,Giriharja,05,32.07.15.05
32.07.15,,Jangalaharja,06,32.07.15.06
32.07.15,,Kawunglarang,07,32.07.15.07
32.07.15,,Karangpari,08,32.07.15.08
32.07.15,,Kiarapayung,09,32.07.15.09
32.07.15,,Patakaharja,10,32.07.15.10
32.07.15,,Rancah,11,32.07.15.11
32.07.15,,Situmandala,12,32.07.15.12
32.07.15,,Wangunsari,13,32.07.15.13
32.07.04,Sadananya,Bendasari,01,32.07.04.01
32.07.04,,Gunungsari,02,32.07.04.02
32.07.04,,Mangkubumi,03,32.07.04.03
32.07.04,,Sadananya,04,32.07.04.04
32.07.04,,Sukajadi,05,32.07.04.05
32.07.04,,Mekarjadi,06,32.07.04.06
32.07.04,,Tanjungsari,07,32.07.04.07
32.07.04,,Werasari,08,32.07.04.08
32.07.31,Sindangkasih,Budiasih,01,32.07.31.01
32.07.31,,Budiharja,02,32.07.31.02
32.07.31,,Gunungcupu,03,32.07.31.03
32.07.31,,Sindangkasih,04,32.07.31.04
32.07.31,,Sukamanah,05,32.07.31.05
32.07.31,,Sukaraja,06,32.07.31.06
32.07.31,,Sukaresik,07,32.07.31.07
32.07.31,,Sukasenang,08,32.07.31.08
32.07.31,,Wanasigra,09,32.07.31.09
32.07.14,Sukadana,Bunter,01,32.07.14.01
32.07.14,,Ciparigi,02,32.07.14.02
32.07.14,,Margaharja,03,32.07.14.03
32.07.14,,Margajaya,04,32.07.14.04
32.07.14,,Salakaria,05,32.07.14.05
32.07.14,,Sukadana,06,32.07.14.06
32.07.33,Sukamantri,Cibeureum,01,32.07.33.01
32.07.33,,Mekarwangi,02,32.07.33.02
32.07.33,,Sindanglaya,03,32.07.33.03
32.07.33,,Sukamantri,04,32.07.33.04
32.07.33,,Tenggerraharja,05,32.07.33.05
32.07.16,Tambaksari,Kadupandak,01,32.07.16.01
32.07.16,,Karangpaningal,02,32.07.16.02
32.07.16,,Kaso,03,32.07.16.03
32.07.16,,Mekarsari,04,32.07.16.04
32.07.16,,Sukasari,05,32.07.16.05
32.07.16,,Tambaksari,06,32.07.16.06
\ No newline at end of file \ No newline at end of file
kode,nama,pangkat,ruang,tunjangan,status
"II/A","Eselon II A",2,"A",4000000,1
"II/B","Eselon II B",2,"B",8000000,1
"III/A","Eselon III A",3,"A",5500000,1
"III/B","Eselon III B",3,"B",5000000,1
"IV/A","Eselon IV A",4,"A",3500000,1
"IV/B","Eselon IV B",4,"B",2250000,1
"V/A","Eselon V A",5,"A",1500000,1
"STAFF","Staff",0,"0",1500000,1
\ No newline at end of file \ No newline at end of file
group_id/groups.group_name,perm_name group_id/groups.group_name,perm_name
"Superuser","user-edit" "Superuser","user-edit"
"Superuser","user-view" "Superuser","user-view"
"Superuser","user-group" "Superuser","user-group"
"Superuser","upload-logo" "Superuser","upload-logo"
"Superuser","departemen" "Superuser","departemen"
"Superuser","partner-departemen" "Superuser","partner-departemen"
"Superuser","partner" "Superuser","partner"
"Superuser","parameter" "Superuser","parameter"
"Superuser","permission" "Superuser","permission"
"Web Service","web-service" "Web Service","web-service"
"Pindah Departemen","departemen-all" "Pindah Departemen","departemen-all"
"Guest", "guest" "Guest", "guest"
\ No newline at end of file \ No newline at end of file
group_name,description,member_count group_name,description,member_count
"Superuser","Superuser",0 "Superuser","Superuser",0
"Web Service","Webservice",0 "Web Service","Webservice",0
"Pindah Departemen","Pindah Departemen",0 "Pindah Departemen","Pindah Departemen",0
"Guest","Guest",0 "Guest","Guest",0
\ No newline at end of file \ No newline at end of file
kode,nama,jenis,status
01,Kepala,1,1
02,Sekretaris,1,1
03,Staf,1,1
04,Bendahara Umum Daerah,3,1
05,Kuasa Bendahara Umum Daerah,3,1
06,Pejabat Pelaksana Keuangan,3,1
07,Bendahara Penerimaan,3,1
08,Bendahara Pengeluaran,3,1
09,Pengurus Barang,3,1
10,PPTK,3,1
10,Pejabat PEmbuat Komitmen,3,1
\ No newline at end of file \ No newline at end of file
kode,nama,kategori,dati2_id/res_dati2.kode
32.07.01,Ciamis,kecamatan,ID-JB.05
32.07.02,Cikoneng,kecamatan,ID-JB.05
32.07.03,Cijeungjing,kecamatan,ID-JB.05
32.07.04,Sadananya,kecamatan,ID-JB.05
32.07.05,Cidolog,kecamatan,ID-JB.05
32.07.06,Cihaurbeuti,kecamatan,ID-JB.05
32.07.07,Panumbangan,kecamatan,ID-JB.05
32.07.08,Panjalu,kecamatan,ID-JB.05
32.07.09,Kawali,kecamatan,ID-JB.05
32.07.10,Panawangan,kecamatan,ID-JB.05
32.07.11,Cipaku,kecamatan,ID-JB.05
32.07.12,Jatinagara,kecamatan,ID-JB.05
32.07.13,Rajadesa,kecamatan,ID-JB.05
32.07.14,Sukadana,kecamatan,ID-JB.05
32.07.15,Rancah,kecamatan,ID-JB.05
32.07.16,Tambaksari,kecamatan,ID-JB.05
32.07.17,Lakbok,kecamatan,ID-JB.05
32.07.18,Banjarsari,kecamatan,ID-JB.05
32.07.19,Pamarican,kecamatan,ID-JB.05
32.07.29,Cimaragas,kecamatan,ID-JB.05
32.07.30,Cisaga,kecamatan,ID-JB.05
32.07.31,Sindangkasih,kecamatan,ID-JB.05
32.07.32,Baregbeg,kecamatan,ID-JB.05
32.07.33,Sukamantri,kecamatan,ID-JB.05
32.07.34,Lumbung,kecamatan,ID-JB.05
32.07.35,Purwadadi,kecamatan,ID-JB.05
32.07.37,Banjaranyar,kecamatan,ID-JB.05
kode,url,nama,status,order_id,parent_id/menus.kode,icon,need_login,class_name
login,/login,Login,1,1,,,0,
reset-password,/reset/password,Reset Password,1,1,,,0,
register,/register,Register,1,1,,,0,
base,/,Base,1,1,,,0,
logout,/logout,Logout,1,2,base,,,
change-password,/password/{code},Ubah password,1,3,base,,,
menus,/menu,Menus,1,4,base,,,
departemen,/departemen,Departemen,1,5,base,,,
profile,/profile,Profile,1,6,base,,,
group,/group,Daftar group,1,7,base,,,
routes,/routes,Routes,1,8,base,,,
parameter,/parameter,Parameter,1,9,base,,,
partner,/partner,Partner,1,10,base,,,
departemen,/departemen,Organisasi,1,11,base,,,
permission,/permission,Daftar Permission,1,12,base,,,
eselon,/eselon,Daftar Eselon,1,13,base,,,
jabatan,/jabatan,Daftar Jabatan,1,14,base,,,
partner-departemen,/partner/departemen,Partner Departemen,1,15,base,,,
log,/log,Log Aplikasi,1,16,base,,,
provinsi,/provinsi,Provinsi,1,17,base,,,
dati2,/dati2,Kabupaten/Kota,1,18,base,,,
kecamatan,/kecamatan,Kecamatan,1,19,base,,,
desa,/desa,Desa/Kelurahan,1,20,base,,,
company,/company,Pemda,1,21,base,,,
kode,nama,pangkat,ruang
4e,Pembina Utama,IV,e
4d,Pembina UtamaMadya,IV,d
4c,Pembina Utama Muda,IV,c
4b,Pembina Tingkat I,IV,b
4a,Pembina,IV,a
3d,Penata Tingkat I,III,d
3c,Penata,III,c
3b,Penata Muda Tingkat I,III,b
3a,Penata Muda,III,a
2d,Pengatur Tingkat I,II,d
2c,Pengatur,II,c
2b,Pengatur Muda Tingkat I,II,b
2a,Pengatur Muda,II,a
1d,Juru Tingkat I,I,d
1c,Juru,I,c
1b,Juru Muda Tingkat I,I,b
1a,Juru Muda,I,a
\ No newline at end of file \ No newline at end of file
kode,value,nama kode,value,nama
company,open SIPKD, Nama Organisasi company,open SIPKD, Nama Organisasi
ibukota,BEKASI ibukota,BEKASI
departement,Divisi Teknologi Informasi departement,Divisi Teknologi Informasi
address_1,Jati Asih address_1,Jati Asih
address_2,Bekasi address_2,Bekasi
unoconv_py,"",path_python_libreoffice unoconv_py,"",path_python_libreoffice
unoconv_bin,"",env_unoconv_executable unoconv_bin,"",env_unoconv_executable
ocr_bin,"",path_for_ocr_executable ocr_bin,"",path_for_ocr_executable
menus,login:LOGIN,"List Menu Separated By comma" menus,login:LOGIN,"List Menu Separated By comma"
modules_default,"","Module Default" modules_default,"","Module Default"
app_name,DEMO,"Nama Aplikasi" app_name,DEMO,"Nama Aplikasi"
allow_register,False,"Allow User Self Register" allow_register,False,"Allow User Self Register"
change_unit,False,"Allow User to change Unit" change_unit,False,"Allow User to change Unit"
departemen_chg_id,3,"Devault Level Departemen to change" departemen_chg_id,3,"Devault Level Departemen to change"
default_group,Guest,"Default group for new user" default_group,Guest,"Default group for new user"
perm_name,description perm_name,description
admin,Administrator admin,Administrator
guest,Guest guest,Guest
user-edit,User management user-edit,User management
user-view,User view user-view,User view
user-group,User Group user-group,User Group
edit-title,Edit Title edit-title,Edit Title
upload-logo,Upload Logo upload-logo,Upload Logo
departemen,Departemen departemen,Departemen
partner-departemen,Partner Departemen partner-departemen,Partner Departemen
partner,Partner partner,Partner
parameter,Parameter parameter,Parameter
permission,Permission permission,Permission
web-service,WEB SERVICE RPC web-service,WEB SERVICE RPC
departemen-all,Pindah antar Departemen departemen-all,Pindah antar Departemen
\ No newline at end of file \ No newline at end of file
nama,singkat,kode,ibu_kota,kategori
Aceh,Aceh,ID-AC,Banda Aceh,provinsi
Sumatra Utara,Sumut,ID-SU,Medan,provinsi
Sumatra Barat,Sumbar,ID-SB,Padang,provinsi
Riau,Riau,ID-RI,Pekanbaru,provinsi
Jambi,Jambi,ID-JA,Jambi,provinsi
Kepulauan Riau,Kepri,ID-KR,Tanjungpinang,provinsi
Bengkulu,Bengkulu,ID-BE,Bengkulu,provinsi
Sumatra Selatan,Sumsel,ID-SS,Palembang,provinsi
Kepulauan Bangka Belitung,Babel,ID-BB,Pangkalpinang,provinsi
Lampung,Lampung,ID-LA,Bandar Lampung,provinsi
Banten,Banten,ID-BT,Serang,provinsi
Daerah Khusus Ibukota Jakarta,DKI Jakarta,ID-JK,Tidak ada,provinsi
Jawa Barat,Jabar,ID-JB,Bandung,provinsi
Jawa Tengah,Jateng,ID-JT,Semarang,provinsi
Daerah Istimewa Yogyakarta,DIY,ID-YO,Yogyakarta,provinsi
Jawa Timur,Jatim,ID-JI,Surabaya,provinsi
Bali,Bali,ID-BA,Denpasar,provinsi
Nusa Tenggara Barat,NTB,ID-NB,Mataram,provinsi
Nusa Tenggara Timur,NTT,ID-NT,Kupang,provinsi
Kalimantan Barat,Kalbar,ID-KS,Pontianak,provinsi
Kalimantan Tengah,Kalteng,ID-KT,Palangka Raya,provinsi
Kalimantan Selatan,Kalsel,ID-KS,Banjarbaru,provinsi
Kalimantan Timur,Kaltim,ID-KI,Samarinda,provinsi
Kalimantan Utara,Kaltara,ID-KU,Tanjung Selor,provinsi
Sulawesi Barat,Sulbar,ID-SR,Mamuju,provinsi
Sulawesi Selatan,Sulsel,ID-SN,Makassar,provinsi
Sulawesi Tenggara,Sultra,ID-SG,Kendari,provinsi
Sulawesi Tengah,Sulteng,ID-ST,Palu,provinsi
Gorontalo,Gorontalo,ID-GO,Gorontalo,provinsi
Sulawesi Utara,Sulut,ID-SA,Manado,provinsi
Maluku Utara,Malut,ID-MU,Sofifi,provinsi
Maluku,Maluku,ID-MA,Ambon,provinsi
Papua Barat,Pabar,ID-PB,Manokwari,provinsi
Papua,Papua,ID-PA,Jayapura,provinsi
No preview for this file type
email,status,user_name email,status,user_name
admin@local.host,1,admin admin@local.host,1,admin
guest@local.host,1,guest guest@local.host,1,guest
import sys
import re
import pytz
import transaction
from zope.sqlalchemy import register
from datetime import datetime
from hashlib import md5
from opensipkd.base import Base
from opensipkd.tools import create_datetime
from pyramid.paster import get_appsettings
from sqlalchemy import (
engine_from_config,
exc,
)
from sqlalchemy.orm import sessionmaker
from opensipkd.models.handlers import (
Log,
LogDBSession,
)
FIRST_LINE_PATTERN = r'^([\d]*)-([\d]*)-([\d]*) '\
r'([\d]*):([\d]*):([\d]*),([\d]*) '\
'(INFO|ERROR|WARNI) (.*)'
REGEX_FIRST_LINE = re.compile(FIRST_LINE_PATTERN)
def usage(argv):
print("command config log_file")
exit(1)
def main(argv=sys.argv):
def save():
if not line_id:
return
logger = loggers[0]
if logger.find('waitress') > -1:
return
msg = '\n'.join(lines)
row = Log(
created_at=created_at, msg=msg, line_id=line_id, level=level,
logger=logger)
LogDBSession.add(row)
try:
LogDBSession.flush()
except exc.IntegrityError as e:
s = str(e)
if s.find('duplicate key') == -1:
raise e
if len(argv) != 3:
usage(argv)
config_uri = argv[1]
settings = get_appsettings(config_uri)
tz = pytz.timezone(settings['timezone'])
engine = engine_from_config(settings, 'sqlalchemy.')
LogDBSession.configure(bind=engine)
log_file = argv[2]
lines = []
line_id = None
no = 0
with open(log_file, 'r') as f:
while True:
line = f.readline()
if not line:
save()
break
s = line.rstrip()
match = REGEX_FIRST_LINE.search(s)
if match:
save()
del lines[:]
line_id = md5(line.encode('utf-8')).hexdigest()
year, month, day, hour, minute, sec, msec, level, s = \
match.groups()
t = s.split()
s = ' '.join(t[1:])
loggers = t[0].strip('[]')
loggers = loggers.split('][')
without_tz = datetime(
int(year), int(month), int(day), int(hour),
int(minute), int(sec), int(msec)*1000)
created_at = tz.localize(without_tz) # with time zone
no += 1
print(f'#{no} {created_at}')
lines.append(s)
import os
import sys
from opensipkd.tools import get_settings
def is_live(pid):
try:
os.kill(pid, 0)
except OSError:
return
return True
def get_pid(pidfile):
try:
f = open(pidfile, 'r')
pid_int = int(f.read().split()[0])
f.close()
return pid_int
except IOError:
return
except ValueError:
return
except IndexError:
return
def get_pid_file(pid_name=None, settings=None):
if not pid_name:
pid_name = os.path.split(sys.argv[0])[-1]
pid_name = os.path.splitext(pid_name)[0]
if not settings:
settings = get_settings()
dir_path = 'session.lock_dir'
if not os.path.exists(dir_path):
mkdir(dir_path)
return os.path.join(dir_path, pid_name)
def make_pid(pid_file, settings=None):
pid = get_pid(pid_file)
if pid and is_live(pid):
msg = 'PID saya {pid} masih ada.'.format(pid=pid)
print(msg)
sys.exit()
pid = os.getpid()
f = open(pid_file, 'w')
f.write(str(pid))
f.close()
return pid
def one_pid():
pid_file = get_pid_file()
make_pid(pid_file)
return pid_file
def mkdir(dir_name):
if not os.path.exists(dir_name):
os.makedirs(dir_name)
def get_fullpath(filename):
dir_name = os.path.split(__file__)[0]
return os.path.join(dir_name, filename)
import logging import logging
# from opensipkd.tools import get_params # from opensipkd.tools import get_params
from opensipkd.models import (User, UserGroup, DBSession, ) from .models.users import (User, UserGroup, DBSession, )
from pyramid.security import remember, forget from pyramid.security import remember, forget
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def group_finder(user_id, request): def group_finder(user_id, request):
if user_id != 'None': if user_id != 'None':
q = DBSession.query(User).filter_by(id=user_id) q = DBSession.query(User).filter_by(id=user_id)
user = q.first() user = q.first()
else: else:
user = None user = None
if not user or not user.status: if not user or not user.status:
log.debug(f"user_id {user_id} not found or archived") log.debug(f"user_id {user_id} not found or archived")
return [] return []
r = [] r = []
q = DBSession.query(UserGroup).filter_by(user_id=user.id) q = DBSession.query(UserGroup).filter_by(user_id=user.id)
for ug in q: for ug in q:
acl_name = 'group:{gid}'.format(gid=ug.group_id) acl_name = 'group:{gid}'.format(gid=ug.group_id)
r.append(acl_name) r.append(acl_name)
return r return r
def get_user(request): def get_user(request):
user_id = request.authenticated_userid user_id = request.authenticated_userid
if user_id: if user_id:
q = DBSession.query(User).filter_by(id=user_id) q = DBSession.query(User).filter_by(id=user_id)
row = q.first() row = q.first()
#todo restrict multi browser #todo restrict multi browser
# if row and "g_state" not in request.cookies and \ # if row and "g_state" not in request.cookies and \
# ("token" not in request.session or # ("token" not in request.session or
# not request.session["token"] or # not request.session["token"] or
# row.security_code != request.session["token"]): # row.security_code != request.session["token"]):
# request.session.flash("Silahkan login ulang") # request.session.flash("Silahkan login ulang")
# headers = forget(request) # headers = forget(request)
# request.session.delete() # request.session.delete()
# request.response.headers.update(headers) # request.response.headers.update(headers)
# if "g_state" in request.cookies: # if "g_state" in request.cookies:
# request.response.delete_cookie("g_state", '/') # request.response.delete_cookie("g_state", '/')
# return # return
return row return row
# def get_user(request): # def get_user(request):
# user_id = request.unauthenticated_userid # user_id = request.unauthenticated_userid
# if user_id is not None: # if user_id is not None:
# user = DBSession.query(User).get(user_id) # user = DBSession.query(User).get(user_id)
# return user # return user
from pyramid.authentication import AuthTktCookieHelper from pyramid.authentication import AuthTktCookieHelper
from pyramid.authorization import ACLHelper, Authenticated, Everyone from pyramid.authorization import ACLHelper, Authenticated, Everyone
class MySecurityPolicy: class MySecurityPolicy:
def __init__(self, secret): def __init__(self, secret):
self.helper = AuthTktCookieHelper(secret) self.helper = AuthTktCookieHelper(secret)
def identity(self, request): def identity(self, request):
identity = self.helper.identify(request) identity = self.helper.identify(request)
if identity is None: if identity is None:
return None return None
userid = identity['userid'] userid = identity['userid']
principals = group_finder(userid, request) principals = group_finder(userid, request)
if principals is not None: if principals is not None:
return { return {
'userid': userid, 'userid': userid,
'principals': principals, 'principals': principals,
} }
def authenticated_userid(self, request): def authenticated_userid(self, request):
identity = request.identity identity = request.identity
if identity is not None: if identity is not None:
return identity['userid'] return identity['userid']
def permits(self, request, context, permission): def permits(self, request, context, permission):
identity = request.identity identity = request.identity
principals = set([Everyone]) principals = set([Everyone])
if identity is not None: if identity is not None:
principals.add(Authenticated) principals.add(Authenticated)
principals.add(identity['userid']) principals.add(identity['userid'])
principals.update(identity['principals']) principals.update(identity['principals'])
return ACLHelper().permits(context, principals, permission) return ACLHelper().permits(context, principals, permission)
def remember(self, request, userid, **kw): def remember(self, request, userid, **kw):
return self.helper.remember(request, userid, **kw) return self.helper.remember(request, userid, **kw)
def forget(self, request, **kw): def forget(self, request, **kw):
return self.helper.forget(request, **kw) return self.helper.forget(request, **kw)
{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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"}
\ No newline at end of file \ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.

4.25 KB | W: | H:

5.05 KB | W: | H:

opensipkd/base/static/icon/default.png
opensipkd/base/static/icon/default.png
opensipkd/base/static/icon/default.png
opensipkd/base/static/icon/default.png
  • 2-up
  • Swipe
  • Onion skin
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!