Update database URL in development.ini, add search methods enum in base_views.py…

…, and include pdfkit dependency in pyproject.toml
1 parent 712624f7
...@@ -14,7 +14,7 @@ pyramid.debug_notfound = true ...@@ -14,7 +14,7 @@ pyramid.debug_notfound = true
pyramid.debug_routematch = true pyramid.debug_routematch = true
pyramid.debug_templates = true pyramid.debug_templates = true
default_locale_name = id default_locale_name = id
sqlalchemy.url = postgresql://aagusti:a@localhost:5432/demos sqlalchemy.url = postgresql://aagusti:a@localhost:5432/webrs
pyramid.includes = pyramid.includes =
pyramid_tm pyramid_tm
pyramid_beaker pyramid_beaker
...@@ -64,13 +64,13 @@ reg_captcha = 1 ...@@ -64,13 +64,13 @@ reg_captcha = 1
reg_verify = 1 reg_verify = 1
# MAIL # MAIL
mail.host = smtp.gmail.com ; mail.host = smtp.gmail.com
mail.port = 465 ; mail.port = 465
mail.ssl = True ; mail.ssl = True
mail.tls = True ; mail.tls = True
mail.username = opensipkd@gmail.com ; mail.username = opensipkd@gmail.com
mail.password = ajmyoksxeiprmtyc ; mail.password = ajmyoksxeiprmtyc
mail.sender_name = "openSIPKD" ; mail.sender_name = "openSIPKD"
;PBB ;PBB
pbb.url = oracle://PBB:A@10.8.50.62/simpbb pbb.url = oracle://PBB:A@10.8.50.62/simpbb
......
...@@ -30,9 +30,25 @@ from ..widgets import widget_os ...@@ -30,9 +30,25 @@ from ..widgets import widget_os
from ..scripts.initializedb import append_csv from ..scripts.initializedb import append_csv
from ..tools import obj2json from ..tools import obj2json
from ...detable import DeTable from ...detable import DeTable
import enum
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SearchMethods(enum.Enum):
none = 0
string_contains = 1
ilike = 2
like = 3
numeric = 4
date = 5
yadcf_text = 6
yadcf_autocomplete = 7
yadcf_select = 8
yadcf_multi_select = 9
yadcf_range_number = 10
yadcf_range_number_slider = 11
yadcf_range_date = 12
# SEARCH_METHODS = { # SEARCH_METHODS = {
# 'none': lambda expr, value: None, # 'none': lambda expr, value: None,
# 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'), # 'string_contains': lambda expr, value: expr.ilike('%' + value + '%'),
...@@ -141,7 +157,18 @@ class BaseView(object): ...@@ -141,7 +157,18 @@ class BaseView(object):
self.filter_columns = False self.filter_columns = False
self.action_suffix = "/grid/act" self.action_suffix = "/grid/act"
self.html_buttons = {} self.html_buttons = {}
self.new_buttons = {} self.new_buttons = {}
"""
Additional button for list
{
"name":{
"obj": BtObject,
"js": JavaScript},
"name..."{
}
}
"""
self.list_form = None # List dam Form self.list_form = None # List dam Form
self.form_list = None # Form kemudian detail list self.form_list = None # Form kemudian detail list
...@@ -725,24 +752,63 @@ class BaseView(object): ...@@ -725,24 +752,63 @@ class BaseView(object):
if not data: if not data:
raise HTTPNotFound("No data to export") raise HTTPNotFound("No data to export")
header = list(data[0].keys()) selects = {}
list_schema = self.list_schema() list_schema = self.list_schema()
# schema = self.list_schema()
if "bindings" in kwargs and kwargs["bindings"]:
bindings = kwargs["bindings"]
elif self.bindings:
bindings = self.bindings
else:
bindings = self.get_bindings()
list_schema = list_schema.bind(request=self.req, **bindings)
for d in list_schema:
title = hasattr(d, "title") and d.title or d.name
values = hasattr(d, "widget") \
and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)) \
and d.widget.values or None
selects[d.name] = {"title": title,
"values": values,
"visible": hasattr(d, "visible") and d.visible or None}
header = list(data[0].keys())
for i, h in enumerate(header): for i, h in enumerate(header):
for d in list_schema: header[i] = selects[h]["title"]
if d.name == h and hasattr(d, "title"):
header[i] = d.title rows = []
rows = [list(item.values()) for item in data] for d in data:
for row in rows: for k, v in d.items():
for i, value in enumerate(row): if selects[k]["values"]:
if isinstance(value, str): select = isinstance(selects[k]["values"], dict) \
row[i] = self.remove_tags(value) and selects[k]["values"].items() or dict(selects[k]["values"])
elif isinstance(value, datetime): d[k] = select.get(v,v)
is_aware_utc = value.tzinfo is not None \
and value.tzinfo.utcoffset(value) is not None row = list(d.values())
if is_aware_utc: rows.append(row)
value = value.astimezone().replace(tzinfo=None)
row[i] = value
# for i, h in enumerate(header):
# for d in list_schema:
# if d.name == h and hasattr(d, "title"):
# header[i] = d.title
# if hasattr(d, "widget") and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)):
# selects[d.name] = d.widget.values
# rows = [list(item.values()) for item in data]
# for row in rows:
# for i, value in enumerate(row):
# if isinstance(value, str):
# row[i] = self.remove_tags(value)
# elif isinstance(value, datetime):
# is_aware_utc = value.tzinfo is not None \
# and value.tzinfo.utcoffset(value) is not None
# if is_aware_utc:
# value = value.astimezone().replace(tzinfo=None)
# row[i] = value
value = { value = {
'header': header, 'header': header,
'rows': rows, 'rows': rows,
......
...@@ -40,6 +40,7 @@ dependencies = [ ...@@ -40,6 +40,7 @@ dependencies = [
'zope.sqlalchemy', 'zope.sqlalchemy',
'websockets', 'websockets',
"asyncio", "asyncio",
"pdfkit",
] ]
requires-python = '>= 3.8' requires-python = '>= 3.8'
authors = [ authors = [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!