Refactor pyproject.toml for package discovery and add new dependencies

- Updated package configuration to use setuptools' find_packages with namespace support.
- Included new dependencies: lxml and pandas.
- Created __init__.py in the models module to import from base models.
1 parent b977ea79
...@@ -345,8 +345,8 @@ def main(global_config, **settings): ...@@ -345,8 +345,8 @@ def main(global_config, **settings):
settings['localization'] = 'id_ID.UTF-8' settings['localization'] = 'id_ID.UTF-8'
if settings.get("lib_dir"): if settings.get("lib_dir"):
sqlalchemy_url = settings.get("sqlalchemy.url") # sqlalchemy_url = settings.get("sqlalchemy.url")
if sqlalchemy_url and sqlalchemy_url.find("oracledb") > -1: # if sqlalchemy_url and sqlalchemy_url.find("oracledb") > -1:
try: try:
import oracledb import oracledb
oracledb.init_oracle_client(lib_dir=settings.get("lib_dir")) oracledb.init_oracle_client(lib_dir=settings.get("lib_dir"))
...@@ -363,7 +363,7 @@ def main(global_config, **settings): ...@@ -363,7 +363,7 @@ def main(global_config, **settings):
if 'timezone' not in settings: if 'timezone' not in settings:
settings['timezone'] = DefaultTimeZone settings['timezone'] = DefaultTimeZone
# settings["captcha_files"] = "c:\\tmp\\captcha\\" # settings["captcha_files"] = "c:\\tmp\\captcha\\"
tmp = get_params("temp_files", tempfile.gettempdir(), settings=settings) tmp = settings.get("temp_files", tempfile.gettempdir())
settings["temp_files"] = tmp settings["temp_files"] = tmp
settings['captcha_files'] = os.path.join(tmp, "captcha") + os.sep settings['captcha_files'] = os.path.join(tmp, "captcha") + os.sep
......
...@@ -13,10 +13,10 @@ from sqlalchemy.orm import ( ...@@ -13,10 +13,10 @@ from sqlalchemy.orm import (
backref backref
) )
from opensipkd.models import Partner # from opensipkd.models import
from ..models import DBSession, Base # from ..models import DBSession,
from ..models import (DefaultModel, NamaModel, TABLE_ARGS, from . import (DefaultModel, NamaModel, TABLE_ARGS,
Departemen) Departemen, Partner, Base)
class Eselon(Base, NamaModel): class Eselon(Base, NamaModel):
...@@ -64,7 +64,7 @@ class PartnerDepartemen(Base, DefaultModel): ...@@ -64,7 +64,7 @@ class PartnerDepartemen(Base, DefaultModel):
@classmethod @classmethod
def query_jabatan(cls, partner_id, tanggal): def query_jabatan(cls, partner_id, tanggal):
query = DBSession.query(cls). \ query = self.db_session.query(cls). \
filter(cls.partner_id == partner_id, filter(cls.partner_id == partner_id,
tanggal >= cls.mulai, tanggal >= cls.mulai,
tanggal <= cls.selesai) tanggal <= cls.selesai)
......
...@@ -677,10 +677,11 @@ class BaseView(object): ...@@ -677,10 +677,11 @@ class BaseView(object):
row_table = DataTables(self.req.GET, query, columns) row_table = DataTables(self.req.GET, query, columns)
result = row_table.output_result() result = row_table.output_result()
data = result and result.get("data") or {} data = result and result.get("data") or {}
for res in data:
if self.list_view_field:
list_url = self.req.route_url(self.list_route) list_url = self.req.route_url(self.list_route)
for res in data:
if self.list_view_field and kwargs.get("link") is not False:
res[self.list_view_field] = f"<a href='{list_url}/{res['id']}/view'>{res[self.list_view_field]}</a>" res[self.list_view_field] = f"<a href='{list_url}/{res['id']}/view'>{res[self.list_view_field]}</a>"
for k in res: for k in res:
if k in select_list.keys(): if k in select_list.keys():
...@@ -688,10 +689,6 @@ class BaseView(object): ...@@ -688,10 +689,6 @@ class BaseView(object):
for r in vals: for r in vals:
if r and str(r) == str(res[k]): if r and str(r) == str(res[k]):
res[k] = vals[r] res[k] = vals[r]
# for k, v in d.items():
# if k in url and v:
# link = "/".join([self.home, nik_url, v])
# d[k] =f'<a href="{link}" target="_blank">View</a>'
return result return result
def list_join(self, query, **kwargs): def list_join(self, query, **kwargs):
...@@ -744,9 +741,12 @@ class BaseView(object): ...@@ -744,9 +741,12 @@ class BaseView(object):
# response.content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' # response.content_type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
# response.content_disposition = 'filename=' + filename # response.content_disposition = 'filename=' + filename
# return response.write(output.read()) # return response.write(output.read())
def is_tzaware(self, dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
def xls_data(self, **kwargs): def xls_data(self, **kwargs):
self.req.GET["length"] = "-1" self.req.GET["length"] = "-1"
kwargs["link"] = False
resp = self.get_list(**kwargs) resp = self.get_list(**kwargs)
data = resp.get("data", []) data = resp.get("data", [])
if not data: if not data:
...@@ -770,23 +770,36 @@ class BaseView(object): ...@@ -770,23 +770,36 @@ class BaseView(object):
and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)) \ and isinstance(d.widget , (widget.SelectWidget, widget.Select2Widget)) \
and d.widget.values or None and d.widget.values or None
if hasattr(d, "visible") and d.visible is False or d.name=="id":
continue
selects[d.name] = {"title": title, selects[d.name] = {"title": title,
"values": values, "values": values,
"visible": hasattr(d, "visible") and d.visible or None} "visible": hasattr(d, "visible") and d.visible or None}
header = list(data[0].keys()) header = list(data[0].keys())
for i, h in enumerate(header): headers = []
header[i] = selects[h]["title"] for h in header:
if not selects.get(h, None):
continue
headers.append(selects[h]["title"])
rows = [] rows = []
row = []
for d in data: for d in data:
for k, v in d.items(): for k, v in d.items():
if isinstance(v, datetime) and self.is_tzaware(v):
d[k] = v.replace(tzinfo=None)
if not selects.get(k, None):
continue
if selects[k]["values"]: if selects[k]["values"]:
select = isinstance(selects[k]["values"], dict) \ select = isinstance(selects[k]["values"], dict) \
and selects[k]["values"].items() or dict(selects[k]["values"]) and selects[k]["values"].items() or dict(selects[k]["values"])
d[k] = select.get(v,v) d[k] = select.get(v,v)
row = list(d.values()) row.append(d[k])
rows.append(row) rows.append(row)
row = []
# for i, h in enumerate(header): # for i, h in enumerate(header):
...@@ -810,7 +823,7 @@ class BaseView(object): ...@@ -810,7 +823,7 @@ class BaseView(object):
value = { value = {
'header': header, 'header': headers,
'rows': rows, 'rows': rows,
} }
return value return value
......
from ..base.models import *
...@@ -2,11 +2,13 @@ ...@@ -2,11 +2,13 @@
requires = ['setuptools >= 64', 'wheel'] requires = ['setuptools >= 64', 'wheel']
build-backend = 'setuptools.build_meta' build-backend = 'setuptools.build_meta'
[tool.setuptools] # [tool.setuptools]
packages = ["opensipkd", "opensipkd.detable", "opensipkd.base"] # packages = ["opensipkd", "opensipkd.detable", "opensipkd.base"]
#data-file = [
#("etc/base", ["etc/ojdbc8.jar", "etc/osipkd.service"]), [tool.setuptools.packages.find]
#] include = ["opensipkd.*"]
namespaces = true # This is the critical line for shared prefixes!
[tool.mypy] [tool.mypy]
exclude = [ exclude = [
'bak', 'bak',
...@@ -41,6 +43,8 @@ dependencies = [ ...@@ -41,6 +43,8 @@ dependencies = [
'websockets', 'websockets',
"asyncio", "asyncio",
"pdfkit", "pdfkit",
"lxml",
"pandas"
] ]
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!