tangsel apps

1 parent c459ab6b
...@@ -22,9 +22,9 @@ pyramid.includes = ...@@ -22,9 +22,9 @@ pyramid.includes =
pyramid_chameleon pyramid_chameleon
pyramid_rpc.jsonrpc pyramid_rpc.jsonrpc
pyramid_debugtoolbar pyramid_debugtoolbar
tangsel.pbb.models ; tangsel.pbb.models
tangsel.pbb.esppt ; tangsel.pbb.esppt
tangsel.pbb.monitoring ; tangsel.pbb.monitoring
session.type = ext:database session.type = ext:database
......
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
...@@ -36,7 +36,7 @@ renderer = deform.ZPTRendererFactory(search_path) ...@@ -36,7 +36,7 @@ renderer = deform.ZPTRendererFactory(search_path)
deform.Form.set_zpt_renderer(search_path) deform.Form.set_zpt_renderer(search_path)
main_title = 'openSIPKD' main_title = 'tangSEL Apps'
titles = {} titles = {}
static_route = [] static_route = []
...@@ -94,7 +94,7 @@ def add_cors_headers_response_callback(event): ...@@ -94,7 +94,7 @@ def add_cors_headers_response_callback(event):
event.request.add_response_callback(cors_headers) event.request.add_response_callback(cors_headers)
def get_app_name(request): def get_app_name(request):
return get_params('app_name', 'openSIPKD Application') return get_params('app_name', 'tangSEL Apps')
def get_menus(request): def get_menus(request):
""" """
...@@ -149,7 +149,7 @@ def get_title(request): ...@@ -149,7 +149,7 @@ def get_title(request):
return titles[route_name] return titles[route_name]
def get_company(request): def get_company(request):
return get_params('company', 'openSIPKD').upper() return get_params('company', 'tangSEL').upper()
def format_datetime(v): def format_datetime(v):
if v.time() != datetime.time(0, 0): if v.time() != datetime.time(0, 0):
...@@ -195,7 +195,7 @@ def google_signin_client_id(request): ...@@ -195,7 +195,7 @@ def google_signin_client_id(request):
def get_config(settings): def get_config(settings):
session_factory = session_factory_from_settings(settings) session_factory = session_factory_from_settings(settings)
config = Configurator(settings=settings, config = Configurator(settings=settings,
root_factory='opensipkd.base.models.users.RootFactory', root_factory='tangsel.base.models.users.RootFactory',
session_factory=session_factory) session_factory=session_factory)
config.set_default_csrf_options(require_csrf=False) config.set_default_csrf_options(require_csrf=False)
config.set_security_policy(MySecurityPolicy(settings["session.secret"])) config.set_security_policy(MySecurityPolicy(settings["session.secret"]))
...@@ -213,7 +213,7 @@ def get_config(settings): ...@@ -213,7 +213,7 @@ def get_config(settings):
'google_signin_client_ids', reify=True) 'google_signin_client_ids', reify=True)
config.add_request_method(allow_register, 'allow_register', reify=True) config.add_request_method(allow_register, 'allow_register', reify=True)
config.add_static_view('static', 'opensipkd.base:static', config.add_static_view('static', 'tangsel.base:static',
cache_max_age=3600) cache_max_age=3600)
config.add_static_view('deform_static', 'deform:static', config.add_static_view('deform_static', 'deform:static',
cache_max_age=3600) cache_max_age=3600)
...@@ -398,8 +398,7 @@ class BaseApp(): ...@@ -398,8 +398,7 @@ class BaseApp():
'docs/partner', self.partner_doc, cache_max_age=0) 'docs/partner', self.partner_doc, cache_max_age=0)
config.add_static_view('captcha', self.captcha_files, cache_max_age=0) config.add_static_view('captcha', self.captcha_files, cache_max_age=0)
def add_menu(self, config, route_menus, parent=None, paket="tangsel.base.views"):
def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views"):
route_names = [] route_names = []
for route in route_menus: for route in route_menus:
# if not int(route.get("status", 0)): # if not int(route.get("status", 0)):
...@@ -463,7 +462,7 @@ class BaseApp(): ...@@ -463,7 +462,7 @@ class BaseApp():
if p["children"]: if p["children"]:
self.route_children(p["children"], row) self.route_children(p["children"], row)
def route_from_csv(self, config, paket="opensipkd.base.views", filename="routes.csv"): def route_from_csv(self, config, paket="tangsel.base.views", filename="routes.csv"):
with self.get_route_file(filename) as f: with self.get_route_file(filename) as f:
rows = csv.DictReader(f) rows = csv.DictReader(f)
new_routes = [] new_routes = []
...@@ -482,7 +481,7 @@ class BaseApp(): ...@@ -482,7 +481,7 @@ class BaseApp():
self.add_menu(config, new_routes, None, paket) self.add_menu(config, new_routes, None, paket)
def route_from_list(self, config, routs=[], paket="opensipkd.base.views"): def route_from_list(self, config, routs=[], paket="tangsel.base.views"):
new_routes = [] new_routes = []
for route in routs: for route in routs:
d = {"kode": route[0], d = {"kode": route[0],
......
from .meta import * from .meta import *
from .base import * from .base import *
from .users import * from .users import *
from .wilayah import *
from .partner import *
# from .common import * # from .common import *
# from .wilayah import *
# from .partner import *
# from .targets import * # from .targets import *
# from .user_area import * # from .user_area import *
from sqlalchemy import (Column, Integer, String, DateTime, func, ) from sqlalchemy import (Column, Integer, String, DateTime, func, )
from sqlalchemy.orm import (scoped_session, sessionmaker, ) from sqlalchemy.orm import (scoped_session, sessionmaker, )
from .base import CommonModel from . import Base, CommonModel
from .meta import Base
factory = sessionmaker(autoflush=True, autocommit=True) factory = sessionmaker(autoflush=True, autocommit=True)
LogDBSession = scoped_session(factory) LogDBSession = scoped_session(factory)
......
from sqlalchemy import (
Column,
Integer,
BigInteger,
func,
)
from . import NamaModel, Base, DBSession
class Targets(Base, NamaModel):
__tablename__ = 'targets'
__table_args__ = {'extend_existing': True}
tahun = Column(Integer, nullable=False)
jenis = Column(Integer, nullable=False)
m01 = Column(BigInteger, nullable=False)
m02 = Column(BigInteger, nullable=False)
m03 = Column(BigInteger, nullable=False)
m04 = Column(BigInteger, nullable=False)
m05 = Column(BigInteger, nullable=False)
m06 = Column(BigInteger, nullable=False)
m07 = Column(BigInteger, nullable=False)
m08 = Column(BigInteger, nullable=False)
m09 = Column(BigInteger, nullable=False)
m10 = Column(BigInteger, nullable=False)
m11 = Column(BigInteger, nullable=False)
m12 = Column(BigInteger, nullable=False)
@classmethod
def query_jenis_sum(cls, tahun, jenis):
return DBSession.query(cls.tahun, cls.jenis,
func.sum(cls.m01).label('m01'), func.sum(cls.m02).label('m02'),
func.sum(cls.m03).label('m03'), func.sum(cls.m04).label('m04'),
func.sum(cls.m05).label('m05'), func.sum(cls.m06).label('m06'),
func.sum(cls.m06).label('m07'), func.sum(cls.m08).label('m08'),
func.sum(cls.m09).label('m09'), func.sum(cls.m10).label('m10'),
func.sum(cls.m11).label('m11'), func.sum(cls.m12).label('m12'),
). \
group_by(cls.tahun, cls.jenis, ). \
filter(cls.tahun == tahun, cls.jenis == jenis)
class TargetJenis(Base, NamaModel):
__tablename__ = 'target_jenis'
__table_args__ = {'extend_existing': True}
from sqlalchemy import (
Column,
ForeignKey,
String,
SmallInteger,
)
from sqlalchemy.orm import relationship, backref
from . import Base, TABLE_ARGS, NamaModel
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()
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:hover {
color: #555!important
}
#loading {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: fixed;
display: block;
opacity: 0.7;
background-color: #fff;
z-index: 1000;
text-align: center;
}
#loading-image {
display:block;
margin-top: auto;
margin-bottom: auto;
margin-left: auto;
margin-right: auto;
/*width: 10%;*/
z-index: 1000;
}
body {
background: 0 0;
background-image: url(/static/img/background.png);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed
}
.navbar-default .navbar-nav>li>a {
color: #fff
}
.navbar-default .navbar-nav>li>a:hover {
color: #fff
}
.project-context .title-page {
font-size: 16px;
line-height: 40px;
color: #474544
}
.dataTable td {
transition: opacity 1s ease 0s
}
body,
html {
overflow-x: hidden
}
.well {
background-color: #fff
}
#header {
background-image: none!important;
background-color: #57889c!important;
box-shadow: none!important;
border: 0!important;
height:auto !important;
}
.container {
height: 100%
}
.fixed-navigation nav>ul {
height: auto
}
#header #logo-group {
padding: 2px 5px
}
#header #logo-group #logo {
margin: 0
}
#header #logo-group #logo img {
height: 44px;
width: auto;
margin: 0
}
.project-context .title-page {
font-weight: 400;
color: #fff
}
#header .header-dropdown-list a.dropdown-toggle,
.project-context .label,
.project-context .project-selector {
color: #fff
}
.project-context .label {
text-shadow: none
}
#header #fullscreen a,
#header #hide-menu a {
background-image: none;
background-color: #fff;
border: 0;
color:#222;
}
.alert {
border-left-width: 0
}
.btn-primary {
background-color: #57889c!important;
color: #fff!important;
border: 0
}
.btn-default {
background-color: #e6e6e6!important;
color: #676767!important;
border: 0
}
.alert-info,
.btn-info {
background-color: #1956af!important;
color: #fff!important
}
.alert-success,
.btn-success {
background-color: #00a65a!important;
color: #fff!important
}
.alert-warning,
.btn-warning {
background-color: #f39c12!important;
color: #fff!important
}
.alert-danger,
.btn-danger {
background-color: #dd4b39!important;
color: #fff!important
}
.btn {
border: 0!important
}
.help-block {
color: #f30303!important
}
nav ul li a i {
width: 24px!important
}
@media only screen and (max-width:768px) {
#header #fullscreen a,
#header #hide-menu a {
background-image: none;
background-color: rgba(255, 255, 255, 0);
border: 0
}
#hide-menu i {
color: #fff!important
}
}
.btn,
a:link,
button {
-webkit-tap-highlight-color: rgba(87, 136, 156, .5)
}
.panel {
border: 1px solid #ddd!important
}
.panel-danger {
border-color: #dd4b39
}
.panel-success {
border-color: #00a65a
}
.panel-info {
/*border-color: #1956af*/
border-color: #57889c
}
.panel-warning {
border-color: #f39c12
}
.panel-danger>.panel-heading {
color: #fff;
background-color: #dd4b39;
border-color: #dd4b39
}
.panel-success>.panel-heading {
color: #fff;
background-color: #00a65a;
border-color: #00a65a
}
.panel-info>.panel-heading {
color: #fff;
/*background-color: #1956af;*/
background-color: #57889c;
border-color: #57889c
/*border-color: #1956af*/
}
.panel-warning>.panel-heading {
color: #fff;
background-color: #f39c12;
border-color: #f39c12
}
table.dataTable tr.selected td {
background-color: #9fafd1
}
:fullscreen #fullscreen>:first-child>a {
color: #6d6a69
}
.select2-selection__rendered {
padding-left: 0
}
.select2-selection--single {
height: 32px!important;
border-radius: 0!important;
border: 1px solid #ccc!important
}
div.toolbar::after {
content: "\0020";
width:100vw;
display:block;
clear:both;
}
div.dataTables_length select,
div.dataTables_filter input {
display:inline;
}
div.dataTables_filter label {
margin-bottom:0px;
}
div.dataTables_length label {
margin-bottom:0px;
}
.dataTables_wrapper {
overflow-x:scroll !important;
}
.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 {
padding-left:7px;
padding-right:7px;
}
.dataTables_length {
margin-left:6px;
}
.ui-autocomplete-loading {
padding-right:10px;
background: url("../img/loading.gif") right 10px center no-repeat !important;
}
.ui-autocomplete {
max-height: 200px;
overflow-y: auto;
overflow-x: hidden;
}
.panel-body {
margin: 0 auto !important;
}
.col-md-5 {
padding: 0px 15px !important;
}
form.form-horizontal {
padding: 0 !important;
}
div.col-md-6 {
padding-right: 12px !important;
padding-left: 15px !important;
}
.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
padding: .25rem .5rem !important;
line-height: normal;
font-size: 12px;
border-radius: 0 !important;
}
.form-control{
font-size:10px !important;
height: 26px;
padding: 3px 6px;
margin-bottom: 1px !important;
}
.form-control-static {
border: 1px solid #ccc;
padding: 6px 6px;
height: 26px;
background-color: #ccc;
font-size: 10px;
margin-bottom: 1px;
}
.control-label{
font-size:10px !important;
padding: 3px 6px!important;
margin-top: 1px !important;
margin-bottom: 1px !important;
}
.help-block{
font-size:10px !important;
padding: 1px 1px !important;
}
.input-group-addon {
padding: 3px 3px !important;
font-size: 10px !important;
}
.input-group-addon:first-child {
padding: 3px 3px !important;
font-size: 10px !important;
}
.input-group {
padding: 3px 3px 7px !important;
font-size: 10px !important;
}
.form-group {
text-align: left;
margin-top:5px !important;
margin-bottom:5px !important;
}
.dataTables_filter .input-group-addon{
width: 32px !important;
margin-top: 0 !important;
float: left !important;
height: 26px !important;
padding-top: 4px !important;
}
.fc-border-separate thead tr, .table thead tr {
font-size:10px !important;
}
.twitter-typeahead{
font-size: 10px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:2;
}
.twitter-typeahead .tt-query, .twitter-typeahead .tt-hint {
font-size: 10px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:2;
}
.table-responsive {
overflow-x: hidden !important;
}
.dataTables_wrapper {
overflow-x: hidden !important;
}
.dataTables_filter{
margin-left: -8px !important;
}
.table tbody tr td {
font-size: 10px;
}
.span-new {
border-left: 0;
margin: -5px;
border: -12px;
padding: 7px !important;
}
.form-horizontal .checkbox, .form-horizontal .radio {
padding: 0px;
}
.checkbox, .radio {
position: relative;
display: block;
margin-top: 3px;
margin-bottom: 3px;
}
.form-tutup {
margin-left: 5px;
}
.footer-me {
padding-top: -16px;
margin-top: 4px;
}
.alert-success {
margin-bottom: 5px;
margin-left: 8px;
margin-right: 8px;
}
.alert-danger {
margin-bottom: 5px;
margin-left: 8px;
margin-right: 8px;
}
.twitter-typeahead .tt-query, .twitter-typeahead .tt-hint {
font-size: 10px !important;
}
.disabled {
color:
#000;
}
.checkbox label, .radio label {
font-size: 10px !important;
}
input[type="checkbox"], input[type="radio"] {
margin-top: 1px !important;
}
.list-group, .list-group-item {
font-size: 10px !important;
padding: 6px 15px !important;
}
.content-image {
display: block;
}
.img-float {
float: left;
width: 150px;
height: 150px;
margin: 0 20px 10px 0;
padding: 10px;
border: 1px solid white;
display: inline-block;
-webkit-box-shadow: inset 0 0 20px #ADADAD;
box-shadow: inset 0 0 20px #ADADAD;
}
}
...@@ -5,13 +5,13 @@ from pyramid.httpexceptions import ( ...@@ -5,13 +5,13 @@ from pyramid.httpexceptions import (
HTTPSeeOther) HTTPSeeOther)
from pyramid.interfaces import IRoutesMapper from pyramid.interfaces import IRoutesMapper
from pyramid.view import view_config from pyramid.view import view_config
from opensipkd.base import get_params, get_home from tangsel.base import get_params, get_home
from pyramid.renderers import render_to_response from pyramid.renderers import render_to_response
#, get_urls #, get_urls
from .base_views import BaseView from .base_views import BaseView
#, DataTables #, DataTables
from datetime import timedelta from datetime import timedelta
from opensipkd.detable import * from tangsel.detable import *
from .common import ColumnDT, DataTables from .common import ColumnDT, DataTables
from opensipkd.tools import mem_tmp_store from opensipkd.tools import mem_tmp_store
from deform import ( from deform import (
......
...@@ -5,7 +5,6 @@ from datetime import datetime ...@@ -5,7 +5,6 @@ from datetime import datetime
# from email.utils import parseaddr # from email.utils import parseaddr
import colander import colander
from opensipkd.base import BASE_CLASS
from pyramid.csrf import new_csrf_token, get_csrf_token from pyramid.csrf import new_csrf_token, get_csrf_token
from datatables import ColumnDT from datatables import ColumnDT
# from dateutil.relativedelta import relativedelta # from dateutil.relativedelta import relativedelta
...@@ -22,6 +21,7 @@ from opensipkd.tools.buttons import ( ...@@ -22,6 +21,7 @@ from opensipkd.tools.buttons import (
btn_pdf, btn_unpost, btn_post, btn_upload) btn_pdf, btn_unpost, btn_post, btn_upload)
# from opensipkd.tools.captcha import get_captcha # from opensipkd.tools.captcha import get_captcha
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from .. import BASE_CLASS
from .common import DataTables from .common import DataTables
from ..models import DBSession, Partner from ..models import DBSession, Partner
# , get_params, get_urls # , get_params, get_urls
......
...@@ -4,7 +4,7 @@ from pyramid.i18n import TranslationStringFactory ...@@ -4,7 +4,7 @@ from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from . import BaseView from . import BaseView
from opensipkd.models import ( from ..models import (
DBSession, DBSession,
Group, Group,
Permission, Permission,
......
...@@ -2,7 +2,7 @@ import colander ...@@ -2,7 +2,7 @@ import colander
from deform import (widget, ) from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from opensipkd.models import Permission from ..models import Permission
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah permission gagal' SESS_ADD_FAILED = 'Tambah permission gagal'
......
...@@ -31,23 +31,18 @@ from datetime import datetime ...@@ -31,23 +31,18 @@ from datetime import datetime
import colander import colander
from deform import (widget, FileData, ValidationFailure, Button) from deform import (widget, FileData, ValidationFailure, Button)
from opensipkd.base import BASE_CLASS
from opensipkd.tools import Upload, mem_tmp_store, image_validator, date_from_str from opensipkd.tools import Upload, mem_tmp_store, image_validator, date_from_str
from opensipkd.tools.buttons import btn_cancel, btn_save from opensipkd.tools.buttons import btn_cancel, btn_save
from pyramid.httpexceptions import HTTPFound, HTTPNotFound from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
# from pyramid.security import forget
# from pyramid.view import view_config
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
# from opensipkd.base import get_params, get_id_card_folder from .user import email_validator, add_member_count
from opensipkd.base.views.user import email_validator, add_member_count from .user_login import regenerate_security_code, send_email_security_code
from .. import BASE_CLASS
from ..models import User, DBSession, Partner, Group, UserGroup from ..models import User, DBSession, Partner, Group, UserGroup
from ..widgets import widget_os from ..widgets import widget_os
# from .base_views import need_captcha, get_url_captcha
from .user_login import regenerate_security_code, send_email_security_code
from ..views import BaseView from ..views import BaseView
# from .. import get_urls
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
......
...@@ -33,23 +33,23 @@ ...@@ -33,23 +33,23 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- FAVICONS --> <!-- FAVICONS -->
<link rel="shortcut icon" href="${home}/static/v3/img/favicon.png" type="image/x-icon"> <link rel="shortcut icon" href="${home}/static/img/favicon.png" type="image/x-icon">
<link rel="icon" href="${home}/static/v3/img/favicon.png" type="image/x-icon"> <link rel="icon" href="${home}/static/img/favicon.png" type="image/x-icon">
<!-- GOOGLE FONT --> <!-- GOOGLE FONT -->
<link rel="stylesheet" href="${home}/static/v3/css/gf_open_sans-400italic_700italic_300_400_700.css"> <link rel="stylesheet" href="${home}/static/css/gf_open_sans-400italic_700italic_300_400_700.css">
<!-- Basic Styles --> <!-- Basic Styles -->
<link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/css/bootstrap.min.css">
<!--? <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/font-awesome.min.css">--> <!--? <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/css/font-awesome.min.css">-->
<link rel="stylesheet" type="text/css" media="screen" <link rel="stylesheet" type="text/css" media="screen"
href="${home}/static/v3/fonts/fontawesome-free-6.1.2-web/css/all.min.css"> href="${home}/static/fonts/fontawesome-free-6.1.2-web/css/all.min.css">
<!-- SmartAdmin Styles : Caution! DO NOT change the order --> <!-- SmartAdmin Styles : Caution! DO NOT change the order -->
<link rel="stylesheet" type="text/css" media="screen" <link rel="stylesheet" type="text/css" media="screen"
href="${home}/static/v3/css/smartadmin-production-plugins.min.css"> href="${home}/static/css/smartadmin-production-plugins.min.css">
<link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/smartadmin-production.min.css"> <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/css/smartadmin-production.min.css">
<link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/smartadmin-skins.min.css"> <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/css/smartadmin-skins.min.css">
<!-- We recommend you use "your_style.css" to override SmartAdmin <!-- We recommend you use "your_style.css" to override SmartAdmin
specific styles this will also ensure you retrain your customization with each SmartAdmin update. --> specific styles this will also ensure you retrain your customization with each SmartAdmin update. -->
...@@ -60,16 +60,16 @@ ...@@ -60,16 +60,16 @@
tal:condition="css_resource[:4]!='http'"> tal:condition="css_resource[:4]!='http'">
<link rel="stylesheet" href="${css_resource}" type="text/css" tal:condition="css_resource[:4]=='http'"> <link rel="stylesheet" href="${css_resource}" type="text/css" tal:condition="css_resource[:4]=='http'">
</tal:loop> </tal:loop>
<!--? <link href="${home}/static/v3/js/plugin/bootstrap-datepicker/css/bootstrap-datepicker.min.css"--> <!--? <link href="${home}/static/js/plugin/bootstrap-datepicker/css/bootstrap-datepicker.min.css"-->
<!--? rel="stylesheet">--> <!--? rel="stylesheet">-->
<link href="${home}/deform_static/css/form.css" rel="stylesheet"> <link href="${home}/deform_static/css/form.css" rel="stylesheet">
<!--? <link href="${home}/static/v3/css/select2.min.css" rel="stylesheet" type="text/css">--> <!--? <link href="${home}/static/css/select2.min.css" rel="stylesheet" type="text/css">-->
<metal:css define-slot="css_files"></metal:css> <metal:css define-slot="css_files"></metal:css>
</head> </head>
<body class="fixed-header"> <body class="fixed-header">
<link rel="stylesheet" type="text/css" media="screen" href="${home}/static/v3/css/osipkd.css"> <link rel="stylesheet" type="text/css" media="screen" href="${home}/static/css/osipkd.css">
<div id="loading" style="display:none;"> <div id="loading" style="display:none;">
<img id="loading-image" src="${home}/static/img/ajax-loader.gif" alt="Loading..." /> <img id="loading-image" src="${home}/static/img/ajax-loader.gif" alt="Loading..." />
</div> </div>
...@@ -217,27 +217,27 @@ ...@@ -217,27 +217,27 @@
<!-- JS --> <!-- JS -->
<script src="${home}/static/v3/js/jquery-2.1.1.min.js"></script> <script src="${home}/static/js/jquery-2.1.1.min.js"></script>
<script> <script>
if (!window.jQuery) { if (!window.jQuery) {
document.write('<script src="${home}/static/v3/js/libs/jquery-2.1.1.min.js"><\/script>'); document.write('<script src="${home}/static/js/libs/jquery-2.1.1.min.js"><\/script>');
} }
</script> </script>
<!--?<script src="${home}/static/v3/js/jquery-ui-1.10.3.min.js"></script>--> <!--?<script src="${home}/static/js/jquery-ui-1.10.3.min.js"></script>-->
<script> <script>
// if (!window.jQuery.ui) { // if (!window.jQuery.ui) {
<!--? document.write('<script src="${home}/static/v3/js/libs/jquery-ui-1.10.3.min.js"><\/script>');--> <!--? document.write('<script src="${home}/static/js/libs/jquery-ui-1.10.3.min.js"><\/script>');-->
// } // }
</script> </script>
<!-- IMPORTANT: APP CONFIG --> <!-- IMPORTANT: APP CONFIG -->
<script src="${home}/static/v3/js/app.config.js"></script> <script src="${home}/static/js/app.config.js"></script>
<!-- BOOTSTRAP JS --> <!-- BOOTSTRAP JS -->
<script src="${home}/static/v3/js/bootstrap/bootstrap.min.js"></script> <script src="${home}/static/js/bootstrap/bootstrap.min.js"></script>
<!-- FastClick: For mobile devices --> <!-- FastClick: For mobile devices -->
<script src="${home}/static/v3/js/plugin/fastclick/fastclick.min.js"></script> <script src="${home}/static/js/plugin/fastclick/fastclick.min.js"></script>
<!--[if IE 8]> <!--[if IE 8]>
...@@ -246,27 +246,27 @@ ...@@ -246,27 +246,27 @@
<![endif]--> <![endif]-->
<!-- MAIN APP JS FILE --> <!-- MAIN APP JS FILE -->
<script src="${home}/static/v3/js/app.min.js"></script> <script src="${home}/static/js/app.min.js"></script>
<!-- PAGE RELATED PLUGIN(S) --> <!-- PAGE RELATED PLUGIN(S) -->
<!--?<script src="${home}/static/v3/js/plugin/datatables/jquery.dataTables.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/datatables/jquery.dataTables.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/datatables/dataTables.colVis.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/datatables/dataTables.colVis.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/datatables/dataTables.tableTools.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/datatables/dataTables.tableTools.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/datatables/dataTables.bootstrap.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/datatables/dataTables.bootstrap.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/datatable-responsive/datatables.responsive.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/datatable-responsive/datatables.responsive.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/bootstrap-datepicker/js/bootstrap-datepicker.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/bootstrap-datepicker/js/bootstrap-datepicker.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/bootstrap-timepicker/bootstrap-timepicker.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/bootstrap-timepicker/bootstrap-timepicker.min.js"></script>-->
<!--?<script src="${home}/deform_static/scripts/deform.js"></script>--> <!--?<script src="${home}/deform_static/scripts/deform.js"></script>-->
<!--?<script src="${home}/deform_static/scripts/typeahead.min.js"></script>--> <!--?<script src="${home}/deform_static/scripts/typeahead.min.js"></script>-->
<!--?<script src="${home}/deform_static/scripts/jquery.maskMoney-3.1.1.min.js"></script>--> <!--?<script src="${home}/deform_static/scripts/jquery.maskMoney-3.1.1.min.js"></script>-->
<!--?<script src="${home}/deform_static/tinymce/tinymce.min.js"></script>--> <!--?<script src="${home}/deform_static/tinymce/tinymce.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/tools.js"></script>--> <!--?<script src="${home}/static/js/tools.js"></script>-->
<!--?<script src="${home}/static/v3/js/notification/SmartNotification.min.js"></script>--> <!--?<script src="${home}/static/js/notification/SmartNotification.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/plugin/masked-input/jquery.maskedinput.min.js"></script>--> <!--?<script src="${home}/static/js/plugin/masked-input/jquery.maskedinput.min.js"></script>-->
<!--?<script src="${home}/static/v3/js/select2.full.min.js"></script>--> <!--?<script src="${home}/static/js/select2.full.min.js"></script>-->
<!--?<script src="${home}/deform_static/scripts/file_upload.js"></script>--> <!--?<script src="${home}/deform_static/scripts/file_upload.js"></script>-->
<script src="${home}/static/v3/js/osipkd.js"></script> <script src="${home}/static/js/osipkd.js"></script>
<!-- LOOP ON JS RESOURCE --> <!-- LOOP ON JS RESOURCE -->
<tal:loop tal:repeat="js_resource js"> <tal:loop tal:repeat="js_resource js">
<script src="${home}${request.static_path(js_resource)}" tal:condition="js_resource[:4]!='http'"></script> <script src="${home}${request.static_path(js_resource)}" tal:condition="js_resource[:4]!='http'"></script>
......
import colander
from deform import widget
from pyramid.view import view_config
from . import BaseView
from ..models import ResDesa, User, UserArea
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.Integer(),
title="Action"
)
user_name = colander.SchemaNode(
colander.String(),
field=User.user_name,
title="User"
)
desa_kd = colander.SchemaNode(
colander.String(),
field=ResDesa.kode)
desa_name = colander.SchemaNode(
colander.String(),
field=ResDesa.nama)
class AddSchema(colander.Schema):
user_id = colander.SchemaNode(
colander.Integer(),
widget=widget.SelectWidget(values=User.get_list()),
oid="user_id",
title="User",
)
desa_id = colander.SchemaNode(
colander.Integer(),
widget=widget.SelectWidget(values=ResDesa.get_list()),
oid="desa_id",
title="Kelurahan/Desa", )
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.list_route = 'user-area'
self.table = UserArea
def list_join(self, query, **kwargs):
return query.outerjoin(ResDesa, ResDesa.id == self.table.desa_id) \
.outerjoin(User, User.id == self.table.user_id)
# @view_config(route_name='user-area', renderer='templates/table.pt',
# permission='user-view')
# def view_list(self, **kwargs):
# return super().view_list(**kwargs)
# @view_config(route_name='user-area-act', renderer='json',
# permission='user-view')
# def view_act(self):
# return super().view_act()
# @view_config(route_name='user-area-add', renderer='templates/form.pt',
# permission='user-edit')
# def view_add(self):
# return super().view_add()
# @view_config(route_name='user-area-view', renderer='templates/form.pt',
# permission='user-view')
# def view_view(self):
# return super().view_view()
# @view_config(route_name='user-area-delete', renderer='templates/form.pt',
# permission='user-edit')
# def view_delete(self):
# return super().view_delete()
# @view_config(route_name='user-area-edit', renderer='templates/form.pt',
# permission='user-edit')
# def view_edit(self):
# return super().view_edit()
...@@ -37,7 +37,8 @@ from ziggurat_foundations.models.services.external_identity import \ ...@@ -37,7 +37,8 @@ from ziggurat_foundations.models.services.external_identity import \
ExternalIdentityService ExternalIdentityService
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
from opensipkd.base import BASE_CLASS, DBSession, get_params, scripts from .. import BASE_CLASS, get_params, scripts
from ..models import DBSession
from . import one_hour, two_minutes from . import one_hour, two_minutes
from ..models.users import User, ExternalIdentity from ..models.users import User, ExternalIdentity
# , Partner # , Partner
......
TODO
- docs
- column formating (left, right, center)
- numeric formating
- date formating
"""Detable."""
import os
from pkg_resources import resource_filename
from . import detable # API
from deform.field import Field # API
from .detable import Button # API
from .detable import DeTable # API
from deform import ZPTRendererFactory # API
from deform import default_renderer # API
deform_templates = resource_filename('deform', 'templates')
path = os.path.dirname(__file__)
path = os.path.join(path, 'templates')
search_path = (path, deform_templates) #,
# renderer = ZPTRendererFactory(search_path)
DeTable.set_zpt_renderer(search_path)
"""I18n."""
from translationstring import TranslationStringFactory
_ = TranslationStringFactory("detable")
2024-08-05
Penambahan fungsi Tombol
kwargs = new_buttons
value = {"btn_name":
{"obj": objBtn or btn name,
"js": "jsScript{tableid} {params}"
}
}
contoh pada file partner
def view_list(self):
ktp = Button("ktp", "KTP", )
new_buttons = {"kta":
{"obj": "kta",
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/kta?{params}';
else displayEmptyID();
"""
},
"ktp":
{"obj": Button("ktp", title=_('KTP'), css_class="btn-danger"),
"js": """if (m{tableid}ID!=null)
window.location=o{tableid}Uri+'/'+m{tableid}ID+'/ktp?{params}';
else displayEmptyID();
"""
}
}
return super().view_list(new_buttons=new_buttons)
new_buttons ini bisa di pasang pada init ataua saat memanggil view_list(new_buttons=new_buttons)
kalau pada init gunakan self.new_buttons
\ No newline at end of file \ No newline at end of file
"""Widget."""
# Standard Library
import csv
import json
import random
# Pyramid
from colander import Invalid
from colander import Mapping
from colander import SchemaNode
from colander import SchemaType
from colander import Sequence
from colander import String
from colander import null
from iso8601.iso8601 import ISO8601_REGEX
from translationstring import TranslationString
from deform.widget import MappingWidget
from deform.compat import text_
from .i18n import _
_BLANK = text_("")
class TableWidget(MappingWidget):
"""
The top-level widget; represents an entire table.
**Attributes/Arguments**
template
The template name used to render the widget. Default:
``detable``.
"""
template = "detable"
readonly_template = "readonly/detable"
requirements = (("deform", None),
{"js": "opensipkd.base:static/v3/js/plugin/datatables/jquery.dataTables.min.js"})
from opensipkd.base.models import *
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!