register

1 parent 9d5001ab
Showing 942 changed files with 1238 additions and 3059 deletions
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
.vs/
.vscode/
# C extensions
*.so
# Distribution / packaging
.Python
bak/
env/
env*/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
inventori/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# 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.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# dotenv
.env
# bat file
*.bat
# virtualenv
.venv
venv/
ENV/
# Spyder project settings
.spyderproject
# Rope project settings
.ropeproject
live.ini
.idea/
.project/
.DS_Store
opensipkd/base/static/img/*
opensipkd/base/static/icon/*
!opensipkd/base/static/icon/default.png
!opensipkd/base/static/img/pyramid.png
!opensipkd/base/static/img/opensipkd.png
!opensipkd/base/static/img/opensipkd_bg.png
!opensipkd/base/static/img/ajax-loader.gif
!opensipkd/base/static/img/line.png
!opensipkd/base/static/img/bootstrap.png
!opensipkd/base/static/img/postgree.png
alembic.ini
alembic_local.ini
.vs*
activate
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
.vs/
.vscode/
# C extensions
*.so
# Distribution / packaging
.Python
bak/
env/
env*/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
inventori/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# 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.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# dotenv
.env
# bat file
*.bat
# virtualenv
.venv
venv/
ENV/
# Spyder project settings
.spyderproject
# Rope project settings
.ropeproject
live.ini
.idea/
.project/
.DS_Store
opensipkd/base/static/img/*
opensipkd/base/static/icon/*
!opensipkd/base/static/icon/default.png
!opensipkd/base/static/img/pyramid.png
!opensipkd/base/static/img/opensipkd.png
!opensipkd/base/static/img/opensipkd_bg.png
!opensipkd/base/static/img/ajax-loader.gif
!opensipkd/base/static/img/line.png
!opensipkd/base/static/img/bootstrap.png
!opensipkd/base/static/img/postgree.png
alembic.ini
alembic_local.ini
.vs*
activate
4.0.0 17-11-2024
Penambahan Field pada tabel routes
Tabel Routes berfungsi juga sebagai menu generator
4.0.0 09-07-2024
Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0
beaker>=1.12.1
3.0.2 13-07-2023
Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0
beaker>=1.12.1
Ini sepertinya gak jadi
3.0.1 25-04-2022
Penambahan Feature ```detable```
3.0.0 26-08-2021
1. Penghapusan folder src
2. Perubahan ke base ciamis
3. Penambahan api sicantik
2.1.5 06-03-2021
Minor change
1. Perbaikan datatable sorting dengan inherite data di common.py
2. Penghapusan dukungan ke web-r authentication
3. Penambahan module External module login
2.1.4 06-01-2021
1. Penambahan function request.api_has_permission
2.0.3 25-12-2020
1. Penambahan tinymce
2. Perubahan MaskMoney
3. Pengurangan library static
2.0.2 22-11-2020
1. Penambahan field app_id pada tabel routes
2. Perubahan struktur csv di scripts/data/routes.csv mejadi
kode,path,nama,app_id,status,type
3. Functionality penggunakan config pyramid.includes
pyramid.includes =
pyramid_tm
pyramid_beaker
pyramid_chameleon
pyramid_rpc.jsonrpc
bjb.samsat
pyramid_debugtoolbar
4. Penggunaan Parameter modules depreceated
Setiap modules harus terdapat function includeme
def includeme():
app_id = 1
set_routes(app_id
config.scan('.')
5. function main() pada modules.__init__ depreceated
6. config(ini) depreceated
modules = module1, module2, ...
7. Penambahan Logging terhadap database::
[handlers]
keys = console, tabel, dblog
[handler_dblog]
class = opensipkd.base.handlers.SQLAlchemyHandler
args = ()
level = INFO
[logger_root]
level = INFO
handlers = console, filelog, dblog
[logger_opensipkd]
level = INFO
handlers = dblog
qualname = opensipkd
[handler_filelog]
class = FileHandler
args = ('file_location','a')
level = INFO
formatter = generic
8. Penambahan script import_log:
Digunakan untuk import data dari file log ke database
Sebaiknya diimport pada saat akan berpindah logging
$import_log config log_file
2.0.1 16-08-2020
Penambahan Error Rpc
2.0.0 16-08-2020
Pembuatan Branch Ciamis
Perbaikan Step PIP install
Perubahan setup.py
Perubahan ini file nama aplikasi opensipkd.base menjadi opensipkd_base
Perubahan penamaan folder src/opensipkd/base menjadi opensipkd/base
Penambahan Template Horizontal
Old
${structure form}
Label
Input
New
${structure form}
Label Input
0.1.4 08-11-2019
----------------
Pembuatan Branch Bandung
Penambahan method pada models user
Penambahan custom render
0.1.3 08-11-2019
----------------
- ZopeTransactionExtension diganti dengan register().
- README yang lebih baik.
0.1.2 10-02-2019
----------------
- Penambahan parameter 'db_session=DBSession' pada append_csv berfungsi apabila
caller mempunyai Session database yang berbeda
- Penambahan modules tools sub api.py, db.py, pbb.py
0.1.1 17-12-2018
----------------
- Form edit user bisa ubah password karena user non-manusia (host to host)
tidak punya email.
- .gitignore ditambah .DS_Store.
0.1 12-12-2018
--------------
- get_login_headers() menyimpan user.id pada cookie ketimbang user.user_email.
Akhirnya ini berdampak pada group_finder().
- RootFactory yang lebih efisien yaitu cukup berisi daftar hak akses, tidak
perlu melibatkan request.
- groups.py kini menyertakan hak akses dengan memanfaatkan tabel
groups_permissions bawaan ziggurat. Sebagai pendukung dibuatlah tabel
permissions yang berisi daftar hak akses sebagaimana yang tertera pada
function argument permission di setiap view function.
- 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,
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.
- initializedb.py saat INSERT data kini menggunakan format csv saja
dengan menggunakan dua fungsi:
- restore_csv() yang akan INSERT data hanya jika tabelnya masih kosong. Ini
cocok untuk tabel users.
- append_csv() yang akan INSERT data jika key pada tabel tidak ditemukan.
- Jika field pada csv merupakan foreign key maka nama field ditulis dengan
susunan nama-field-tabel-csv/nama-tabel-foreign.nama-field-foreign, contoh:
pemda_id/va_pemda.kode.
- Tabel user_ws diganti dengan field users.api_key.
- Admin bisa membuatkan API Key saat membuat user baru atau saat sedang edit.
- User bisa membuat ulang API Key jika memang terisi.
- Ada prosedur lupa password.
0.0.1 21-10-2017
----------------
- Penambahan Field type pada route default 0
- alter table routes add type not null default 0
- Field ini digunakan untuk menentukan jenis-renderer
- 0 Route Standar
- 1 Route JSON_RPC
0.0 24-9-2017 aa.gusti
----------------------
- Penambahan tabel parameters
0.0
---
4.0.0 17-11-2024
Penambahan Field pada tabel routes
Tabel Routes berfungsi juga sebagai menu generator
4.0.0 09-07-2024
Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0
beaker>=1.12.1
3.0.2 13-07-2023
Perubahan Colander>2.0
Perubahan SQLAlchemy>2.0
beaker>=1.12.1
Ini sepertinya gak jadi
3.0.1 25-04-2022
Penambahan Feature ```detable```
3.0.0 26-08-2021
1. Penghapusan folder src
2. Perubahan ke base ciamis
3. Penambahan api sicantik
2.1.5 06-03-2021
Minor change
1. Perbaikan datatable sorting dengan inherite data di common.py
2. Penghapusan dukungan ke web-r authentication
3. Penambahan module External module login
2.1.4 06-01-2021
1. Penambahan function request.api_has_permission
2.0.3 25-12-2020
1. Penambahan tinymce
2. Perubahan MaskMoney
3. Pengurangan library static
2.0.2 22-11-2020
1. Penambahan field app_id pada tabel routes
2. Perubahan struktur csv di scripts/data/routes.csv mejadi
kode,path,nama,app_id,status,type
3. Functionality penggunakan config pyramid.includes
pyramid.includes =
pyramid_tm
pyramid_beaker
pyramid_chameleon
pyramid_rpc.jsonrpc
bjb.samsat
pyramid_debugtoolbar
4. Penggunaan Parameter modules depreceated
Setiap modules harus terdapat function includeme
def includeme():
app_id = 1
set_routes(app_id
config.scan('.')
5. function main() pada modules.__init__ depreceated
6. config(ini) depreceated
modules = module1, module2, ...
7. Penambahan Logging terhadap database::
[handlers]
keys = console, tabel, dblog
[handler_dblog]
class = opensipkd.base.handlers.SQLAlchemyHandler
args = ()
level = INFO
[logger_root]
level = INFO
handlers = console, filelog, dblog
[logger_opensipkd]
level = INFO
handlers = dblog
qualname = opensipkd
[handler_filelog]
class = FileHandler
args = ('file_location','a')
level = INFO
formatter = generic
8. Penambahan script import_log:
Digunakan untuk import data dari file log ke database
Sebaiknya diimport pada saat akan berpindah logging
$import_log config log_file
2.0.1 16-08-2020
Penambahan Error Rpc
2.0.0 16-08-2020
Pembuatan Branch Ciamis
Perbaikan Step PIP install
Perubahan setup.py
Perubahan ini file nama aplikasi opensipkd.base menjadi opensipkd_base
Perubahan penamaan folder src/opensipkd/base menjadi opensipkd/base
Penambahan Template Horizontal
Old
${structure form}
Label
Input
New
${structure form}
Label Input
0.1.4 08-11-2019
----------------
Pembuatan Branch Bandung
Penambahan method pada models user
Penambahan custom render
0.1.3 08-11-2019
----------------
- ZopeTransactionExtension diganti dengan register().
- README yang lebih baik.
0.1.2 10-02-2019
----------------
- Penambahan parameter 'db_session=DBSession' pada append_csv berfungsi apabila
caller mempunyai Session database yang berbeda
- Penambahan modules tools sub api.py, db.py, pbb.py
0.1.1 17-12-2018
----------------
- Form edit user bisa ubah password karena user non-manusia (host to host)
tidak punya email.
- .gitignore ditambah .DS_Store.
0.1 12-12-2018
--------------
- get_login_headers() menyimpan user.id pada cookie ketimbang user.user_email.
Akhirnya ini berdampak pada group_finder().
- RootFactory yang lebih efisien yaitu cukup berisi daftar hak akses, tidak
perlu melibatkan request.
- groups.py kini menyertakan hak akses dengan memanfaatkan tabel
groups_permissions bawaan ziggurat. Sebagai pendukung dibuatlah tabel
permissions yang berisi daftar hak akses sebagaimana yang tertera pada
function argument permission di setiap view function.
- 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,
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.
- initializedb.py saat INSERT data kini menggunakan format csv saja
dengan menggunakan dua fungsi:
- restore_csv() yang akan INSERT data hanya jika tabelnya masih kosong. Ini
cocok untuk tabel users.
- append_csv() yang akan INSERT data jika key pada tabel tidak ditemukan.
- Jika field pada csv merupakan foreign key maka nama field ditulis dengan
susunan nama-field-tabel-csv/nama-tabel-foreign.nama-field-foreign, contoh:
pemda_id/va_pemda.kode.
- Tabel user_ws diganti dengan field users.api_key.
- Admin bisa membuatkan API Key saat membuat user baru atau saat sedang edit.
- User bisa membuat ulang API Key jika memang terisi.
- Ada prosedur lupa password.
0.0.1 21-10-2017
----------------
- Penambahan Field type pada route default 0
- alter table routes add type not null default 0
- Field ini digunakan untuk menentukan jenis-renderer
- 0 Route Standar
- 1 Route JSON_RPC
0.0 24-9-2017 aa.gusti
----------------------
- Penambahan tabel parameters
0.0
---
- Initial version
\ No newline at end of file
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
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
# 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
###
# 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:5433/magelang
;pbb.url = oracle+oracledb://pbb:A@10.8.50.62:1521/simpbb
pbb.url = oracle://pbb:A@10.8.50.62:1521/simpbb
lib_dir = C:\app\instantclient_11_2
temp_dir = C:\tmp
pbb_pemda = 32.79
allow_register = true
pyramid.includes =
pyramid_tm
pyramid_beaker
pyramid_chameleon
pyramid_debugtoolbar
pyramid_rpc.jsonrpc
opensipkd.tools
opensipkd.pjdl.models
opensipkd.pjdl.apps
opensipkd.bphtb.models
opensipkd.bphtb.apps
pjdl_invoice_sspd=99
pjdl_invoice_sptpd=1
pjdl_invoice_stpd=False
pjdl_report_files=False #Isikan daftar file-report jika bukan default
devel = true
session.type = ext:database
session.secret = s0s3cr3ts
session.cookie_expires = true
session.key = WhatEver
session.url = postgresql://aagusti:a@localhost:5433/magelang
session.timeout = 3000
session.lock_dir = %(here)s/tmp
;login_tpl = opensipkd.samsat.jabar.views:templates/login.pt
timezone = Asia/Jakarta
;localization = id_ID.UTF-8
#localization = Indonesian_indonesia.1252
localization = English_Australia.1252
;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
[alembic_ziggurat]
script_location = ziggurat_foundations:migrations
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang
# End logging configuration
[alembic_base]
script_location = opensipkd.base:alembic
sqlalchemy.url = postgresql://aagusti:a@localhost:5433/magelang
[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
###
# 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:5432/demo2
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
# Base Configuration
temp_files = C:\tmp
partner_doc = C:\\tmp\\docs\\partner\\
# Registrasi User
allow_register = 1
reg_form =
reg_idcard = 1
reg_captcha = 1
reg_verify = 1
;reg_form =
login_tpl =
login_captcha = 1
;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
# 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.scripts: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
###
# 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 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
__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__)
log.warning('Use opensipkd.models')
from opensipkd.models import *
from .meta import *
from .common import *
from .base import *
from .users import *
from .wilayah import *
from .partner import *
......@@ -11,7 +11,6 @@ from zope.sqlalchemy import register
_logging = logging.getLogger(__name__)
class MySession(Session):
def execute(self, clause, params=None, mapper=None, **kw):
# Your magic with clause here
......@@ -69,8 +68,7 @@ class CommonModel(object):
def from_dict(self, values, date_format="%d-%m-%Y"):
for column in self.__table__.columns:
if column.name in values:
_logging.debug(
f"{column.name}: {column.type}: {values[column.name]}")
_logging.debug(f"{column.name}: {column.type}: {values[column.name]}")
if type(column.type) is DateTime and date_format:
if values[column.name] and type(values[column.name]) is String:
setattr(self, column.name,
......@@ -112,7 +110,7 @@ class DefaultModel(CommonModel):
return query
@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)
for c in columns:
query = query.add_columns(c)
......@@ -222,4 +220,4 @@ class NamaModel(KodeModel):
@classmethod
def get_list(cls):
return cls.query_list().all()
return cls.query_list().all()
\ 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
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
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
<?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
<?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
<?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
Generic single-database configuration.
\ No newline at end of file
"""Pyramid bootstrap environment. """
import os
import importlib.machinery
from alembic import context
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from sqlalchemy import engine_from_config
from opensipkd.models.meta import Base
config = context.config
setup_logging(config.config_file_name)
settings = get_appsettings(config.config_file_name)
target_metadata = Base.metadata
current_dir = os.path.split(__file__)[0]
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.
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
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
context.configure(url=settings['sqlalchemy.url'],
version_table='alembic_base')
with context.begin_transaction():
context.run_migrations()
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
engine = engine_from_config(settings, prefix='sqlalchemy.')
connection = engine.connect()
context.configure(
connection=connection,
target_metadata=target_metadata,
helpers=helpers,
version_table='alembic_base',
version_table_schema='public'
)
try:
with context.begin_transaction():
context.run_migrations()
finally:
connection.close()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
"""Pyramid bootstrap environment. """
import logging
import os
import importlib.machinery
from alembic import context
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from sqlalchemy import engine_from_config
from opensipkd.base.models.meta import Base
config = context.config
setup_logging(config.config_file_name)
settings = get_appsettings(config.config_file_name)
logging.info(settings)
target_metadata = Base.metadata
current_dir = os.path.split(__file__)[0]
helper_file = os.path.join(current_dir, 'helpers.py')
loader = importlib.machinery.SourceFileLoader('alembic_helpers', helper_file)
helpers = loader.load_module()
version_table = 'alembic_models'
version_table_schema = 'public'
def run_migrations_offline():
"""Run migrations in 'offline' mode.
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
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
"""
context.configure(url=settings['sqlalchemy.url'],
version_table=version_table)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
engine = engine_from_config(settings, prefix='sqlalchemy.')
connection = engine.connect()
context.configure(
connection=connection,
target_metadata=target_metadata,
helpers=helpers,
version_table=version_table,
version_table_schema=version_table_schema
)
try:
with context.begin_transaction():
context.run_migrations()
finally:
connection.close()
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
\ No newline at end of file
# http://www.derstappen-it.de/tech-blog/sqlalchemie-alembic-check-if-table-has-column
from alembic import op
from sqlalchemy.engine import reflection
import sqlalchemy as sa
def has_table(table, schema=None, insp=None):
if not insp:
engine = op.get_bind()
insp = reflection.Inspector.from_engine(engine)
return insp.has_table(table, schema=schema)
def table_has_column(table, column, schema=None):
engine = op.get_bind()
insp = reflection.Inspector.from_engine(engine)
has_column = False
if has_table(table, schema, insp):
for col in insp.get_columns(table, schema=schema):
if column != col['name']:
continue
has_column = True
else:
has_column = True
return has_column
def table_has_seq(table, name, schema=None):
engine = op.get_bind()
insp = reflection.Inspector.from_engine(engine)
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)
# http://www.derstappen-it.de/tech-blog/sqlalchemie-alembic-check-if-table-has-column
from alembic import op
from sqlalchemy.engine import reflection
import sqlalchemy as sa
def has_table(table, schema=None, insp=None):
if not insp:
engine = op.get_bind()
insp = reflection.Inspector.from_engine(engine)
return insp.has_table(table, schema=schema)
def table_has_column(table, column, schema=None):
engine = op.get_bind()
insp = reflection.Inspector.from_engine(engine)
has_column = False
if has_table(table, schema, insp):
for col in insp.get_columns(table, schema=schema):
if column != col['name']:
continue
has_column = True
return has_column
def fields_update(table, field, typ, schema="public"):
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)
\ No newline at end of file
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}
def upgrade():
${upgrades if upgrades else "pass"}
def downgrade():
${downgrades if downgrades else "pass"}
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}
def upgrade():
${upgrades if upgrades else "pass"}
def downgrade():
${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
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
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
group_id/groups.group_name,perm_name
"Superuser","user-edit"
"Superuser","user-view"
"Superuser","user-group"
"Superuser","upload-logo"
"Superuser","departemen"
"Superuser","partner-departemen"
"Superuser","partner"
"Superuser","parameter"
"Superuser","permission"
"Web Service","web-service"
"Pindah Departemen","departemen-all"
group_id/groups.group_name,perm_name
"Superuser","user-edit"
"Superuser","user-view"
"Superuser","user-group"
"Superuser","upload-logo"
"Superuser","departemen"
"Superuser","partner-departemen"
"Superuser","partner"
"Superuser","parameter"
"Superuser","permission"
"Web Service","web-service"
"Pindah Departemen","departemen-all"
"Guest", "guest"
\ No newline at end of file
group_name,description,member_count
"Superuser","Superuser",0
"Web Service","Webservice",0
"Pindah Departemen","Pindah Departemen",0
group_name,description,member_count
"Superuser","Superuser",0
"Web Service","Webservice",0
"Pindah Departemen","Pindah Departemen",0
"Guest","Guest",0
\ 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
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
kode,value,nama
company,open SIPKD, Nama Organisasi
ibukota,BEKASI
departement,Divisi Teknologi Informasi
address_1,Jati Asih
address_2,Bekasi
unoconv_py,"",path_python_libreoffice
unoconv_bin,"",env_unoconv_executable
ocr_bin,"",path_for_ocr_executable
menus,login:LOGIN,"List Menu Separated By comma"
modules_default,"","Module Default"
app_name,DEMO,"Nama Aplikasi"
allow_register,False,"Allow User Self Register"
change_unit,False,"Allow User to change Unit"
departemen_chg_id,3,"Devault Level Departemen to change"
default_group,Guest,"Default group for new user"
kode,value,nama
company,open SIPKD, Nama Organisasi
ibukota,BEKASI
departement,Divisi Teknologi Informasi
address_1,Jati Asih
address_2,Bekasi
unoconv_py,"",path_python_libreoffice
unoconv_bin,"",env_unoconv_executable
ocr_bin,"",path_for_ocr_executable
menus,login:LOGIN,"List Menu Separated By comma"
modules_default,"","Module Default"
app_name,DEMO,"Nama Aplikasi"
allow_register,False,"Allow User Self Register"
change_unit,False,"Allow User to change Unit"
departemen_chg_id,3,"Devault Level Departemen to change"
default_group,Guest,"Default group for new user"
perm_name,description
admin,Administrator
guest,Guest
user-edit,User management
user-view,User view
user-group,User Group
edit-title,Edit Title
upload-logo,Upload Logo
departemen,Departemen
partner-departemen,Partner Departemen
partner,Partner
parameter,Parameter
permission,Permission
web-service,WEB SERVICE RPC
perm_name,description
admin,Administrator
guest,Guest
user-edit,User management
user-view,User view
user-group,User Group
edit-title,Edit Title
upload-logo,Upload Logo
departemen,Departemen
partner-departemen,Partner Departemen
partner,Partner
parameter,Parameter
permission,Permission
web-service,WEB SERVICE RPC
departemen-all,Pindah antar Departemen
\ 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
admin@local.host,1,admin
guest@local.host,1,guest
email,status,user_name
admin@local.host,1,admin
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
# from opensipkd.tools import get_params
from opensipkd.models import (User, UserGroup, DBSession, )
from pyramid.security import remember, forget
log = logging.getLogger(__name__)
def group_finder(user_id, request):
if user_id != 'None':
q = DBSession.query(User).filter_by(id=user_id)
user = q.first()
else:
user = None
if not user or not user.status:
log.debug(f"user_id {user_id} not found or archived")
return []
r = []
q = DBSession.query(UserGroup).filter_by(user_id=user.id)
for ug in q:
acl_name = 'group:{gid}'.format(gid=ug.group_id)
r.append(acl_name)
return r
def get_user(request):
user_id = request.authenticated_userid
if user_id:
q = DBSession.query(User).filter_by(id=user_id)
row = q.first()
#todo restrict multi browser
# if row and "g_state" not in request.cookies and \
# ("token" not in request.session or
# not request.session["token"] or
# row.security_code != request.session["token"]):
# request.session.flash("Silahkan login ulang")
# headers = forget(request)
# request.session.delete()
# request.response.headers.update(headers)
# if "g_state" in request.cookies:
# request.response.delete_cookie("g_state", '/')
# return
return row
# def get_user(request):
# user_id = request.unauthenticated_userid
# if user_id is not None:
# user = DBSession.query(User).get(user_id)
# return user
from pyramid.authentication import AuthTktCookieHelper
from pyramid.authorization import ACLHelper, Authenticated, Everyone
class MySecurityPolicy:
def __init__(self, secret):
self.helper = AuthTktCookieHelper(secret)
def identity(self, request):
identity = self.helper.identify(request)
if identity is None:
return None
userid = identity['userid']
principals = group_finder(userid, request)
if principals is not None:
return {
'userid': userid,
'principals': principals,
}
def authenticated_userid(self, request):
identity = request.identity
if identity is not None:
return identity['userid']
def permits(self, request, context, permission):
identity = request.identity
principals = set([Everyone])
if identity is not None:
principals.add(Authenticated)
principals.add(identity['userid'])
principals.update(identity['principals'])
return ACLHelper().permits(context, principals, permission)
def remember(self, request, userid, **kw):
return self.helper.remember(request, userid, **kw)
def forget(self, request, **kw):
return self.helper.forget(request, **kw)
import logging
# from opensipkd.tools import get_params
from .models.users import (User, UserGroup, DBSession, )
from pyramid.security import remember, forget
log = logging.getLogger(__name__)
def group_finder(user_id, request):
if user_id != 'None':
q = DBSession.query(User).filter_by(id=user_id)
user = q.first()
else:
user = None
if not user or not user.status:
log.debug(f"user_id {user_id} not found or archived")
return []
r = []
q = DBSession.query(UserGroup).filter_by(user_id=user.id)
for ug in q:
acl_name = 'group:{gid}'.format(gid=ug.group_id)
r.append(acl_name)
return r
def get_user(request):
user_id = request.authenticated_userid
if user_id:
q = DBSession.query(User).filter_by(id=user_id)
row = q.first()
#todo restrict multi browser
# if row and "g_state" not in request.cookies and \
# ("token" not in request.session or
# not request.session["token"] or
# row.security_code != request.session["token"]):
# request.session.flash("Silahkan login ulang")
# headers = forget(request)
# request.session.delete()
# request.response.headers.update(headers)
# if "g_state" in request.cookies:
# request.response.delete_cookie("g_state", '/')
# return
return row
# def get_user(request):
# user_id = request.unauthenticated_userid
# if user_id is not None:
# user = DBSession.query(User).get(user_id)
# return user
from pyramid.authentication import AuthTktCookieHelper
from pyramid.authorization import ACLHelper, Authenticated, Everyone
class MySecurityPolicy:
def __init__(self, secret):
self.helper = AuthTktCookieHelper(secret)
def identity(self, request):
identity = self.helper.identify(request)
if identity is None:
return None
userid = identity['userid']
principals = group_finder(userid, request)
if principals is not None:
return {
'userid': userid,
'principals': principals,
}
def authenticated_userid(self, request):
identity = request.identity
if identity is not None:
return identity['userid']
def permits(self, request, context, permission):
identity = request.identity
principals = set([Everyone])
if identity is not None:
principals.add(Authenticated)
principals.add(identity['userid'])
principals.update(identity['principals'])
return ACLHelper().permits(context, principals, permission)
def remember(self, request, userid, **kw):
return self.helper.remember(request, userid, **kw)
def forget(self, 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
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!