From 2210947a6b02d3a8ceb169564f4700723f3a951d Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 12:21:31 +0800 Subject: [PATCH 1/8] [#346] Move generate config into a util function --- backend/core/config.py | 53 +-------------------------- backend/generate_config.sh | 3 ++ backend/utils/generate_config.py | 63 ++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 51 deletions(-) create mode 100755 backend/generate_config.sh create mode 100644 backend/utils/generate_config.py diff --git a/backend/core/config.py b/backend/core/config.py index c1ac2dd0..466024cc 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -1,9 +1,6 @@ -import os -from jsmin import jsmin from fastapi import FastAPI, Request, Response from middleware import decode_token from fastapi.responses import FileResponse -from db.connection import SessionLocal from routes.user import user_route from routes.tag import tag_route @@ -18,10 +15,7 @@ from routes.visualization import visualization_route from routes.reference_data import reference_data_routes -from models.business_unit import BusinessUnit -from models.commodity_category import CommodityCategory -from models.currency import Currency -from models.country import Country +from utils.generate_config import generate_config_file, JS_FILE app = FastAPI( @@ -40,49 +34,7 @@ }, ) -JS_FILE = "./config.min.js" - - -def generate_config_file() -> None: - session = SessionLocal() - env_js = "var __ENV__={" - env_js += 'client_id:"{}"'.format(os.environ["CLIENT_ID"]) - env_js += ', client_secret:"{}"'.format(os.environ["CLIENT_SECRET"]) - env_js += "};" - min_js = jsmin("".join([env_js, ""])) - business_units = session.query(BusinessUnit).all() or [] - if business_units: - business_units = [bu.serialize for bu in business_units] - commodity_categories = session.query(CommodityCategory).all() or [] - if commodity_categories: - commodity_categories = [ - cc.serialize_with_commodities for cc in commodity_categories - ] - currencies = ( - session.query(Currency.abbreviation, Currency.country).distinct() or [] - ) - if currencies: - currencies = [ - {"value": c[0], "label": c[0], "country": c[1]} for c in currencies - ] - countries = ( - session.query(Country).filter(Country.parent.is_(None)).all() - or [] # noqa - ) - if countries: - countries = [c.to_dropdown for c in countries] - min_js += "var master={};".format( - str( - { - "business_units": business_units, - "commodity_categories": commodity_categories, - "currencies": currencies, - "countries": countries, - } - ) - ) - with open(JS_FILE, "w") as jsfile: - jsfile.write(min_js) +generate_config_file() # Routes register @@ -118,7 +70,6 @@ def health_check(): description="static javascript config", ) async def main(res: Response): - generate_config_file() res.headers["Content-Type"] = "application/x-javascript; charset=utf-8" return JS_FILE diff --git a/backend/generate_config.sh b/backend/generate_config.sh new file mode 100755 index 00000000..c8a1eee4 --- /dev/null +++ b/backend/generate_config.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +python -m utils.generate_config diff --git a/backend/utils/generate_config.py b/backend/utils/generate_config.py new file mode 100644 index 00000000..29cd4b2b --- /dev/null +++ b/backend/utils/generate_config.py @@ -0,0 +1,63 @@ +import os +from jsmin import jsmin +from db.connection import SessionLocal + +from models.business_unit import BusinessUnit +from models.commodity_category import CommodityCategory +from models.currency import Currency +from models.country import Country + + +JS_FILE = "./config.min.js" + + +def generate_config_file() -> None: + print("[START] Generating config") + session = SessionLocal() + env_js = "var __ENV__={" + env_js += 'client_id:"{}"'.format(os.environ["CLIENT_ID"]) + env_js += ', client_secret:"{}"'.format(os.environ["CLIENT_SECRET"]) + env_js += "};" + min_js = jsmin("".join([env_js, ""])) + business_units = session.query(BusinessUnit).all() or [] + session.flush() + if business_units: + business_units = [bu.serialize for bu in business_units] + commodity_categories = session.query(CommodityCategory).all() or [] + session.flush() + if commodity_categories: + commodity_categories = [ + cc.serialize_with_commodities for cc in commodity_categories + ] + currencies = ( + session.query(Currency.abbreviation, Currency.country).distinct() or [] + ) + session.flush() + if currencies: + currencies = [ + {"value": c[0], "label": c[0], "country": c[1]} for c in currencies + ] + countries = ( + session.query(Country).filter(Country.parent.is_(None)).all() + or [] # noqa + ) + session.flush() + if countries: + countries = [c.to_dropdown for c in countries] + min_js += "var master={};".format( + str( + { + "business_units": business_units, + "commodity_categories": commodity_categories, + "currencies": currencies, + "countries": countries, + } + ) + ) + with open(JS_FILE, "w") as jsfile: + jsfile.write(min_js) + print("[DONE] Config generated") + session.close() + + +generate_config_file() From 373f9307b914f39149a86056f85a4b1006502e40 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 12:23:33 +0800 Subject: [PATCH 2/8] [#346] Optimize models --- backend/models/__init__.py | 11 +++++++++++ backend/models/business_unit.py | 9 +++++---- backend/models/reset_password.py | 2 +- backend/models/user_business_unit.py | 20 ++++++++++---------- backend/setup.cfg | 3 +++ 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/backend/models/__init__.py b/backend/models/__init__.py index e69de29b..b285c847 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -0,0 +1,11 @@ +from sqlalchemy.orm import configure_mappers + +from models.user import User +from models.business_unit import BusinessUnit +from models.commodity_category import CommodityCategory +from models.currency import Currency +from models.country import Country +from models.question import Question + +# Ensure all models are imported before configuring mappers +configure_mappers() diff --git a/backend/models/business_unit.py b/backend/models/business_unit.py index 9739ca56..a3251c11 100644 --- a/backend/models/business_unit.py +++ b/backend/models/business_unit.py @@ -1,9 +1,10 @@ -from db.connection import Base -from sqlalchemy import Column, Integer, String -from sqlalchemy.orm import relationship from typing import Optional from typing_extensions import TypedDict +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship + from pydantic import BaseModel +from db.connection import Base class BusinessUnitDict(TypedDict): @@ -18,7 +19,7 @@ class BusinessUnit(Base): name = Column(String, nullable=False, unique=True) business_unit_users = relationship( - 'UserBusinessUnit', + "UserBusinessUnit", cascade="all, delete", passive_deletes=True, back_populates="business_unit_detail" diff --git a/backend/models/reset_password.py b/backend/models/reset_password.py index bda803d9..16daa6e3 100644 --- a/backend/models/reset_password.py +++ b/backend/models/reset_password.py @@ -18,7 +18,7 @@ class ResetPasswordBase(BaseModel): expired: bool class Config: - orm_mode = True + from_attributes = True class ResetPassword(Base): diff --git a/backend/models/user_business_unit.py b/backend/models/user_business_unit.py index a9b7994c..7935f6f9 100644 --- a/backend/models/user_business_unit.py +++ b/backend/models/user_business_unit.py @@ -1,12 +1,12 @@ import enum -from db.connection import Base -from sqlalchemy import Column, ForeignKey, Integer, Enum -from sqlalchemy.orm import relationship from typing import Optional from typing_extensions import TypedDict +from sqlalchemy import Column, ForeignKey, Integer, Enum +from sqlalchemy.orm import relationship + from pydantic import BaseModel -from models.business_unit import BusinessUnit +from db.connection import Base class UserBusinessUnitRole(enum.Enum): @@ -37,10 +37,10 @@ class UserBusinessUnit(Base): id = Column(Integer, primary_key=True, nullable=False) user = Column(Integer, ForeignKey("user.id"), nullable=False) - business_unit = Column(Integer, ForeignKey("business_unit.id"), nullable=False) - role = Column( - Enum(UserBusinessUnitRole, name="user_business_unit_role"), nullable=False - ) + business_unit = Column( + Integer, ForeignKey("business_unit.id"), nullable=False) + role = Column(Enum( + UserBusinessUnitRole, name="user_business_unit_role"), nullable=False) user_business_unit_user_detail = relationship( "User", @@ -49,7 +49,7 @@ class UserBusinessUnit(Base): back_populates="user_business_units", ) business_unit_detail = relationship( - BusinessUnit, + "BusinessUnit", cascade="all, delete", passive_deletes=True, back_populates="business_unit_users", @@ -60,7 +60,7 @@ def __init__( business_unit: int, role: UserBusinessUnitRole, id: Optional[int] = None, - user: Optional[int] = None, + user: Optional[int] = None ): self.id = id self.user = user diff --git a/backend/setup.cfg b/backend/setup.cfg index 1e39ded3..def45731 100644 --- a/backend/setup.cfg +++ b/backend/setup.cfg @@ -2,6 +2,9 @@ max-line-length = 88 ignore = E203, E266, E501, W503 select = E,W,F +per-file-ignores = + # imported but unused + __init__.py: F401 [tool.black] line-length = 88 From b7a73270109fe838e32d6df97d01076e4fdeed48 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 12:36:15 +0800 Subject: [PATCH 3/8] [#346] Execute generate_config.sh instead of calling from main config --- backend/core/config.py | 4 +--- backend/dev.sh | 2 ++ backend/main.py | 3 +-- backend/run.sh | 3 +++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/core/config.py b/backend/core/config.py index 466024cc..5c9d1aae 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -15,7 +15,7 @@ from routes.visualization import visualization_route from routes.reference_data import reference_data_routes -from utils.generate_config import generate_config_file, JS_FILE +from utils.generate_config import JS_FILE app = FastAPI( @@ -34,8 +34,6 @@ }, ) -generate_config_file() - # Routes register app.include_router(organisation_route) diff --git a/backend/dev.sh b/backend/dev.sh index 7af02b0d..a1be1afa 100755 --- a/backend/dev.sh +++ b/backend/dev.sh @@ -6,4 +6,6 @@ pip check alembic upgrade head +./generate_config.sh + uvicorn main:app --reload --port 5000 diff --git a/backend/main.py b/backend/main.py index c917af33..4ac0ce8a 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,9 +1,8 @@ import uvicorn from db.connection import engine, Base -from core.config import app, generate_config_file +from core.config import app Base.metadata.create_all(bind=engine) if __name__ == "__main__": - generate_config_file() uvicorn.run(app, host="0.0.0.0", port=5000) diff --git a/backend/run.sh b/backend/run.sh index 6fa5558d..9e399492 100644 --- a/backend/run.sh +++ b/backend/run.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash alembic upgrade head + +./generate_config.sh + python main.py From da24a041a8e1878445c3d92f8f4f5e1c1a2e54b2 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 13:12:34 +0800 Subject: [PATCH 4/8] [#346] Fix error --- backend/dev.sh | 3 --- backend/main.py | 4 ++++ backend/run.sh | 3 --- backend/setup.cfg | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/backend/dev.sh b/backend/dev.sh index a1be1afa..8d012005 100755 --- a/backend/dev.sh +++ b/backend/dev.sh @@ -5,7 +5,4 @@ pip -q install --cache-dir=.pip -r requirements.txt pip check alembic upgrade head - -./generate_config.sh - uvicorn main:app --reload --port 5000 diff --git a/backend/main.py b/backend/main.py index 4ac0ce8a..f3915ab1 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,8 +1,12 @@ import uvicorn +import models + from db.connection import engine, Base from core.config import app +from utils.generate_config import generate_config_file Base.metadata.create_all(bind=engine) if __name__ == "__main__": + generate_config_file() uvicorn.run(app, host="0.0.0.0", port=5000) diff --git a/backend/run.sh b/backend/run.sh index 9e399492..6fa5558d 100644 --- a/backend/run.sh +++ b/backend/run.sh @@ -1,7 +1,4 @@ #!/usr/bin/env bash alembic upgrade head - -./generate_config.sh - python main.py diff --git a/backend/setup.cfg b/backend/setup.cfg index def45731..8bd5a34a 100644 --- a/backend/setup.cfg +++ b/backend/setup.cfg @@ -5,6 +5,7 @@ select = E,W,F per-file-ignores = # imported but unused __init__.py: F401 + main.py: F401 [tool.black] line-length = 88 From 3222ca2da9e0e60a0300686d98fba11187004e69 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 13:31:38 +0800 Subject: [PATCH 5/8] [#346] Fix error --- backend/core/config.py | 61 +++++++++++++++++++++++++++++++++++++- backend/main.py | 5 ++-- backend/models/__init__.py | 18 +++++------ 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/backend/core/config.py b/backend/core/config.py index 5c9d1aae..cc6f2b35 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -15,7 +15,66 @@ from routes.visualization import visualization_route from routes.reference_data import reference_data_routes -from utils.generate_config import JS_FILE +import os +from jsmin import jsmin +from db.connection import SessionLocal + +from models.business_unit import BusinessUnit +from models.commodity_category import CommodityCategory +from models.currency import Currency +from models.country import Country + + +JS_FILE = "./config.min.js" + + +def generate_config_file() -> None: + print("[START] Generating config") + session = SessionLocal() + env_js = "var __ENV__={" + env_js += 'client_id:"{}"'.format(os.environ["CLIENT_ID"]) + env_js += ', client_secret:"{}"'.format(os.environ["CLIENT_SECRET"]) + env_js += "};" + min_js = jsmin("".join([env_js, ""])) + business_units = session.query(BusinessUnit).all() or [] + session.flush() + if business_units: + business_units = [bu.serialize for bu in business_units] + commodity_categories = session.query(CommodityCategory).all() or [] + session.flush() + if commodity_categories: + commodity_categories = [ + cc.serialize_with_commodities for cc in commodity_categories + ] + currencies = ( + session.query(Currency.abbreviation, Currency.country).distinct() or [] + ) + session.flush() + if currencies: + currencies = [ + {"value": c[0], "label": c[0], "country": c[1]} for c in currencies + ] + countries = ( + session.query(Country).filter(Country.parent.is_(None)).all() + or [] # noqa + ) + session.flush() + if countries: + countries = [c.to_dropdown for c in countries] + min_js += "var master={};".format( + str( + { + "business_units": business_units, + "commodity_categories": commodity_categories, + "currencies": currencies, + "countries": countries, + } + ) + ) + with open(JS_FILE, "w") as jsfile: + jsfile.write(min_js) + print("[DONE] Config generated") + session.close() app = FastAPI( diff --git a/backend/main.py b/backend/main.py index f3915ab1..d9cab5dc 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,9 +1,8 @@ import uvicorn -import models +# import models from db.connection import engine, Base -from core.config import app -from utils.generate_config import generate_config_file +from core.config import app, generate_config_file Base.metadata.create_all(bind=engine) diff --git a/backend/models/__init__.py b/backend/models/__init__.py index b285c847..d21b7a75 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -1,11 +1,11 @@ -from sqlalchemy.orm import configure_mappers +# from sqlalchemy.orm import configure_mappers -from models.user import User -from models.business_unit import BusinessUnit -from models.commodity_category import CommodityCategory -from models.currency import Currency -from models.country import Country -from models.question import Question +# from models.user import User +# from models.business_unit import BusinessUnit +# from models.commodity_category import CommodityCategory +# from models.currency import Currency +# from models.country import Country +# from models.question import Question -# Ensure all models are imported before configuring mappers -configure_mappers() +# # Ensure all models are imported before configuring mappers +# configure_mappers() From 0d06993bd23ea9bd24007a3ff65bbf193d78ec65 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 13:43:39 +0800 Subject: [PATCH 6/8] [#346] Remove unused code --- backend/generate_config.sh | 4 +++- backend/main.py | 1 - backend/models/__init__.py | 11 ----------- backend/setup.cfg | 1 - 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/backend/generate_config.sh b/backend/generate_config.sh index c8a1eee4..fd6d3c2f 100755 --- a/backend/generate_config.sh +++ b/backend/generate_config.sh @@ -1,3 +1,5 @@ #!/usr/bin/env bash +set -eu -python -m utils.generate_config +# Run the Python command to import and execute the function +python -c "from core.config import generate_config_file; generate_config_file(); exit()" diff --git a/backend/main.py b/backend/main.py index d9cab5dc..d77ab885 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,5 +1,4 @@ import uvicorn -# import models from db.connection import engine, Base from core.config import app, generate_config_file diff --git a/backend/models/__init__.py b/backend/models/__init__.py index d21b7a75..e69de29b 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -1,11 +0,0 @@ -# from sqlalchemy.orm import configure_mappers - -# from models.user import User -# from models.business_unit import BusinessUnit -# from models.commodity_category import CommodityCategory -# from models.currency import Currency -# from models.country import Country -# from models.question import Question - -# # Ensure all models are imported before configuring mappers -# configure_mappers() diff --git a/backend/setup.cfg b/backend/setup.cfg index 8bd5a34a..def45731 100644 --- a/backend/setup.cfg +++ b/backend/setup.cfg @@ -5,7 +5,6 @@ select = E,W,F per-file-ignores = # imported but unused __init__.py: F401 - main.py: F401 [tool.black] line-length = 88 From 1a07cfbeffdfb14dc5342271d88b50a58c3af38d Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 13:45:26 +0800 Subject: [PATCH 7/8] [#346] Session flush after commit --- backend/db/crud_case.py | 7 +++++++ backend/db/crud_reset_password.py | 1 + backend/db/crud_segment.py | 1 + backend/db/crud_user.py | 3 +++ backend/seeder/commodity.py | 2 ++ 5 files changed, 14 insertions(+) diff --git a/backend/db/crud_case.py b/backend/db/crud_case.py index 2f1db208..c83bdffb 100644 --- a/backend/db/crud_case.py +++ b/backend/db/crud_case.py @@ -171,6 +171,7 @@ def update_case(session: Session, id: int, payload: CaseBase) -> CaseDict: for ct in prev_tags: session.delete(ct) session.commit() + session.flush() # store new tags for tag_id in payload.tags: tag = CaseTag(tag=tag_id, case=case.id) @@ -290,9 +291,11 @@ def delete_case(session: Session, case_id: int): for sa in segment_answer: session.delete(sa) session.commit() + session.flush() for s in segment: session.delete(s) session.commit() + session.flush() # visualization visualization = ( @@ -303,6 +306,7 @@ def delete_case(session: Session, case_id: int): for vis in visualization: session.delete(vis) session.commit() + session.flush() # case_commodity case_commodity = ( @@ -313,12 +317,14 @@ def delete_case(session: Session, case_id: int): for cc in case_commodity: session.delete(cc) session.commit() + session.flush() # case tag case_tag = session.query(CaseTag).filter(CaseTag.case == case_id).all() for ct in case_tag: session.delete(ct) session.commit() + session.flush() # user case user_case_access = ( @@ -329,6 +335,7 @@ def delete_case(session: Session, case_id: int): for uca in user_case_access: session.delete(uca) session.commit() + session.flush() session.delete(case) session.commit() diff --git a/backend/db/crud_reset_password.py b/backend/db/crud_reset_password.py index e722cde7..4fe5fd0a 100644 --- a/backend/db/crud_reset_password.py +++ b/backend/db/crud_reset_password.py @@ -36,3 +36,4 @@ def get_reset_password(session: Session, url: str) -> ResetPasswordBase: def delete_reset_password(session: Session, url: str) -> None: session.query(ResetPassword).filter(ResetPassword.url == url).delete() session.commit() + session.flush() diff --git a/backend/db/crud_segment.py b/backend/db/crud_segment.py index 339fae87..58739750 100644 --- a/backend/db/crud_segment.py +++ b/backend/db/crud_segment.py @@ -71,6 +71,7 @@ def update_segment( for sa in prev_segment_answers: session.delete(sa) session.commit() + session.flush() # handle segment answers for val in payload.answers: segment_answer = SegmentAnswer( diff --git a/backend/db/crud_user.py b/backend/db/crud_user.py index 610cabe6..49b6b496 100644 --- a/backend/db/crud_user.py +++ b/backend/db/crud_user.py @@ -117,6 +117,7 @@ def update_user( for ut in prev_user_tags: session.delete(ut) session.commit() + session.flush() # add new user tags for tag in payload.tags: user_tag = UserTag(user=user.id, tag=tag) @@ -131,6 +132,7 @@ def update_user( for uc in prev_user_cases: session.delete(uc) session.commit() + session.flush() # add new user case access for proj in payload.cases: case_access = UserCaseAccess( @@ -153,6 +155,7 @@ def update_user( for bu in prev_user_bus: session.delete(bu) session.commit() + session.flush() # add new user business units for bu in payload.business_units: business_unit = UserBusinessUnit( diff --git a/backend/seeder/commodity.py b/backend/seeder/commodity.py index 5e5ab44c..248bbb3d 100644 --- a/backend/seeder/commodity.py +++ b/backend/seeder/commodity.py @@ -47,6 +47,7 @@ def seeder_commodity(session: Session): if category_objects: session.bulk_save_objects(category_objects, update_changed_only=True) session.commit() + session.flush() print("[DATABASE UPDATED]: Commodity Category") commodities = commodities[["id", "group_id", "name"]] @@ -73,6 +74,7 @@ def seeder_commodity(session: Session): if commodity_objects: session.bulk_save_objects(commodity_objects, update_changed_only=True) session.commit() + session.flush() print("[DATABASE UPDATED]: Commodity") session.close() From e5610cf1d49fcb44012e7e45172f3ab4ad28e1b8 Mon Sep 17 00:00:00 2001 From: wayangalihpratama Date: Tue, 11 Jun 2024 13:47:05 +0800 Subject: [PATCH 8/8] [#346] Remove utils generate_config.py --- backend/utils/generate_config.py | 63 -------------------------------- 1 file changed, 63 deletions(-) delete mode 100644 backend/utils/generate_config.py diff --git a/backend/utils/generate_config.py b/backend/utils/generate_config.py deleted file mode 100644 index 29cd4b2b..00000000 --- a/backend/utils/generate_config.py +++ /dev/null @@ -1,63 +0,0 @@ -import os -from jsmin import jsmin -from db.connection import SessionLocal - -from models.business_unit import BusinessUnit -from models.commodity_category import CommodityCategory -from models.currency import Currency -from models.country import Country - - -JS_FILE = "./config.min.js" - - -def generate_config_file() -> None: - print("[START] Generating config") - session = SessionLocal() - env_js = "var __ENV__={" - env_js += 'client_id:"{}"'.format(os.environ["CLIENT_ID"]) - env_js += ', client_secret:"{}"'.format(os.environ["CLIENT_SECRET"]) - env_js += "};" - min_js = jsmin("".join([env_js, ""])) - business_units = session.query(BusinessUnit).all() or [] - session.flush() - if business_units: - business_units = [bu.serialize for bu in business_units] - commodity_categories = session.query(CommodityCategory).all() or [] - session.flush() - if commodity_categories: - commodity_categories = [ - cc.serialize_with_commodities for cc in commodity_categories - ] - currencies = ( - session.query(Currency.abbreviation, Currency.country).distinct() or [] - ) - session.flush() - if currencies: - currencies = [ - {"value": c[0], "label": c[0], "country": c[1]} for c in currencies - ] - countries = ( - session.query(Country).filter(Country.parent.is_(None)).all() - or [] # noqa - ) - session.flush() - if countries: - countries = [c.to_dropdown for c in countries] - min_js += "var master={};".format( - str( - { - "business_units": business_units, - "commodity_categories": commodity_categories, - "currencies": currencies, - "countries": countries, - } - ) - ) - with open(JS_FILE, "w") as jsfile: - jsfile.write(min_js) - print("[DONE] Config generated") - session.close() - - -generate_config_file()