Commit 316405d6 by aagusti

Widget GMAP

1 parent 91fb10a3
...@@ -253,9 +253,13 @@ class BaseView(object): ...@@ -253,9 +253,13 @@ class BaseView(object):
return self.route_list("Nilai Data tidak ditemukan", "error") return self.route_list("Nilai Data tidak ditemukan", "error")
form.set_appstruct(values) form.set_appstruct(values)
table = self.get_item_table(row) table = self.get_item_table(row)
resources = form.get_widget_resources()
return dict(form=form.render(readonly=True), return dict(form=form.render(readonly=True),
table=table and table.render() or None, table=table and table.render() or None,
scripts=self.form_scripts) scripts=self.form_scripts,
css=resources["css"],
js=resources["js"]
)
def view_upload(self, exts=('.png', '.ico')): def view_upload(self, exts=('.png', '.ico')):
bindings = self.get_bindings() bindings = self.get_bindings()
......
...@@ -222,10 +222,11 @@ class ViewPartner(BaseView): ...@@ -222,10 +222,11 @@ class ViewPartner(BaseView):
err_kode() err_kode()
elif found: elif found:
err_kode() err_kode()
value['is_vendor'] = 'is_vendor' in value and value[
'is_vendor'] and 1 or 0 value['is_vendor'] = 'is_vendor' in value and \
value['is_customer'] = 'is_customer' in value and value[ value['is_vendor'] and 1 or 0
'is_customer'] and 1 or 0 value['is_customer'] = 'is_customer' in value and \
value['is_customer'] and 1 or 0
value["status"] = 'status' in value and value['status'] and 1 or 0 value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None): def get_bindings(self, row=None):
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
<!-- 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. -->
<!-- OTHER CSS --> <!-- LOOP FORM CSS INCLUDED-->
<tal:loop tal:repeat="css_resource css"> <tal:loop tal:repeat="css_resource css">
<link rel="stylesheet" href="${home}${request.static_path(css_resource)}" <link rel="stylesheet" href="${home}${request.static_path(css_resource)}"
type="text/css"> type="text/css">
...@@ -271,6 +271,7 @@ ...@@ -271,6 +271,7 @@
<!--?<script src="${home}/static/v3/js/select2.full.min.js"></script>--> <!--?<script src="${home}/static/v3/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/v3/js/osipkd.js"></script>
<!-- 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)}"></script> <script src="${home}${request.static_path(js_resource)}"></script>
</tal:loop> </tal:loop>
......
<script src="${home}/static/v3/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/v3/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/v3/js/plugin/datatable-responsive/datatables.responsive.min.js"></script>
...@@ -4,7 +4,8 @@ import re ...@@ -4,7 +4,8 @@ import re
import colander import colander
from deform import (widget, ) from deform import (widget, )
from opensipkd.tools import create_now, SaveFile from opensipkd.tools import create_now, SaveFile
from opensipkd.tools.report import open_rml_row, csv_response, open_rml_pdf, pdf_response, file_response from opensipkd.tools.report import open_rml_row, csv_response, open_rml_pdf, \
pdf_response, file_response
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from sqlalchemy import (func, ) from sqlalchemy import (func, )
...@@ -95,7 +96,8 @@ class Views(BaseView): ...@@ -95,7 +96,8 @@ class Views(BaseView):
path = os.path.join(base_path, 'reports') path = os.path.join(base_path, 'reports')
rml_row = open_rml_row(path + '/user.row.rml') rml_row = open_rml_row(path + '/user.row.rml')
rows = [rml_row.format(user_name=r.user_name, email=r.email, rows = [rml_row.format(user_name=r.user_name, email=r.email,
registered_date=r.registered_date) for r in query.all()] registered_date=r.registered_date) for r in
query.all()]
pdf, filename = open_rml_pdf(path + '/user.rml', rows=rows, pdf, filename = open_rml_pdf(path + '/user.rml', rows=rows,
company=self.req.company, company=self.req.company,
departement=self.req.departement, departement=self.req.departement,
...@@ -118,7 +120,8 @@ class Views(BaseView): ...@@ -118,7 +120,8 @@ class Views(BaseView):
values["email"] = values['email'].lower() values["email"] = values['email'].lower()
values["user_name"] = re.sub(' ', '', values['user_name']) # .lower() values["user_name"] = re.sub(' ', '', values['user_name']) # .lower()
values["security_code_date"] = create_now() values["security_code_date"] = create_now()
company_id = request.user and request.user.company_id or "company_id" in values and values["company_id"] or None company_id = request.user and request.user.company_id or "company_id" in values and \
values["company_id"] or None
values["company_id"] = company_id values["company_id"] = company_id
if 'is_api_key' in values: if 'is_api_key' in values:
values["api_key"] = generate_api_key() values["api_key"] = generate_api_key()
...@@ -261,7 +264,7 @@ class EmailValidator(colander.Email, Validator): ...@@ -261,7 +264,7 @@ class EmailValidator(colander.Email, Validator):
email = value.lower() email = value.lower()
q = DBSession.query(User).filter_by(email=email) q = DBSession.query(User).filter_by(email=email)
found = q.first() found = q.first()
if found and (not self.user or self.user.email!=found.email): if found and (not self.user or self.user.email != found.email):
email_found() email_found()
...@@ -380,5 +383,7 @@ def user_group_set(user): ...@@ -380,5 +383,7 @@ def user_group_set(user):
def query_register(): def query_register():
return DBSession.query(User.user_name, User.email, return DBSession.query(User.user_name, User.email,
func.to_char(User.registered_date, "DD-MM-YYYY").label("registered_date")).order_by( func.to_char(User.registered_date,
"DD-MM-YYYY").label(
"registered_date")).order_by(
User.user_name) User.user_name)
import json
from colander import SchemaNode, null, Mapping, Invalid, text_, string_types from colander import SchemaNode, null, Mapping, Invalid, text_, string_types
from deform.widget import Widget, _StrippedString, Select2Widget from deform.widget import Widget, _StrippedString, Select2Widget
...@@ -160,7 +162,8 @@ class BlokKavNoWidget(Widget): ...@@ -160,7 +162,8 @@ class BlokKavNoWidget(Widget):
result = "|".join([blok_kav_no, rt, rw]) result = "|".join([blok_kav_no, rt, rw])
if not blok_kav_no or not rt or not rw: if not blok_kav_no or not rt or not rw:
raise Invalid(field.schema, "Blok Kav No RT/RW tidak lengkap", result) raise Invalid(field.schema, "Blok Kav No RT/RW tidak lengkap",
result)
return result return result
...@@ -183,6 +186,7 @@ class Select2MsWidget(Select2Widget): ...@@ -183,6 +186,7 @@ class Select2MsWidget(Select2Widget):
template = "select2_ms.pt" template = "select2_ms.pt"
class QtyWidget(Widget): class QtyWidget(Widget):
template = "opensipkd.base:/views/widgets/qty.pt" template = "opensipkd.base:/views/widgets/qty.pt"
readonly_template = "opensipkd.base:/views/widgets/readonly/qty.pt" readonly_template = "opensipkd.base:/views/widgets/readonly/qty.pt"
...@@ -228,6 +232,7 @@ class QtyWidget(Widget): ...@@ -228,6 +232,7 @@ class QtyWidget(Widget):
return result return result
class CaptchaWidget(Widget): class CaptchaWidget(Widget):
""" """
Renders an ``<input type="text"/>`` widget. Renders an ``<input type="text"/>`` widget.
...@@ -275,6 +280,7 @@ class CaptchaWidget(Widget): ...@@ -275,6 +280,7 @@ class CaptchaWidget(Widget):
return null return null
return pstruct return pstruct
class ImageWidget(Widget): class ImageWidget(Widget):
""" """
Renders an ``<img src="src"/>`` widget. Renders an ``<img src="src"/>`` widget.
...@@ -300,8 +306,72 @@ class ImageWidget(Widget): ...@@ -300,8 +306,72 @@ class ImageWidget(Widget):
strip = True strip = True
requirements = () requirements = ()
height = "30px" height = "30px"
def __init__(self, **kw):
super().__init__(**kw)
def serialize(self, field, cstruct, **kw):
if cstruct in (null, None):
cstruct = ""
readonly = kw.get("readonly", self.readonly)
template = readonly and self.readonly_template or self.template
values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, **values)
def deserialize(self, field, pstruct):
if pstruct is null:
return null
elif not isinstance(pstruct, string_types):
raise Invalid(field.schema, "Pstruct is not a string")
if self.strip:
pstruct = pstruct.strip()
if not pstruct:
return null
return pstruct
class MapWidget(Widget):
"""
Renders an ``<div id="map"/>`` widget.
**Attributes/Arguments**
template
The template name used to render the widget. Default:
``textinput``.
readonly_template
The template name used to render the widget in read-only mode.
Default: ``readonly/textinput``.
strip
If true, during deserialization, strip the value of leading
and trailing whitespace (default ``True``).
"""
template = "opensipkd.base:views/widgets/gmap.pt"
readonly_template = "opensipkd.base:views/widgets/gmap.pt"
map_center = [0, 0]
map_zoom = 12
gmap_key = None
gmap_control = ['Point', 'Polygon', 'LineString']
gmap_height = "400px"
gmap_width = "100%"
strip = True
html_info = {}
gmap_data_style = {
"editable": "true",
"draggable": "true",
"clickable": "true",
"removable": "true",
}
gmap_edit_url = ""
requirements = ()
def __init__(self, **kw): def __init__(self, **kw):
super().__init__(**kw) super().__init__(**kw)
self.gmap_data_style = json.dumps(self.gmap_data_style)
def serialize(self, field, cstruct, **kw): def serialize(self, field, cstruct, **kw):
if cstruct in (null, None): if cstruct in (null, None):
......
...@@ -8,14 +8,14 @@ Pillow>=9.1.1 ...@@ -8,14 +8,14 @@ Pillow>=9.1.1
lxml>=4.9.0 lxml>=4.9.0
beautifulsoup4>=4.11.1 beautifulsoup4>=4.11.1
soupsieve>=2.3.2.post1 soupsieve>=2.3.2.post1
pip~=18.1 pip~=22.3.1
wheel~=0.37.0 wheel~=0.38.4
rsa>=4.8 rsa>=4.8
pyasn1~=0.4.8 pyasn1~=0.4.8
Chameleon>=3.10.1 Chameleon>=3.10.1
six~=1.16.0 six~=1.16.0
Mako>=1.2.0 Mako>=1.2.0
Babel~=2.10.2 Babel~=2.11.0
Beaker~=1.11.0 Beaker~=1.11.0
Pygments>=2.12.0 Pygments>=2.12.0
MarkupSafe>=2.1.1 MarkupSafe>=2.1.1
...@@ -27,7 +27,7 @@ peppercorn~=0.6 ...@@ -27,7 +27,7 @@ peppercorn~=0.6
iso8601>=1.0.2 iso8601>=1.0.2
google~=3.0.0 google~=3.0.0
cachetools>=5.2.0 cachetools>=5.2.0
certifi~=2022.5.18.1 certifi~=2022.9.24
urllib3~=1.26.6 urllib3~=1.26.6
requests>=2.28.0 requests>=2.28.0
google-api-python-client>=2.51.0 google-api-python-client>=2.51.0
...@@ -38,21 +38,21 @@ venusian~=3.0.0 ...@@ -38,21 +38,21 @@ venusian~=3.0.0
plaster~=1.0 plaster~=1.0
hupper~=1.10.3 hupper~=1.10.3
waitress>=2.1.2 waitress>=2.1.2
greenlet~=1.1.1 greenlet~=2.0.1
pyparsing>=3.0.9 pyparsing>=3.0.9
httplib2>=0.20.4 httplib2>=0.20.4
icecream~=2.1.1 icecream~=2.1.1
executing~=0.8.0 executing~=1.2.0
paginate~=0.5.6 paginate~=0.5.6
idna~=3.2 idna~=3.2
asttokens~=2.0.5 asttokens~=2.1.0
setuptools>=57.4.0 setuptools>=57.4.0
uritemplate>=4.1.1 uritemplate>=4.1.1
reportlab~=3.6.1 reportlab~=3.6.1
PyJWT>=2.4.0 PyJWT>=2.4.0
py~=1.11.0 py~=1.11.0
attrs~=21.4.0 attrs~=22.1.0
pytest~=7.1.1 pytest~=7.2.0
pluggy~=1.0.0 pluggy~=1.0.0
iniconfig~=1.1.1 iniconfig~=1.1.1
cffi>=1.15.0 cffi>=1.15.0
...@@ -65,6 +65,9 @@ pyramid_rpc ...@@ -65,6 +65,9 @@ pyramid_rpc
zipp~=3.8.0 zipp~=3.8.0
papyrus~=2.4 papyrus~=2.4
geojson~=2.5.0 geojson~=2.5.0
GeoAlchemy2~=0.12.1
pybind11~=2.9.2 pybind11~=2.9.2
qrcode~=7.3.1
\ No newline at end of file \ No newline at end of file
qrcode~=7.3.1
exceptiongroup~=1.0.4
Shapely~=1.8.5.post1
GeoAlchemy~=0.7.2
tandur~=0.0.1b0
\ 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!