From 698ef79449213b4977619c09c78936e5c751cae2 Mon Sep 17 00:00:00 2001 From: xbasset Date: Mon, 24 Jun 2024 16:28:23 +0200 Subject: [PATCH 1/8] remove input_keys --- mojodex_core/entities/abstract_entities/workflow_step.py | 9 --------- mojodex_core/workflows/write_poem/divide_in_stanza.py | 4 ---- mojodex_core/workflows/write_poem/write_stanza.py | 4 ---- 3 files changed, 17 deletions(-) diff --git a/mojodex_core/entities/abstract_entities/workflow_step.py b/mojodex_core/entities/abstract_entities/workflow_step.py index 4a97d4ac..e9160232 100644 --- a/mojodex_core/entities/abstract_entities/workflow_step.py +++ b/mojodex_core/entities/abstract_entities/workflow_step.py @@ -48,11 +48,6 @@ def get_definition_in_language(self, language_code): except Exception as e: raise Exception(f"{self.__class__.__name__} :: get_definition_in_language :: {e}") - @property - @abstractmethod - def input_keys(self) -> List[str]: - raise NotImplementedError - @property @abstractmethod def output_keys(self) -> List[str]: @@ -71,10 +66,6 @@ def execute(self, parameter: dict, learned_instructions: dict, initial_parameter """ try: - # ensure that input keys are present in parameter - for key in self.input_keys: - if key not in parameter: - raise Exception(f"execute :: key {key} not in parameter") output = self._execute(parameter, learned_instructions, initial_parameter, past_validated_steps_results, user_id, user_task_execution_pk, task_name_for_system, session_id) # list of dict # ensure output is a list diff --git a/mojodex_core/workflows/write_poem/divide_in_stanza.py b/mojodex_core/workflows/write_poem/divide_in_stanza.py index 72f179b6..38c11945 100644 --- a/mojodex_core/workflows/write_poem/divide_in_stanza.py +++ b/mojodex_core/workflows/write_poem/divide_in_stanza.py @@ -16,10 +16,6 @@ class StanzaDividerStep(WorkflowStep): def definition_for_system(self): return "Determine topic of each stanza of a poem." - @property - def input_keys(self): - return ['poem_topic', 'n_stanzas'] - @property def output_keys(self): return ['stanza_topic'] diff --git a/mojodex_core/workflows/write_poem/write_stanza.py b/mojodex_core/workflows/write_poem/write_stanza.py index 71c6cb52..33e99581 100644 --- a/mojodex_core/workflows/write_poem/write_stanza.py +++ b/mojodex_core/workflows/write_poem/write_stanza.py @@ -12,10 +12,6 @@ class StanzaWriterStep(WorkflowStep): def definition_for_system(self): return "Write stanza of a poem" - @property - def input_keys(self): - return ['stanza_topic'] - @property def output_keys(self): return ['stanza'] From f7cf0d6c1e31338e24256064575b5e5383dbe4a1 Mon Sep 17 00:00:00 2001 From: xbasset Date: Mon, 24 Jun 2024 17:04:55 +0200 Subject: [PATCH 2/8] remove output keys from workflow step and implementations --- .../models/workflows/workflow_process_controller.py | 5 ++++- .../entities/abstract_entities/workflow_step.py | 12 +++--------- .../workflows/write_poem/divide_in_stanza.py | 5 ----- mojodex_core/workflows/write_poem/write_stanza.py | 4 ---- 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/backend/app/models/workflows/workflow_process_controller.py b/backend/app/models/workflows/workflow_process_controller.py index dc5e2528..4ba1bfa3 100644 --- a/backend/app/models/workflows/workflow_process_controller.py +++ b/backend/app/models/workflows/workflow_process_controller.py @@ -52,8 +52,11 @@ def _get_next_step_execution_to_run(self): self._current_step = self._generate_new_step_execution(self.workflow_execution.task.steps[0], self.get_formatted_initial_parameters()) # of first step return self._current_step + last_validated_step_execution = self.workflow_execution.past_valid_step_executions[-1] - if len(self.workflow_execution.past_valid_step_executions) > 1: # no dependency as it was the first step + + + if len(self.workflow_execution.past_valid_step_executions) > 1: # if it's not the 1st else no dependency as it was the first step db_dependency_step = self.db_session.query(MdWorkflowStep) \ .join(MdUserTask, MdUserTask.task_fk == MdWorkflowStep.task_fk) \ .filter(MdUserTask.user_task_pk == self.workflow_execution.user_task_fk) \ diff --git a/mojodex_core/entities/abstract_entities/workflow_step.py b/mojodex_core/entities/abstract_entities/workflow_step.py index e9160232..90df8472 100644 --- a/mojodex_core/entities/abstract_entities/workflow_step.py +++ b/mojodex_core/entities/abstract_entities/workflow_step.py @@ -48,11 +48,6 @@ def get_definition_in_language(self, language_code): except Exception as e: raise Exception(f"{self.__class__.__name__} :: get_definition_in_language :: {e}") - @property - @abstractmethod - def output_keys(self) -> List[str]: - raise NotImplementedError - def _execute(self, parameter: dict, learned_instructions: dict, initial_parameters: dict, past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, task_name_for_system: str, session_id: str): @@ -62,7 +57,8 @@ def execute(self, parameter: dict, learned_instructions: dict, initial_parameter past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, task_name_for_system: str, session_id: str): """ - Returns a list of parameters (dict) + Execute the workflow step. + See [Workflow Doc](/docs/design-principles/workflows/execute_workflow.md) for more details. """ try: @@ -75,9 +71,7 @@ def execute(self, parameter: dict, learned_instructions: dict, initial_parameter for item in output: if not isinstance(item, dict): raise Exception(f"execute :: output item {item} is not a dict") - for key in self.output_keys: - if key not in item: - raise Exception(f"execute :: key {key} not in output") + return output except Exception as e: raise Exception(f"{self.__class__.__name__} execute :: {e}") diff --git a/mojodex_core/workflows/write_poem/divide_in_stanza.py b/mojodex_core/workflows/write_poem/divide_in_stanza.py index 38c11945..1715143f 100644 --- a/mojodex_core/workflows/write_poem/divide_in_stanza.py +++ b/mojodex_core/workflows/write_poem/divide_in_stanza.py @@ -15,11 +15,6 @@ class StanzaDividerStep(WorkflowStep): @property def definition_for_system(self): return "Determine topic of each stanza of a poem." - - @property - def output_keys(self): - return ['stanza_topic'] - def _execute(self, parameter: dict, learned_instructions: dict, initial_parameter: dict, past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, task_name_for_system: str, session_id:str): try: diff --git a/mojodex_core/workflows/write_poem/write_stanza.py b/mojodex_core/workflows/write_poem/write_stanza.py index 33e99581..955f22c7 100644 --- a/mojodex_core/workflows/write_poem/write_stanza.py +++ b/mojodex_core/workflows/write_poem/write_stanza.py @@ -11,10 +11,6 @@ class StanzaWriterStep(WorkflowStep): @property def definition_for_system(self): return "Write stanza of a poem" - - @property - def output_keys(self): - return ['stanza'] def _execute(self, parameter: dict, learned_instructions: dict, initial_parameter: dict, past_validated_steps_results: List[dict], user_id: str,user_task_execution_pk: int, task_name_for_system: str, session_id: str): try: From e12938ea323ef9640d25953fd4175acc522dce83 Mon Sep 17 00:00:00 2001 From: xbasset Date: Wed, 26 Jun 2024 18:10:06 +0200 Subject: [PATCH 3/8] deprecated step implem with major versions updates --- .../workflows/workflow_process_controller.py | 8 +- backend/app/routes/daily_emails.py | 4 +- backend/requirements.txt | 10 +- background/app/app.py | 3 +- background/requirements.txt | 15 +- docker-compose.yaml | 2 - docs/technical-architecture/database.md | 6 + .../abstract_entities/abstract_entity.py | 6 - mojodex_core/entities/db_base_entities.py | 711 +++++++++--------- mojodex_core/entities/instruct_task.py | 2 +- mojodex_core/entities/instruct_user_task.py | 2 +- .../entities/instruct_user_task_execution.py | 2 +- .../entities/{abstract_entities => }/task.py | 19 +- .../{abstract_entities => }/user_task.py | 24 +- .../user_task_execution.py | 23 +- mojodex_core/entities/user_workflow.py | 2 +- .../entities/user_workflow_execution.py | 12 +- .../entities/user_workflow_step_execution.py | 3 +- mojodex_core/entities/workflow.py | 7 +- .../{abstract_entities => }/workflow_step.py | 22 +- mojodex_core/requirements.txt | 2 +- .../workflows/write_poem/divide_in_stanza.py | 3 +- .../workflows/write_poem/write_stanza.py | 2 +- 23 files changed, 425 insertions(+), 465 deletions(-) delete mode 100644 mojodex_core/entities/abstract_entities/abstract_entity.py rename mojodex_core/entities/{abstract_entities => }/task.py (60%) rename mojodex_core/entities/{abstract_entities => }/user_task.py (53%) rename mojodex_core/entities/{abstract_entities => }/user_task_execution.py (75%) rename mojodex_core/entities/{abstract_entities => }/workflow_step.py (82%) diff --git a/backend/app/models/workflows/workflow_process_controller.py b/backend/app/models/workflows/workflow_process_controller.py index 4ba1bfa3..e0a25a5f 100644 --- a/backend/app/models/workflows/workflow_process_controller.py +++ b/backend/app/models/workflows/workflow_process_controller.py @@ -87,10 +87,10 @@ def _get_next_step_execution_to_run(self): .filter( case( # When `MdWorkflowStep.user_validation_required` is `True`, we check that `MdUserWorkflowStepExecution.validated` is also `True` - [ + (MdWorkflowStep.user_validation_required == True, UserWorkflowStepExecution.validated == True), - ], + # if `user_validation_required` is `False`, we don't care about the `validated` status, and the `MdUserWorkflowStepExecution` will be included in the results regardless of its `validated` value. else_=True )) \ @@ -200,11 +200,11 @@ def _generate_produced_text(self): .filter( case( # When `MdWorkflowStep.user_validation_required` is `True`, we check that `MdUserWorkflowStepExecution.validated` is also `True` - [ + ( MdWorkflowStep.user_validation_required == True, UserWorkflowStepExecution.validated == True), - ], + # if `user_validation_required` is `False`, we don't care about the `validated` status, and the `MdUserWorkflowStepExecution` will be included in the results regardless of its `validated` value. else_=True ) diff --git a/backend/app/routes/daily_emails.py b/backend/app/routes/daily_emails.py index a4318143..6fc9fdef 100644 --- a/backend/app/routes/daily_emails.py +++ b/backend/app/routes/daily_emails.py @@ -197,10 +197,10 @@ def post(self): func.coalesce( n_meeting_minutes_subquery.c.today_meeting_minutes_counts, 0 ).label("n_meeting_minutes_today"), - case([(reminder_email_yesterday_subquery.c.user_id.is_(None), False)], + case((reminder_email_yesterday_subquery.c.user_id.is_(None), False), else_=True).label( "received_reminder_email_yesterday"), - case([(reminder_email_day_before_yesterday_subquery.c.user_id.is_(None), False)], + case((reminder_email_day_before_yesterday_subquery.c.user_id.is_(None), False), else_=True).label( "reminder_email_day_before_yesterday"), func.coalesce(process_count_subquery.c.process_count_since_today, 0).label("n_processes_created_today"), diff --git a/backend/requirements.txt b/backend/requirements.txt index 63386735..e8b9aff1 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,13 +1,13 @@ itsdangerous<2.0.1 -flask==2.0.1 -Flask-WTF==1.1.1 +flask==2.2.5 +Flask-WTF==1.2.1 flask_restful==0.3.10 -flask-sqlalchemy==2.4.4 +Flask-SQLAlchemy==3.1.1 requests==2.31.0 pandas==2.0.3 pyjwt==2.8.0 -Jinja2<3.1 -werkzeug==2.0.1 +Jinja2==3.1.2 +werkzeug==2.3.7 gunicorn==20.1.0 flask-socketio==5.3.3 google-search-results==2.4.2 diff --git a/background/app/app.py b/background/app/app.py index 5054fc4e..e7c1fce1 100644 --- a/background/app/app.py +++ b/background/app/app.py @@ -34,7 +34,6 @@ db = SQLAlchemy(app) api = Api(app) -engine_container = db.get_engine(app) from background_logger import BackgroundLogger @@ -56,7 +55,7 @@ @app.route("/") def index(): - message = "Welcome to Mojodex Backend Service." + message = "Welcome to Mojodex Background Service." return message diff --git a/background/requirements.txt b/background/requirements.txt index 90ba137d..36f7a89d 100644 --- a/background/requirements.txt +++ b/background/requirements.txt @@ -1,22 +1,19 @@ itsdangerous<2.0.1 -flask==2.0.1 -Flask-WTF==1.1.1 +flask==2.2.5 +Flask-WTF==1.2.1 flask_restful==0.3.10 -flask-sqlalchemy==2.4.4 +Flask-SQLAlchemy==3.1.1 gevent==23.9.1 gevent-websocket==0.10.1 requests==2.31.0 pandas==2.0.3 -Jinja2<3.1 -werkzeug==2.0.1 +Jinja2==3.1.2 +werkzeug==2.3.7 gunicorn==20.1.0 google-search-results==2.4.2 eventlet==0.30.2 ipython==8.12.2 bs4==0.0.1 -pydantic==1.10.9 ---index-url https://pypi.fury.io/gantry-ml/ ---extra-index-url https://pypi.org/simple/ -gantry-logger==0.0.1a4 +pydantic==2.5.2 boto3==1.28.56 configparser==6.0.0 \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index c2f7b78e..78b1630a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,3 @@ -version: '3' - services: mojodex-db: diff --git a/docs/technical-architecture/database.md b/docs/technical-architecture/database.md index f937559c..c792da81 100644 --- a/docs/technical-architecture/database.md +++ b/docs/technical-architecture/database.md @@ -134,6 +134,12 @@ Each table is represented as a python class in `mojodex_code/entities.py`. This sqlacodegen postgresql+psycopg2://$DBUSER:$DBPASS@localhost:5432/$DBNAME --outfile mojodex_core/entities/db_base_entities.py ``` +⚠️ Be sure to install `sqlacodegen` with the appropriate pg_vector features: +``` +python3 -m pip install git+https://github.com/hoomano/sqlacodegen.git@feature-pgvector +``` + + ## Go further You can use the Mojodex API to create new users, products, tasks, etc. diff --git a/mojodex_core/entities/abstract_entities/abstract_entity.py b/mojodex_core/entities/abstract_entities/abstract_entity.py deleted file mode 100644 index 4ba5156f..00000000 --- a/mojodex_core/entities/abstract_entities/abstract_entity.py +++ /dev/null @@ -1,6 +0,0 @@ -from abc import ABCMeta -from sqlalchemy.ext.declarative import DeclarativeMeta - -# Create a custom metaclass that inherits from both ABCMeta and DeclarativeMeta -class AbstractEntity(DeclarativeMeta, ABCMeta): - pass \ No newline at end of file diff --git a/mojodex_core/entities/db_base_entities.py b/mojodex_core/entities/db_base_entities.py index ae03c047..5747f987 100644 --- a/mojodex_core/entities/db_base_entities.py +++ b/mojodex_core/entities/db_base_entities.py @@ -1,8 +1,12 @@ +from typing import Any, List, Optional + from pgvector.sqlalchemy import Vector -from sqlalchemy import Boolean, Column, Date, DateTime, Enum, ForeignKeyConstraint, Integer, JSON, PrimaryKeyConstraint, Sequence, String, Text, UniqueConstraint, text -from sqlalchemy.orm import declarative_base, relationship +from sqlalchemy import Boolean, Date, DateTime, Enum, ForeignKeyConstraint, Integer, JSON, PrimaryKeyConstraint, Sequence, String, Text, UniqueConstraint, text +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship +import datetime -Base = declarative_base() +class Base(DeclarativeBase): + pass class MdCompany(Base): @@ -11,15 +15,15 @@ class MdCompany(Base): PrimaryKeyConstraint('company_pk', name='md_company_pkey'), ) - company_pk = Column(Integer, Sequence('md_company_seq'), primary_key=True) - creation_date = Column(DateTime, nullable=False) - name = Column(String(255)) - website = Column(String(255)) - additional_info = Column(JSON) - emoji = Column(String(255)) - last_update_date = Column(DateTime(True)) + company_pk: Mapped[int] = mapped_column(Integer, Sequence('md_company_seq'), primary_key=True) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime) + name: Mapped[Optional[str]] = mapped_column(String(255)) + website: Mapped[Optional[str]] = mapped_column(String(255)) + additional_info: Mapped[Optional[dict]] = mapped_column(JSON) + emoji: Mapped[Optional[str]] = mapped_column(String(255)) + last_update_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - md_user = relationship('MdUser', back_populates='md_company') + md_user: Mapped[List['MdUser']] = relationship('MdUser', back_populates='md_company') class MdPlatform(Base): @@ -28,10 +32,10 @@ class MdPlatform(Base): PrimaryKeyConstraint('platform_pk', name='md_platform_pkey'), ) - platform_pk = Column(Integer, Sequence('md_platform_seq'), primary_key=True) - name = Column(String(255), nullable=False) + platform_pk: Mapped[int] = mapped_column(Integer, Sequence('md_platform_seq'), primary_key=True) + name: Mapped[str] = mapped_column(String(255)) - md_task_platform_association = relationship('MdTaskPlatformAssociation', back_populates='md_platform') + md_task_platform_association: Mapped[List['MdTaskPlatformAssociation']] = relationship('MdTaskPlatformAssociation', back_populates='md_platform') class MdProductCategory(Base): @@ -40,15 +44,15 @@ class MdProductCategory(Base): PrimaryKeyConstraint('product_category_pk', name='md_product_category_pkey'), ) - product_category_pk = Column(Integer, Sequence('md_product_category_pk_seq'), primary_key=True) - label = Column(String(255), nullable=False) - emoji = Column(String(255), nullable=False) - implicit_goal = Column(String(255), nullable=False) - visible = Column(Boolean, nullable=False, server_default=text('false')) + product_category_pk: Mapped[int] = mapped_column(Integer, Sequence('md_product_category_pk_seq'), primary_key=True) + label: Mapped[str] = mapped_column(String(255)) + emoji: Mapped[str] = mapped_column(String(255)) + implicit_goal: Mapped[str] = mapped_column(String(255)) + visible: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) - md_product = relationship('MdProduct', back_populates='md_product_category') - md_product_category_displayed_data = relationship('MdProductCategoryDisplayedData', back_populates='md_product_category') - md_user = relationship('MdUser', back_populates='md_product_category') + md_product: Mapped[List['MdProduct']] = relationship('MdProduct', back_populates='md_product_category') + md_product_category_displayed_data: Mapped[List['MdProductCategoryDisplayedData']] = relationship('MdProductCategoryDisplayedData', back_populates='md_product_category') + md_user: Mapped[List['MdUser']] = relationship('MdUser', back_populates='md_product_category') class MdTextEditAction(Base): @@ -57,12 +61,12 @@ class MdTextEditAction(Base): PrimaryKeyConstraint('text_edit_action_pk', name='md_text_edit_action_pkey'), ) - text_edit_action_pk = Column(Integer, Sequence('md_text_edit_action_seq'), primary_key=True) - emoji = Column(String(255), nullable=False) - prompt_file_name = Column(String(255), nullable=False) + text_edit_action_pk: Mapped[int] = mapped_column(Integer, Sequence('md_text_edit_action_seq'), primary_key=True) + emoji: Mapped[str] = mapped_column(String(255)) + prompt_file_name: Mapped[str] = mapped_column(String(255)) - md_text_edit_action_displayed_data = relationship('MdTextEditActionDisplayedData', back_populates='md_text_edit_action') - md_text_edit_action_text_type_association = relationship('MdTextEditActionTextTypeAssociation', back_populates='md_text_edit_action') + md_text_edit_action_displayed_data: Mapped[List['MdTextEditActionDisplayedData']] = relationship('MdTextEditActionDisplayedData', back_populates='md_text_edit_action') + md_text_edit_action_text_type_association: Mapped[List['MdTextEditActionTextTypeAssociation']] = relationship('MdTextEditActionTextTypeAssociation', back_populates='md_text_edit_action') class MdTextType(Base): @@ -71,12 +75,12 @@ class MdTextType(Base): PrimaryKeyConstraint('text_type_pk', name='md_text_type_pkey'), ) - text_type_pk = Column(Integer, Sequence('md_text_type_seq'), primary_key=True) - name = Column(String(255), nullable=False) + text_type_pk: Mapped[int] = mapped_column(Integer, Sequence('md_text_type_seq'), primary_key=True) + name: Mapped[str] = mapped_column(String(255)) - md_task = relationship('MdTask', back_populates='md_text_type') - md_text_edit_action_text_type_association = relationship('MdTextEditActionTextTypeAssociation', back_populates='md_text_type') - md_produced_text_version = relationship('MdProducedTextVersion', back_populates='md_text_type') + md_task: Mapped[List['MdTask']] = relationship('MdTask', back_populates='md_text_type') + md_text_edit_action_text_type_association: Mapped[List['MdTextEditActionTextTypeAssociation']] = relationship('MdTextEditActionTextTypeAssociation', back_populates='md_text_type') + md_produced_text_version: Mapped[List['MdProducedTextVersion']] = relationship('MdProducedTextVersion', back_populates='md_text_type') class MdProduct(Base): @@ -87,20 +91,20 @@ class MdProduct(Base): UniqueConstraint('label', name='product_label_key') ) - product_pk = Column(Integer, Sequence('md_product_seq'), primary_key=True) - status = Column(Enum('active', 'inactive', name='md_product_status_'), nullable=False) - free = Column(Boolean, nullable=False) - product_stripe_id = Column(String(255)) - product_category_fk = Column(Integer) - n_days_validity = Column(Integer) - product_apple_id = Column(String(255)) - n_tasks_limit = Column(Integer) - label = Column(String(255)) + product_pk: Mapped[int] = mapped_column(Integer, Sequence('md_product_seq'), primary_key=True) + status: Mapped[str] = mapped_column(Enum('active', 'inactive', name='md_product_status_')) + free: Mapped[bool] = mapped_column(Boolean) + product_stripe_id: Mapped[Optional[str]] = mapped_column(String(255)) + product_category_fk: Mapped[Optional[int]] = mapped_column(Integer) + n_days_validity: Mapped[Optional[int]] = mapped_column(Integer) + product_apple_id: Mapped[Optional[str]] = mapped_column(String(255)) + n_tasks_limit: Mapped[Optional[int]] = mapped_column(Integer) + label: Mapped[Optional[str]] = mapped_column(String(255)) - md_product_category = relationship('MdProductCategory', back_populates='md_product') - md_product_displayed_data = relationship('MdProductDisplayedData', back_populates='md_product') - md_product_task = relationship('MdProductTask', back_populates='md_product') - md_purchase = relationship('MdPurchase', back_populates='md_product') + md_product_category: Mapped['MdProductCategory'] = relationship('MdProductCategory', back_populates='md_product') + md_product_displayed_data: Mapped[List['MdProductDisplayedData']] = relationship('MdProductDisplayedData', back_populates='md_product') + md_product_task: Mapped[List['MdProductTask']] = relationship('MdProductTask', back_populates='md_product') + md_purchase: Mapped[List['MdPurchase']] = relationship('MdPurchase', back_populates='md_product') class MdProductCategoryDisplayedData(Base): @@ -110,13 +114,13 @@ class MdProductCategoryDisplayedData(Base): PrimaryKeyConstraint('product_category_displayed_data_pk', name='md_product_category_displayed_data_pkey') ) - product_category_displayed_data_pk = Column(Integer, Sequence('md_product_category_displayed_data_seq'), primary_key=True) - product_category_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - name_for_user = Column(String(255), nullable=False) - description_for_user = Column(String(255), nullable=False) + product_category_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_product_category_displayed_data_seq'), primary_key=True) + product_category_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + name_for_user: Mapped[str] = mapped_column(String(255)) + description_for_user: Mapped[str] = mapped_column(String(255)) - md_product_category = relationship('MdProductCategory', back_populates='md_product_category_displayed_data') + md_product_category: Mapped['MdProductCategory'] = relationship('MdProductCategory', back_populates='md_product_category_displayed_data') class MdTask(Base): @@ -126,28 +130,28 @@ class MdTask(Base): PrimaryKeyConstraint('task_pk', name='task_pkey') ) - task_pk = Column(Integer, Sequence('md_task_seq'), primary_key=True) - type = Column(Enum('instruct', 'workflow', name='_task_type'), nullable=False, server_default=text("'instruct'::_task_type")) - name_for_system = Column(String(255), nullable=False) - definition_for_system = Column(Text, nullable=False) - visible_for_teasing = Column(Boolean, nullable=False, server_default=text('false')) - result_chat_enabled = Column(Boolean, nullable=False, server_default=text('true')) - final_instruction = Column(Text) - icon = Column(String(255)) - output_text_type_fk = Column(Integer) - output_format_instruction_title = Column(String(255)) - output_format_instruction_draft = Column(String(255)) - infos_to_extract = Column(JSON) - - md_text_type = relationship('MdTextType', back_populates='md_task') - md_product_task = relationship('MdProductTask', back_populates='md_task') - md_task_displayed_data = relationship('MdTaskDisplayedData', back_populates='md_task') - md_task_platform_association = relationship('MdTaskPlatformAssociation', back_populates='md_task') - md_task_predefined_action_association = relationship('MdTaskPredefinedActionAssociation', foreign_keys='[MdTaskPredefinedActionAssociation.predefined_action_fk]', back_populates='md_task') - md_task_predefined_action_association_ = relationship('MdTaskPredefinedActionAssociation', foreign_keys='[MdTaskPredefinedActionAssociation.task_fk]', back_populates='md_task_') - md_user_task = relationship('MdUserTask', back_populates='md_task') - md_workflow_step = relationship('MdWorkflowStep', back_populates='md_task') - md_calendar_suggestion = relationship('MdCalendarSuggestion', back_populates='md_task') + task_pk: Mapped[int] = mapped_column(Integer, Sequence('md_task_seq'), primary_key=True) + type: Mapped[str] = mapped_column(Enum('instruct', 'workflow', name='_task_type'), server_default=text("'instruct'::_task_type")) + name_for_system: Mapped[str] = mapped_column(String(255)) + definition_for_system: Mapped[str] = mapped_column(Text) + visible_for_teasing: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + result_chat_enabled: Mapped[bool] = mapped_column(Boolean, server_default=text('true')) + final_instruction: Mapped[Optional[str]] = mapped_column(Text) + icon: Mapped[Optional[str]] = mapped_column(String(255)) + output_text_type_fk: Mapped[Optional[int]] = mapped_column(Integer) + output_format_instruction_title: Mapped[Optional[str]] = mapped_column(String(255)) + output_format_instruction_draft: Mapped[Optional[str]] = mapped_column(String(255)) + infos_to_extract: Mapped[Optional[dict]] = mapped_column(JSON) + + md_text_type: Mapped['MdTextType'] = relationship('MdTextType', back_populates='md_task') + md_product_task: Mapped[List['MdProductTask']] = relationship('MdProductTask', back_populates='md_task') + md_task_displayed_data: Mapped[List['MdTaskDisplayedData']] = relationship('MdTaskDisplayedData', back_populates='md_task') + md_task_platform_association: Mapped[List['MdTaskPlatformAssociation']] = relationship('MdTaskPlatformAssociation', back_populates='md_task') + md_task_predefined_action_association: Mapped[List['MdTaskPredefinedActionAssociation']] = relationship('MdTaskPredefinedActionAssociation', foreign_keys='[MdTaskPredefinedActionAssociation.predefined_action_fk]', back_populates='md_task') + md_task_predefined_action_association_: Mapped[List['MdTaskPredefinedActionAssociation']] = relationship('MdTaskPredefinedActionAssociation', foreign_keys='[MdTaskPredefinedActionAssociation.task_fk]', back_populates='md_task_') + md_user_task: Mapped[List['MdUserTask']] = relationship('MdUserTask', back_populates='md_task') + md_workflow_step: Mapped[List['MdWorkflowStep']] = relationship('MdWorkflowStep', back_populates='md_task') + md_calendar_suggestion: Mapped[List['MdCalendarSuggestion']] = relationship('MdCalendarSuggestion', back_populates='md_task') class MdTextEditActionDisplayedData(Base): @@ -157,13 +161,13 @@ class MdTextEditActionDisplayedData(Base): PrimaryKeyConstraint('text_edit_action_displayed_data_pk', name='md_text_edit_action_displayed_data_pkey') ) - text_edit_action_displayed_data_pk = Column(Integer, Sequence('md_text_edit_action_displayed_data_seq'), primary_key=True) - text_edit_action_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - name = Column(String(255), nullable=False) - description = Column(String(255), nullable=False) + text_edit_action_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_text_edit_action_displayed_data_seq'), primary_key=True) + text_edit_action_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + name: Mapped[str] = mapped_column(String(255)) + description: Mapped[str] = mapped_column(String(255)) - md_text_edit_action = relationship('MdTextEditAction', back_populates='md_text_edit_action_displayed_data') + md_text_edit_action: Mapped['MdTextEditAction'] = relationship('MdTextEditAction', back_populates='md_text_edit_action_displayed_data') class MdTextEditActionTextTypeAssociation(Base): @@ -174,12 +178,12 @@ class MdTextEditActionTextTypeAssociation(Base): PrimaryKeyConstraint('text_edit_action_text_type_association_pk', name='md_text_edit_action_text_type_association_pkey') ) - text_edit_action_text_type_association_pk = Column(Integer, Sequence('md_text_edit_action_text_type_association_seq'), primary_key=True) - text_type_fk = Column(Integer, nullable=False) - text_edit_action_fk = Column(Integer, nullable=False) + text_edit_action_text_type_association_pk: Mapped[int] = mapped_column(Integer, Sequence('md_text_edit_action_text_type_association_seq'), primary_key=True) + text_type_fk: Mapped[int] = mapped_column(Integer) + text_edit_action_fk: Mapped[int] = mapped_column(Integer) - md_text_edit_action = relationship('MdTextEditAction', back_populates='md_text_edit_action_text_type_association') - md_text_type = relationship('MdTextType', back_populates='md_text_edit_action_text_type_association') + md_text_edit_action: Mapped['MdTextEditAction'] = relationship('MdTextEditAction', back_populates='md_text_edit_action_text_type_association') + md_text_type: Mapped['MdTextType'] = relationship('MdTextType', back_populates='md_text_edit_action_text_type_association') class MdUser(Base): @@ -190,39 +194,39 @@ class MdUser(Base): PrimaryKeyConstraint('user_id', name='user_pkey') ) - user_id = Column(String(255), primary_key=True) - email = Column(String(255), nullable=False) - creation_date = Column(DateTime(True), nullable=False) - todo_email_reception = Column(Boolean, nullable=False, server_default=text('true')) - name = Column(String(255)) - terms_and_conditions_accepted = Column(DateTime(True)) - language_code = Column(String(5)) - summary = Column(Text) - password = Column(String(255)) - google_id = Column(String(255)) - microsoft_id = Column(String(255)) - apple_id = Column(String(255)) - company_fk = Column(Integer) - last_summary_update_date = Column(DateTime(True)) - company_description = Column(Text) - last_company_description_update_date = Column(DateTime(True)) - goal = Column(Text) - timezone_offset = Column(Integer) - onboarding_presented = Column(DateTime(True)) - product_category_fk = Column(Integer) - - md_company = relationship('MdCompany', back_populates='md_user') - md_product_category = relationship('MdProductCategory', back_populates='md_user') - md_device = relationship('MdDevice', back_populates='user') - md_document = relationship('MdDocument', back_populates='author_user') - md_event = relationship('MdEvent', back_populates='user') - md_purchase = relationship('MdPurchase', back_populates='user') - md_session = relationship('MdSession', back_populates='user') - md_user_task = relationship('MdUserTask', back_populates='user') - md_user_vocabulary = relationship('MdUserVocabulary', back_populates='user') - md_home_chat = relationship('MdHomeChat', back_populates='user') - md_calendar_suggestion = relationship('MdCalendarSuggestion', back_populates='user') - md_produced_text = relationship('MdProducedText', back_populates='user') + user_id: Mapped[str] = mapped_column(String(255), primary_key=True) + email: Mapped[str] = mapped_column(String(255)) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + todo_email_reception: Mapped[bool] = mapped_column(Boolean, server_default=text('true')) + name: Mapped[Optional[str]] = mapped_column(String(255)) + terms_and_conditions_accepted: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + language_code: Mapped[Optional[str]] = mapped_column(String(5)) + summary: Mapped[Optional[str]] = mapped_column(Text) + password: Mapped[Optional[str]] = mapped_column(String(255)) + google_id: Mapped[Optional[str]] = mapped_column(String(255)) + microsoft_id: Mapped[Optional[str]] = mapped_column(String(255)) + apple_id: Mapped[Optional[str]] = mapped_column(String(255)) + company_fk: Mapped[Optional[int]] = mapped_column(Integer) + last_summary_update_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + company_description: Mapped[Optional[str]] = mapped_column(Text) + last_company_description_update_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + goal: Mapped[Optional[str]] = mapped_column(Text) + timezone_offset: Mapped[Optional[int]] = mapped_column(Integer) + onboarding_presented: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + product_category_fk: Mapped[Optional[int]] = mapped_column(Integer) + + md_company: Mapped['MdCompany'] = relationship('MdCompany', back_populates='md_user') + md_product_category: Mapped['MdProductCategory'] = relationship('MdProductCategory', back_populates='md_user') + md_device: Mapped[List['MdDevice']] = relationship('MdDevice', back_populates='user') + md_document: Mapped[List['MdDocument']] = relationship('MdDocument', back_populates='author_user') + md_event: Mapped[List['MdEvent']] = relationship('MdEvent', back_populates='user') + md_purchase: Mapped[List['MdPurchase']] = relationship('MdPurchase', back_populates='user') + md_session: Mapped[List['MdSession']] = relationship('MdSession', back_populates='user') + md_user_task: Mapped[List['MdUserTask']] = relationship('MdUserTask', back_populates='user') + md_user_vocabulary: Mapped[List['MdUserVocabulary']] = relationship('MdUserVocabulary', back_populates='user') + md_home_chat: Mapped[List['MdHomeChat']] = relationship('MdHomeChat', back_populates='user') + md_calendar_suggestion: Mapped[List['MdCalendarSuggestion']] = relationship('MdCalendarSuggestion', back_populates='user') + md_produced_text: Mapped[List['MdProducedText']] = relationship('MdProducedText', back_populates='user') class MdDevice(Base): @@ -232,13 +236,13 @@ class MdDevice(Base): PrimaryKeyConstraint('device_pk', name='device_pkey') ) - device_pk = Column(Integer, Sequence('md_device_seq'), primary_key=True) - creation_date = Column(DateTime(True), nullable=False, server_default=text('now()')) - fcm_token = Column(Text, nullable=False) - user_id = Column(String(255), nullable=False) - valid = Column(Boolean, nullable=False, server_default=text('true')) + device_pk: Mapped[int] = mapped_column(Integer, Sequence('md_device_seq'), primary_key=True) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True), server_default=text('now()')) + fcm_token: Mapped[str] = mapped_column(Text) + user_id: Mapped[str] = mapped_column(String(255)) + valid: Mapped[bool] = mapped_column(Boolean, server_default=text('true')) - user = relationship('MdUser', back_populates='md_device') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_device') class MdDocument(Base): @@ -248,16 +252,16 @@ class MdDocument(Base): PrimaryKeyConstraint('document_pk', name='md_document_pkey') ) - document_pk = Column(Integer, Sequence('md_document_seq'), primary_key=True) - name = Column(String(255), nullable=False) - author_user_id = Column(String(255), nullable=False) - creation_date = Column(DateTime, nullable=False) - document_type = Column(Enum('learned_by_mojo', 'webpage', name='document_type_'), nullable=False) - deleted_by_user = Column(Boolean, nullable=False, server_default=text('false')) - last_update_date = Column(DateTime(True)) + document_pk: Mapped[int] = mapped_column(Integer, Sequence('md_document_seq'), primary_key=True) + name: Mapped[str] = mapped_column(String(255)) + author_user_id: Mapped[str] = mapped_column(String(255)) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime) + document_type: Mapped[str] = mapped_column(Enum('learned_by_mojo', 'webpage', name='document_type_')) + deleted_by_user: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + last_update_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - author_user = relationship('MdUser', back_populates='md_document') - md_document_chunk = relationship('MdDocumentChunk', back_populates='md_document') + author_user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_document') + md_document_chunk: Mapped[List['MdDocumentChunk']] = relationship('MdDocumentChunk', back_populates='md_document') class MdEvent(Base): @@ -267,13 +271,13 @@ class MdEvent(Base): PrimaryKeyConstraint('event_pk', name='event_pkey') ) - event_pk = Column(Integer, Sequence('md_event_seq'), primary_key=True) - creation_date = Column(DateTime(True), nullable=False, server_default=text('now()')) - event_type = Column(String(255), nullable=False) - user_id = Column(String(255), nullable=False) - message = Column(JSON, nullable=False) + event_pk: Mapped[int] = mapped_column(Integer, Sequence('md_event_seq'), primary_key=True) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True), server_default=text('now()')) + event_type: Mapped[str] = mapped_column(String(255)) + user_id: Mapped[str] = mapped_column(String(255)) + message: Mapped[dict] = mapped_column(JSON) - user = relationship('MdUser', back_populates='md_event') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_event') class MdProductDisplayedData(Base): @@ -283,12 +287,12 @@ class MdProductDisplayedData(Base): PrimaryKeyConstraint('product_displayed_data_pk', name='md_product_displayed_data_pkey') ) - product_displayed_data_pk = Column(Integer, Sequence('md_product_displayed_data_seq'), primary_key=True) - product_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - name = Column(String(255), nullable=False) + product_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_product_displayed_data_seq'), primary_key=True) + product_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + name: Mapped[str] = mapped_column(String(255)) - md_product = relationship('MdProduct', back_populates='md_product_displayed_data') + md_product: Mapped['MdProduct'] = relationship('MdProduct', back_populates='md_product_displayed_data') class MdProductTask(Base): @@ -299,12 +303,12 @@ class MdProductTask(Base): PrimaryKeyConstraint('product_task_pk', name='product_task_pkey') ) - product_task_pk = Column(Integer, Sequence('md_product_task_seq'), primary_key=True) - product_fk = Column(Integer, nullable=False) - task_fk = Column(Integer, nullable=False) + product_task_pk: Mapped[int] = mapped_column(Integer, Sequence('md_product_task_seq'), primary_key=True) + product_fk: Mapped[int] = mapped_column(Integer) + task_fk: Mapped[int] = mapped_column(Integer) - md_product = relationship('MdProduct', back_populates='md_product_task') - md_task = relationship('MdTask', back_populates='md_product_task') + md_product: Mapped['MdProduct'] = relationship('MdProduct', back_populates='md_product_task') + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_product_task') class MdPurchase(Base): @@ -315,22 +319,22 @@ class MdPurchase(Base): PrimaryKeyConstraint('purchase_pk', name='purchase_pkey') ) - purchase_pk = Column(Integer, Sequence('md_purchase_seq'), primary_key=True) - product_fk = Column(Integer, nullable=False) - creation_date = Column(DateTime(True), nullable=False) - active = Column(Boolean, nullable=False, server_default=text('false')) - user_id = Column(String(255)) - subscription_stripe_id = Column(String(255)) - session_stripe_id = Column(String(255)) - customer_stripe_id = Column(String(255)) - completed_date = Column(DateTime(True)) - apple_transaction_id = Column(String(255)) - apple_original_transaction_id = Column(String(255)) - custom_purchase_id = Column(String(255)) + purchase_pk: Mapped[int] = mapped_column(Integer, Sequence('md_purchase_seq'), primary_key=True) + product_fk: Mapped[int] = mapped_column(Integer) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + active: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + user_id: Mapped[Optional[str]] = mapped_column(String(255)) + subscription_stripe_id: Mapped[Optional[str]] = mapped_column(String(255)) + session_stripe_id: Mapped[Optional[str]] = mapped_column(String(255)) + customer_stripe_id: Mapped[Optional[str]] = mapped_column(String(255)) + completed_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + apple_transaction_id: Mapped[Optional[str]] = mapped_column(String(255)) + apple_original_transaction_id: Mapped[Optional[str]] = mapped_column(String(255)) + custom_purchase_id: Mapped[Optional[str]] = mapped_column(String(255)) - md_product = relationship('MdProduct', back_populates='md_purchase') - user = relationship('MdUser', back_populates='md_purchase') - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_purchase') + md_product: Mapped['MdProduct'] = relationship('MdProduct', back_populates='md_purchase') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_purchase') + md_user_task_execution: Mapped[List['MdUserTaskExecution']] = relationship('MdUserTaskExecution', back_populates='md_purchase') class MdSession(Base): @@ -340,22 +344,22 @@ class MdSession(Base): PrimaryKeyConstraint('session_id', name='session_pkey') ) - session_id = Column(String(255), primary_key=True) - user_id = Column(String(255), nullable=False) - creation_date = Column(DateTime(True), nullable=False) - language = Column(String(5), nullable=False, server_default=text("'en'::character varying")) - deleted_by_user = Column(Boolean, nullable=False, server_default=text('false')) - platform = Column(Enum('chrome', 'webapp', 'outlook', 'mobile', name='platform_name')) - end_date = Column(DateTime(True)) - title = Column(String(255)) - starting_mode = Column(Enum('chat', 'form', name='_session_mode')) + session_id: Mapped[str] = mapped_column(String(255), primary_key=True) + user_id: Mapped[str] = mapped_column(String(255)) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + language: Mapped[str] = mapped_column(String(5), server_default=text("'en'::character varying")) + deleted_by_user: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + platform: Mapped[Optional[str]] = mapped_column(Enum('chrome', 'webapp', 'outlook', 'mobile', name='platform_name')) + end_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + title: Mapped[Optional[str]] = mapped_column(String(255)) + starting_mode: Mapped[Optional[str]] = mapped_column(Enum('chat', 'form', name='_session_mode')) - user = relationship('MdUser', back_populates='md_session') - md_error = relationship('MdError', back_populates='session') - md_home_chat = relationship('MdHomeChat', back_populates='session') - md_message = relationship('MdMessage', back_populates='session') - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='session') - md_produced_text = relationship('MdProducedText', back_populates='session') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_session') + md_error: Mapped[List['MdError']] = relationship('MdError', back_populates='session') + md_home_chat: Mapped[List['MdHomeChat']] = relationship('MdHomeChat', back_populates='session') + md_message: Mapped[List['MdMessage']] = relationship('MdMessage', back_populates='session') + md_user_task_execution: Mapped[List['MdUserTaskExecution']] = relationship('MdUserTaskExecution', back_populates='session') + md_produced_text: Mapped[List['MdProducedText']] = relationship('MdProducedText', back_populates='session') class MdTaskDisplayedData(Base): @@ -365,14 +369,14 @@ class MdTaskDisplayedData(Base): PrimaryKeyConstraint('task_displayed_data_pk', name='md_task_displayed_data_pkey') ) - task_displayed_data_pk = Column(Integer, Sequence('md_task_displayed_data_seq'), primary_key=True) - task_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - name_for_user = Column(String(255), nullable=False) - definition_for_user = Column(Text, nullable=False) - json_input = Column(JSON, nullable=False) + task_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_task_displayed_data_seq'), primary_key=True) + task_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + name_for_user: Mapped[str] = mapped_column(String(255)) + definition_for_user: Mapped[str] = mapped_column(Text) + json_input: Mapped[dict] = mapped_column(JSON) - md_task = relationship('MdTask', back_populates='md_task_displayed_data') + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_task_displayed_data') class MdTaskPlatformAssociation(Base): @@ -383,12 +387,12 @@ class MdTaskPlatformAssociation(Base): PrimaryKeyConstraint('task_platform_association_pk', name='md_task_platform_association_pkey') ) - task_platform_association_pk = Column(Integer, Sequence('md_task_platform_association_seq'), primary_key=True) - task_fk = Column(Integer, nullable=False) - platform_fk = Column(Integer, nullable=False) + task_platform_association_pk: Mapped[int] = mapped_column(Integer, Sequence('md_task_platform_association_seq'), primary_key=True) + task_fk: Mapped[int] = mapped_column(Integer) + platform_fk: Mapped[int] = mapped_column(Integer) - md_platform = relationship('MdPlatform', back_populates='md_task_platform_association') - md_task = relationship('MdTask', back_populates='md_task_platform_association') + md_platform: Mapped['MdPlatform'] = relationship('MdPlatform', back_populates='md_task_platform_association') + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_task_platform_association') class MdTaskPredefinedActionAssociation(Base): @@ -399,13 +403,13 @@ class MdTaskPredefinedActionAssociation(Base): PrimaryKeyConstraint('task_predefined_action_association_pk', name='md_task_predefined_action_association_pkey') ) - task_predefined_action_association_pk = Column(Integer, Sequence('md_task_predefined_action_association_seq'), primary_key=True) - task_fk = Column(Integer, nullable=False) - predefined_action_fk = Column(Integer, nullable=False) + task_predefined_action_association_pk: Mapped[int] = mapped_column(Integer, Sequence('md_task_predefined_action_association_seq'), primary_key=True) + task_fk: Mapped[int] = mapped_column(Integer) + predefined_action_fk: Mapped[int] = mapped_column(Integer) - md_task = relationship('MdTask', foreign_keys=[predefined_action_fk], back_populates='md_task_predefined_action_association') - md_task_ = relationship('MdTask', foreign_keys=[task_fk], back_populates='md_task_predefined_action_association_') - md_predefined_action_displayed_data = relationship('MdPredefinedActionDisplayedData', back_populates='md_task_predefined_action_association') + md_task: Mapped['MdTask'] = relationship('MdTask', foreign_keys=[predefined_action_fk], back_populates='md_task_predefined_action_association') + md_task_: Mapped['MdTask'] = relationship('MdTask', foreign_keys=[task_fk], back_populates='md_task_predefined_action_association_') + md_predefined_action_displayed_data: Mapped[List['MdPredefinedActionDisplayedData']] = relationship('MdPredefinedActionDisplayedData', back_populates='md_task_predefined_action_association') class MdUserTask(Base): @@ -416,14 +420,14 @@ class MdUserTask(Base): PrimaryKeyConstraint('user_task_pk', name='user_task_pkey') ) - user_task_pk = Column(Integer, Sequence('md_user_task_seq'), primary_key=True) - user_id = Column(String(255), nullable=False) - task_fk = Column(Integer, nullable=False) - enabled = Column(Boolean, nullable=False, server_default=text('true')) + user_task_pk: Mapped[int] = mapped_column(Integer, Sequence('md_user_task_seq'), primary_key=True) + user_id: Mapped[str] = mapped_column(String(255)) + task_fk: Mapped[int] = mapped_column(Integer) + enabled: Mapped[bool] = mapped_column(Boolean, server_default=text('true')) - md_task = relationship('MdTask', back_populates='md_user_task') - user = relationship('MdUser', back_populates='md_user_task') - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_user_task') + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_user_task') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_user_task') + md_user_task_execution: Mapped[List['MdUserTaskExecution']] = relationship('MdUserTaskExecution', back_populates='md_user_task') class MdUserVocabulary(Base): @@ -433,12 +437,12 @@ class MdUserVocabulary(Base): PrimaryKeyConstraint('user_vocabulary_pk', name='md_user_vocabulary_pkey') ) - user_vocabulary_pk = Column(Integer, Sequence('md_user_vocabulary_pk_seq'), primary_key=True) - word = Column(String(255), nullable=False) - creation_date = Column(DateTime, nullable=False, server_default=text('now()')) - user_id = Column(String(255), nullable=False) + user_vocabulary_pk: Mapped[int] = mapped_column(Integer, Sequence('md_user_vocabulary_pk_seq'), primary_key=True) + word: Mapped[str] = mapped_column(String(255)) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime, server_default=text('now()')) + user_id: Mapped[str] = mapped_column(String(255)) - user = relationship('MdUser', back_populates='md_user_vocabulary') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_user_vocabulary') class MdWorkflowStep(Base): @@ -448,16 +452,17 @@ class MdWorkflowStep(Base): PrimaryKeyConstraint('workflow_step_pk', name='md_workflow_step_pkey') ) - workflow_step_pk = Column(Integer, Sequence('md_workflow_step_seq'), primary_key=True) - task_fk = Column(Integer, nullable=False) - name_for_system = Column(String(255), nullable=False) - rank = Column(Integer, nullable=False) - user_validation_required = Column(Boolean, nullable=False, server_default=text('true')) - review_chat_enabled = Column(Boolean, nullable=False, server_default=text('false')) + workflow_step_pk: Mapped[int] = mapped_column(Integer, Sequence('md_workflow_step_seq'), primary_key=True) + task_fk: Mapped[int] = mapped_column(Integer) + name_for_system: Mapped[str] = mapped_column(String(255)) + rank: Mapped[int] = mapped_column(Integer) + user_validation_required: Mapped[bool] = mapped_column(Boolean, server_default=text('true')) + review_chat_enabled: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + definition_for_system: Mapped[Optional[str]] = mapped_column(String) - md_task = relationship('MdTask', back_populates='md_workflow_step') - md_workflow_step_displayed_data = relationship('MdWorkflowStepDisplayedData', back_populates='md_workflow_step') - md_user_workflow_step_execution = relationship('MdUserWorkflowStepExecution', back_populates='md_workflow_step') + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_workflow_step') + md_workflow_step_displayed_data: Mapped[List['MdWorkflowStepDisplayedData']] = relationship('MdWorkflowStepDisplayedData', back_populates='md_workflow_step') + md_user_workflow_step_execution: Mapped[List['MdUserWorkflowStepExecution']] = relationship('MdUserWorkflowStepExecution', back_populates='md_workflow_step') class MdDocumentChunk(Base): @@ -467,14 +472,14 @@ class MdDocumentChunk(Base): PrimaryKeyConstraint('document_chunk_pk', name='md_document_chunk_pkey') ) - document_chunk_pk = Column(Integer, Sequence('md_document_chunk_seq'), primary_key=True) - document_fk = Column(Integer, nullable=False) - index = Column(Integer, nullable=False) - embedding = Column(Vector(1536), nullable=False) - chunk_text = Column(Text, nullable=False) - deleted = Column(DateTime(True)) + document_chunk_pk: Mapped[int] = mapped_column(Integer, Sequence('md_document_chunk_seq'), primary_key=True) + document_fk: Mapped[int] = mapped_column(Integer) + index: Mapped[int] = mapped_column(Integer) + embedding: Mapped[Any] = mapped_column(Vector(1536)) + chunk_text: Mapped[str] = mapped_column(Text) + deleted: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - md_document = relationship('MdDocument', back_populates='md_document_chunk') + md_document: Mapped['MdDocument'] = relationship('MdDocument', back_populates='md_document_chunk') class MdError(Base): @@ -484,12 +489,12 @@ class MdError(Base): PrimaryKeyConstraint('error_pk', name='error_pkey') ) - error_pk = Column(Integer, Sequence('md_error_seq'), primary_key=True) - message = Column(Text, nullable=False) - creation_date = Column(DateTime(True), nullable=False) - session_id = Column(String(255)) + error_pk: Mapped[int] = mapped_column(Integer, Sequence('md_error_seq'), primary_key=True) + message: Mapped[str] = mapped_column(Text) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + session_id: Mapped[Optional[str]] = mapped_column(String(255)) - session = relationship('MdSession', back_populates='md_error') + session: Mapped['MdSession'] = relationship('MdSession', back_populates='md_error') class MdHomeChat(Base): @@ -500,15 +505,15 @@ class MdHomeChat(Base): PrimaryKeyConstraint('home_chat_pk', name='md_home_chat_pkey') ) - home_chat_pk = Column(Integer, Sequence('home_chat_pk_seq'), primary_key=True) - session_id = Column(String(255), nullable=False) - creation_date = Column(DateTime, nullable=False, server_default=text('now()')) - user_id = Column(String(255), nullable=False) - week = Column(Date, nullable=False) - start_date = Column(DateTime) + home_chat_pk: Mapped[int] = mapped_column(Integer, Sequence('home_chat_pk_seq'), primary_key=True) + session_id: Mapped[str] = mapped_column(String(255)) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime, server_default=text('now()')) + user_id: Mapped[str] = mapped_column(String(255)) + week: Mapped[datetime.date] = mapped_column(Date) + start_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime) - session = relationship('MdSession', back_populates='md_home_chat') - user = relationship('MdUser', back_populates='md_home_chat') + session: Mapped['MdSession'] = relationship('MdSession', back_populates='md_home_chat') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_home_chat') class MdMessage(Base): @@ -518,17 +523,17 @@ class MdMessage(Base): PrimaryKeyConstraint('message_pk', name='message_pkey') ) - message_pk = Column(Integer, Sequence('md_message_seq'), primary_key=True) - session_id = Column(String(255), nullable=False) - sender = Column(Enum('mojo', 'user', 'system', name='md_sender_'), nullable=False) - message = Column(JSON, nullable=False) - creation_date = Column(DateTime(True), nullable=False) - message_date = Column(DateTime(True), nullable=False) - event_name = Column(String(255)) - read_by_user = Column(DateTime(True)) - in_error_state = Column(DateTime(True)) + message_pk: Mapped[int] = mapped_column(Integer, Sequence('md_message_seq'), primary_key=True) + session_id: Mapped[str] = mapped_column(String(255)) + sender: Mapped[str] = mapped_column(Enum('mojo', 'user', 'system', name='md_sender_')) + message: Mapped[dict] = mapped_column(JSON) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + message_date: Mapped[datetime.datetime] = mapped_column(DateTime(True)) + event_name: Mapped[Optional[str]] = mapped_column(String(255)) + read_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + in_error_state: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - session = relationship('MdSession', back_populates='md_message') + session: Mapped['MdSession'] = relationship('MdSession', back_populates='md_message') class MdPredefinedActionDisplayedData(Base): @@ -538,12 +543,12 @@ class MdPredefinedActionDisplayedData(Base): PrimaryKeyConstraint('predefined_action_displayed_data_pk', name='md_predefined_action_displayed_data_pkey') ) - predefined_action_displayed_data_pk = Column(Integer, Sequence('md_predefined_action_displayed_data_seq'), primary_key=True) - task_predefined_action_association_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - displayed_data = Column(JSON, nullable=False) + predefined_action_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_predefined_action_displayed_data_seq'), primary_key=True) + task_predefined_action_association_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + displayed_data: Mapped[dict] = mapped_column(JSON) - md_task_predefined_action_association = relationship('MdTaskPredefinedActionAssociation', back_populates='md_predefined_action_displayed_data') + md_task_predefined_action_association: Mapped['MdTaskPredefinedActionAssociation'] = relationship('MdTaskPredefinedActionAssociation', back_populates='md_predefined_action_displayed_data') class MdUserTaskExecution(Base): @@ -556,28 +561,28 @@ class MdUserTaskExecution(Base): PrimaryKeyConstraint('user_task_execution_pk', name='user_task_execution_pkey') ) - user_task_execution_pk = Column(Integer, Sequence('md_user_task_execution_seq'), primary_key=True) - user_task_fk = Column(Integer, nullable=False) - json_input_values = Column(JSON, nullable=False) - session_id = Column(String(255), nullable=False) - start_date = Column(DateTime) - end_date = Column(DateTime) - summary = Column(Text) - title = Column(String(255)) - predefined_action_from_user_task_execution_fk = Column(Integer) - todos_extracted = Column(DateTime(True)) - deleted_by_user = Column(DateTime(True)) - purchase_fk = Column(Integer) - - md_user_task_execution = relationship('MdUserTaskExecution', remote_side=[user_task_execution_pk], back_populates='md_user_task_execution_reverse') - md_user_task_execution_reverse = relationship('MdUserTaskExecution', remote_side=[predefined_action_from_user_task_execution_fk], back_populates='md_user_task_execution') - md_purchase = relationship('MdPurchase', back_populates='md_user_task_execution') - session = relationship('MdSession', back_populates='md_user_task_execution') - md_user_task = relationship('MdUserTask', back_populates='md_user_task_execution') - md_calendar_suggestion = relationship('MdCalendarSuggestion', back_populates='md_user_task_execution') - md_produced_text = relationship('MdProducedText', back_populates='md_user_task_execution') - md_todo = relationship('MdTodo', back_populates='md_user_task_execution') - md_user_workflow_step_execution = relationship('MdUserWorkflowStepExecution', back_populates='md_user_task_execution') + user_task_execution_pk: Mapped[int] = mapped_column(Integer, Sequence('md_user_task_execution_seq'), primary_key=True) + user_task_fk: Mapped[int] = mapped_column(Integer) + json_input_values: Mapped[dict] = mapped_column(JSON) + session_id: Mapped[str] = mapped_column(String(255)) + start_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime) + end_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime) + summary: Mapped[Optional[str]] = mapped_column(Text) + title: Mapped[Optional[str]] = mapped_column(String(255)) + predefined_action_from_user_task_execution_fk: Mapped[Optional[int]] = mapped_column(Integer) + todos_extracted: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + deleted_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + purchase_fk: Mapped[Optional[int]] = mapped_column(Integer) + + md_user_task_execution: Mapped['MdUserTaskExecution'] = relationship('MdUserTaskExecution', remote_side=[user_task_execution_pk], back_populates='md_user_task_execution_reverse') + md_user_task_execution_reverse: Mapped[List['MdUserTaskExecution']] = relationship('MdUserTaskExecution', remote_side=[predefined_action_from_user_task_execution_fk], back_populates='md_user_task_execution') + md_purchase: Mapped['MdPurchase'] = relationship('MdPurchase', back_populates='md_user_task_execution') + session: Mapped['MdSession'] = relationship('MdSession', back_populates='md_user_task_execution') + md_user_task: Mapped['MdUserTask'] = relationship('MdUserTask', back_populates='md_user_task_execution') + md_calendar_suggestion: Mapped[List['MdCalendarSuggestion']] = relationship('MdCalendarSuggestion', back_populates='md_user_task_execution') + md_produced_text: Mapped[List['MdProducedText']] = relationship('MdProducedText', back_populates='md_user_task_execution') + md_todo: Mapped[List['MdTodo']] = relationship('MdTodo', back_populates='md_user_task_execution') + md_user_workflow_step_execution: Mapped[List['MdUserWorkflowStepExecution']] = relationship('MdUserWorkflowStepExecution', back_populates='md_user_task_execution') class MdWorkflowStepDisplayedData(Base): @@ -587,13 +592,13 @@ class MdWorkflowStepDisplayedData(Base): PrimaryKeyConstraint('workflow_step_displayed_data_pk', name='md_workflow_step_displayed_data_pkey') ) - workflow_step_displayed_data_pk = Column(Integer, Sequence('md_workflow_step_displayed_data_seq'), primary_key=True) - workflow_step_fk = Column(Integer, nullable=False) - language_code = Column(String(2), nullable=False) - name_for_user = Column(String(255), nullable=False) - definition_for_user = Column(Text, nullable=False) + workflow_step_displayed_data_pk: Mapped[int] = mapped_column(Integer, Sequence('md_workflow_step_displayed_data_seq'), primary_key=True) + workflow_step_fk: Mapped[int] = mapped_column(Integer) + language_code: Mapped[str] = mapped_column(String(2)) + name_for_user: Mapped[str] = mapped_column(String(255)) + definition_for_user: Mapped[str] = mapped_column(Text) - md_workflow_step = relationship('MdWorkflowStep', back_populates='md_workflow_step_displayed_data') + md_workflow_step: Mapped['MdWorkflowStep'] = relationship('MdWorkflowStep', back_populates='md_workflow_step_displayed_data') class MdCalendarSuggestion(Base): @@ -605,26 +610,26 @@ class MdCalendarSuggestion(Base): PrimaryKeyConstraint('calendar_suggestion_pk', name='md_welcome_message_pkey') ) - calendar_suggestion_pk = Column(Integer, Sequence('welcome_message_pk_seq'), primary_key=True) - user_id = Column(String(255), nullable=False) - reminder = Column(Boolean, nullable=False, server_default=text('false')) - creation_date = Column(DateTime, nullable=False, server_default=text('now()')) - suggestion_text = Column(Text) - user_reaction_date = Column(DateTime) - triggered_user_task_execution_pk = Column(Integer) - proposed_task_fk = Column(Integer) - text_generated_date = Column(DateTime(True)) - waiting_message = Column(String(255)) - suggestion_title = Column(String(255)) - suggestion_emoji = Column(String(255)) - event_id = Column(String(255)) - reminder_date = Column(DateTime(True)) - waiting_message_sent = Column(DateTime(True)) - ready_message = Column(String(255)) - - md_task = relationship('MdTask', back_populates='md_calendar_suggestion') - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_calendar_suggestion') - user = relationship('MdUser', back_populates='md_calendar_suggestion') + calendar_suggestion_pk: Mapped[int] = mapped_column(Integer, Sequence('welcome_message_pk_seq'), primary_key=True) + user_id: Mapped[str] = mapped_column(String(255)) + reminder: Mapped[bool] = mapped_column(Boolean, server_default=text('false')) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime, server_default=text('now()')) + suggestion_text: Mapped[Optional[str]] = mapped_column(Text) + user_reaction_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime) + triggered_user_task_execution_pk: Mapped[Optional[int]] = mapped_column(Integer) + proposed_task_fk: Mapped[Optional[int]] = mapped_column(Integer) + text_generated_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + waiting_message: Mapped[Optional[str]] = mapped_column(String(255)) + suggestion_title: Mapped[Optional[str]] = mapped_column(String(255)) + suggestion_emoji: Mapped[Optional[str]] = mapped_column(String(255)) + event_id: Mapped[Optional[str]] = mapped_column(String(255)) + reminder_date: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + waiting_message_sent: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + ready_message: Mapped[Optional[str]] = mapped_column(String(255)) + + md_task: Mapped['MdTask'] = relationship('MdTask', back_populates='md_calendar_suggestion') + md_user_task_execution: Mapped['MdUserTaskExecution'] = relationship('MdUserTaskExecution', back_populates='md_calendar_suggestion') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_calendar_suggestion') class MdProducedText(Base): @@ -636,16 +641,16 @@ class MdProducedText(Base): PrimaryKeyConstraint('produced_text_pk', name='produced_text_pkey') ) - produced_text_pk = Column(Integer, Sequence('md_produced_text_seq'), primary_key=True) - user_id = Column(String(255), nullable=False) - user_task_execution_fk = Column(Integer) - session_id = Column(String(255)) - deleted_by_user = Column(DateTime(True)) + produced_text_pk: Mapped[int] = mapped_column(Integer, Sequence('md_produced_text_seq'), primary_key=True) + user_id: Mapped[str] = mapped_column(String(255)) + user_task_execution_fk: Mapped[Optional[int]] = mapped_column(Integer) + session_id: Mapped[Optional[str]] = mapped_column(String(255)) + deleted_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - session = relationship('MdSession', back_populates='md_produced_text') - user = relationship('MdUser', back_populates='md_produced_text') - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_produced_text') - md_produced_text_version = relationship('MdProducedTextVersion', back_populates='md_produced_text') + session: Mapped['MdSession'] = relationship('MdSession', back_populates='md_produced_text') + user: Mapped['MdUser'] = relationship('MdUser', back_populates='md_produced_text') + md_user_task_execution: Mapped['MdUserTaskExecution'] = relationship('MdUserTaskExecution', back_populates='md_produced_text') + md_produced_text_version: Mapped[List['MdProducedTextVersion']] = relationship('MdProducedTextVersion', back_populates='md_produced_text') class MdTodo(Base): @@ -655,18 +660,18 @@ class MdTodo(Base): PrimaryKeyConstraint('todo_pk', name='md_todo_pkey') ) - todo_pk = Column(Integer, Sequence('md_todo_seq'), primary_key=True) - user_task_execution_fk = Column(Integer, nullable=False) - description = Column(Text, nullable=False) - creation_date = Column(DateTime(True), nullable=False, server_default=text('now()')) - deleted_by_user = Column(DateTime(True)) - completed = Column(DateTime(True)) - deleted_by_mojo = Column(DateTime(True)) - deletion_justification = Column(Text) - read_by_user = Column(DateTime(True)) + todo_pk: Mapped[int] = mapped_column(Integer, Sequence('md_todo_seq'), primary_key=True) + user_task_execution_fk: Mapped[int] = mapped_column(Integer) + description: Mapped[str] = mapped_column(Text) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True), server_default=text('now()')) + deleted_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + completed: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + deleted_by_mojo: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + deletion_justification: Mapped[Optional[str]] = mapped_column(Text) + read_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_todo') - md_todo_scheduling = relationship('MdTodoScheduling', back_populates='md_todo') + md_user_task_execution: Mapped['MdUserTaskExecution'] = relationship('MdUserTaskExecution', back_populates='md_todo') + md_todo_scheduling: Mapped[List['MdTodoScheduling']] = relationship('MdTodoScheduling', back_populates='md_todo') class MdUserWorkflowStepExecution(Base): @@ -677,18 +682,18 @@ class MdUserWorkflowStepExecution(Base): PrimaryKeyConstraint('user_workflow_step_execution_pk', name='md_user_workflow_step_execution_pkey') ) - user_workflow_step_execution_pk = Column(Integer, Sequence('md_user_workflow_step_execution_seq'), primary_key=True) - user_task_execution_fk = Column(Integer, nullable=False) - workflow_step_fk = Column(Integer, nullable=False) - creation_date = Column(DateTime, nullable=False, server_default=text('now()')) - parameter = Column(JSON, nullable=False) - validated = Column(Boolean) - learned_instruction = Column(Text) - error_status = Column(JSON) + user_workflow_step_execution_pk: Mapped[int] = mapped_column(Integer, Sequence('md_user_workflow_step_execution_seq'), primary_key=True) + user_task_execution_fk: Mapped[int] = mapped_column(Integer) + workflow_step_fk: Mapped[int] = mapped_column(Integer) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime, server_default=text('now()')) + parameter: Mapped[dict] = mapped_column(JSON) + validated: Mapped[Optional[bool]] = mapped_column(Boolean) + learned_instruction: Mapped[Optional[str]] = mapped_column(Text) + error_status: Mapped[Optional[dict]] = mapped_column(JSON) - md_user_task_execution = relationship('MdUserTaskExecution', back_populates='md_user_workflow_step_execution') - md_workflow_step = relationship('MdWorkflowStep', back_populates='md_user_workflow_step_execution') - md_user_workflow_step_execution_result = relationship('MdUserWorkflowStepExecutionResult', back_populates='md_user_workflow_step_execution') + md_user_task_execution: Mapped['MdUserTaskExecution'] = relationship('MdUserTaskExecution', back_populates='md_user_workflow_step_execution') + md_workflow_step: Mapped['MdWorkflowStep'] = relationship('MdWorkflowStep', back_populates='md_user_workflow_step_execution') + md_user_workflow_step_execution_result: Mapped[List['MdUserWorkflowStepExecutionResult']] = relationship('MdUserWorkflowStepExecutionResult', back_populates='md_user_workflow_step_execution') class MdProducedTextVersion(Base): @@ -699,17 +704,17 @@ class MdProducedTextVersion(Base): PrimaryKeyConstraint('produced_text_version_pk', name='produced_text_version_pkey') ) - produced_text_version_pk = Column(Integer, Sequence('md_produced_text_version_seq'), primary_key=True) - creation_date = Column(DateTime, nullable=False) - production = Column(Text, nullable=False) - produced_text_fk = Column(Integer, nullable=False) - title = Column(Text) - text_type_fk = Column(Integer) - read_by_user = Column(DateTime(True)) - embedding = Column(Vector(1536)) + produced_text_version_pk: Mapped[int] = mapped_column(Integer, Sequence('md_produced_text_version_seq'), primary_key=True) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime) + production: Mapped[str] = mapped_column(Text) + produced_text_fk: Mapped[int] = mapped_column(Integer) + title: Mapped[Optional[str]] = mapped_column(Text) + text_type_fk: Mapped[Optional[int]] = mapped_column(Integer) + read_by_user: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(True)) + embedding: Mapped[Optional[Any]] = mapped_column(Vector(1536)) - md_produced_text = relationship('MdProducedText', back_populates='md_produced_text_version') - md_text_type = relationship('MdTextType', back_populates='md_produced_text_version') + md_produced_text: Mapped['MdProducedText'] = relationship('MdProducedText', back_populates='md_produced_text_version') + md_text_type: Mapped['MdTextType'] = relationship('MdTextType', back_populates='md_produced_text_version') class MdTodoScheduling(Base): @@ -719,13 +724,13 @@ class MdTodoScheduling(Base): PrimaryKeyConstraint('todo_scheduling_pk', name='md_todo_scheduling_pkey') ) - todo_scheduling_pk = Column(Integer, Sequence('md_todo_seq'), primary_key=True) - todo_fk = Column(Integer, nullable=False) - scheduled_date = Column(Date, nullable=False) - creation_date = Column(DateTime(True), nullable=False, server_default=text('now()')) - reschedule_justification = Column(Text) + todo_scheduling_pk: Mapped[int] = mapped_column(Integer, Sequence('md_todo_seq'), primary_key=True) + todo_fk: Mapped[int] = mapped_column(Integer) + scheduled_date: Mapped[datetime.date] = mapped_column(Date) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime(True), server_default=text('now()')) + reschedule_justification: Mapped[Optional[str]] = mapped_column(Text) - md_todo = relationship('MdTodo', back_populates='md_todo_scheduling') + md_todo: Mapped['MdTodo'] = relationship('MdTodo', back_populates='md_todo_scheduling') class MdUserWorkflowStepExecutionResult(Base): @@ -735,10 +740,10 @@ class MdUserWorkflowStepExecutionResult(Base): PrimaryKeyConstraint('user_workflow_step_execution_result_pk', name='user_workflow_step_execution_result_pkey') ) - user_workflow_step_execution_result_pk = Column(Integer, Sequence('md_user_workflow_step_execution_result_seq'), primary_key=True) - user_workflow_step_execution_fk = Column(Integer, nullable=False) - creation_date = Column(DateTime, nullable=False, server_default=text('now()')) - result = Column(JSON, nullable=False) - author = Column(Enum('assistant', 'user', name='_step_result_author'), nullable=False, server_default=text("'assistant'::_step_result_author")) + user_workflow_step_execution_result_pk: Mapped[int] = mapped_column(Integer, Sequence('md_user_workflow_step_execution_result_seq'), primary_key=True) + user_workflow_step_execution_fk: Mapped[int] = mapped_column(Integer) + creation_date: Mapped[datetime.datetime] = mapped_column(DateTime, server_default=text('now()')) + result: Mapped[dict] = mapped_column(JSON) + author: Mapped[str] = mapped_column(Enum('assistant', 'user', name='_step_result_author'), server_default=text("'assistant'::_step_result_author")) - md_user_workflow_step_execution = relationship('MdUserWorkflowStepExecution', back_populates='md_user_workflow_step_execution_result') + md_user_workflow_step_execution: Mapped['MdUserWorkflowStepExecution'] = relationship('MdUserWorkflowStepExecution', back_populates='md_user_workflow_step_execution_result') diff --git a/mojodex_core/entities/instruct_task.py b/mojodex_core/entities/instruct_task.py index 9b786303..d02fed63 100644 --- a/mojodex_core/entities/instruct_task.py +++ b/mojodex_core/entities/instruct_task.py @@ -1,4 +1,4 @@ -from mojodex_core.entities.abstract_entities.task import Task +from mojodex_core.entities.task import Task class InstructTask(Task): diff --git a/mojodex_core/entities/instruct_user_task.py b/mojodex_core/entities/instruct_user_task.py index 84c06659..98ed63b7 100644 --- a/mojodex_core/entities/instruct_user_task.py +++ b/mojodex_core/entities/instruct_user_task.py @@ -1,4 +1,4 @@ -from mojodex_core.entities.abstract_entities.user_task import UserTask +from mojodex_core.entities.user_task import UserTask from mojodex_core.entities.instruct_task import InstructTask from sqlalchemy.orm import object_session diff --git a/mojodex_core/entities/instruct_user_task_execution.py b/mojodex_core/entities/instruct_user_task_execution.py index 93637492..d66cf7a2 100644 --- a/mojodex_core/entities/instruct_user_task_execution.py +++ b/mojodex_core/entities/instruct_user_task_execution.py @@ -1,6 +1,6 @@ from jinja2 import Template from sqlalchemy.orm import object_session -from mojodex_core.entities.abstract_entities.user_task_execution import UserTaskExecution +from mojodex_core.entities.user_task_execution import UserTaskExecution from mojodex_core.entities.instruct_user_task import InstructUserTask from mojodex_core.produced_text_managers.task_produced_text_manager import TaskProducedTextManager diff --git a/mojodex_core/entities/abstract_entities/task.py b/mojodex_core/entities/task.py similarity index 60% rename from mojodex_core/entities/abstract_entities/task.py rename to mojodex_core/entities/task.py index 619f64a8..cbb25bc4 100644 --- a/mojodex_core/entities/abstract_entities/task.py +++ b/mojodex_core/entities/task.py @@ -1,17 +1,12 @@ -from abc import ABC - -from mojodex_core.entities.abstract_entities.abstract_entity import AbstractEntity from mojodex_core.entities.db_base_entities import MdTask, MdTaskDisplayedData from sqlalchemy.orm import object_session from sqlalchemy import func, or_ -class Task(MdTask, ABC, metaclass=AbstractEntity): - """Task entity class is an abstract class. - It should be instanciated as an InstructTask or Workflow. - - This is true for default constructor usage but also when retrieving data from the database: `db.session.query(InstructTask).all()`""" +class Task(MdTask): + """Task entity class represent an entity containing common informations of an InstructTask or Workflow. + """ - def _get_displayed_data_in_language(self, language_code): + def _get_displayed_data(self, language_code): try: session = object_session(self) return session.query(MdTaskDisplayedData).filter(MdTaskDisplayedData.task_fk == self.task_pk) \ @@ -25,16 +20,16 @@ def _get_displayed_data_in_language(self, language_code): func.nullif(MdTaskDisplayedData.language_code, 'en').asc() ).first() except Exception as e: - raise Exception(f"{self.__class__.__name__} :: _get_displayed_data_in_language :: {e}") + raise Exception(f"_get_displayed_data :: {e}") def get_name_in_language(self, language_code): try: - return self._get_displayed_data_in_language(language_code).name_for_user + return self._get_displayed_data(language_code).name_for_user except Exception as e: raise Exception(f"{self.__class__.__name__} :: get_name_in_language :: {e}") def get_json_input_in_language(self, language_code): try: - return self._get_displayed_data_in_language(language_code).json_input + return self._get_displayed_data(language_code).json_input except Exception as e: raise Exception(f"{self.__class__.__name__} :: get_json_input_in_language :: {e}") \ No newline at end of file diff --git a/mojodex_core/entities/abstract_entities/user_task.py b/mojodex_core/entities/user_task.py similarity index 53% rename from mojodex_core/entities/abstract_entities/user_task.py rename to mojodex_core/entities/user_task.py index f762b3a6..76a38795 100644 --- a/mojodex_core/entities/abstract_entities/user_task.py +++ b/mojodex_core/entities/user_task.py @@ -1,16 +1,11 @@ -from mojodex_core.entities.abstract_entities.abstract_entity import AbstractEntity from mojodex_core.entities.db_base_entities import MdUserTask from sqlalchemy.orm import object_session from mojodex_core.entities.user import User -from mojodex_core.entities.abstract_entities.task import Task -from abc import ABC, abstractmethod +from mojodex_core.entities.task import Task -class UserTask(MdUserTask, ABC, metaclass=AbstractEntity): - """UserTask entity class is an abstract class. - It should be instanciated as an InstructUserTask or UserWorkflow. - - This is true for default constructor usage but also when retrieving data from the database: `db.session.query(InstructUserTask).all()`""" +class UserTask(MdUserTask): + """UserTask contains all the common informations of InstructUserTask or UserWorkflow.""" @property def user(self): @@ -21,24 +16,13 @@ def user(self): raise Exception(f"{self.__class__.__name__} :: user :: {e}") @property - @abstractmethod def task(self): - """ - task property is abstract and should be implemented in the child class to retrieve either an InstructTask or Workflow entity. - Implementation will look like: - - ``` try: session = object_session(self) return session.query(Task).filter(Task.task_pk == self.task_fk).first() except Exception as e: raise Exception(f"{self.__class__.__name__} :: task :: {e}") - ``` - - replacing `Task` by `InstructTask` or `Workflow` depending on the child class. - """ - raise NotImplementedError - + @property def json_input_in_user_language(self): try: diff --git a/mojodex_core/entities/abstract_entities/user_task_execution.py b/mojodex_core/entities/user_task_execution.py similarity index 75% rename from mojodex_core/entities/abstract_entities/user_task_execution.py rename to mojodex_core/entities/user_task_execution.py index a0a1ee6b..64fc7ca0 100644 --- a/mojodex_core/entities/abstract_entities/user_task_execution.py +++ b/mojodex_core/entities/user_task_execution.py @@ -1,15 +1,12 @@ -from abc import ABC, abstractmethod -from mojodex_core.entities.abstract_entities.abstract_entity import AbstractEntity +from mojodex_core.entities.user_task import UserTask from mojodex_core.entities.db_base_entities import MdUserTaskExecution, MdProducedText from sqlalchemy.orm import object_session from mojodex_core.entities.session import Session -class UserTaskExecution(MdUserTaskExecution, ABC, metaclass=AbstractEntity): - """UserTaskExecution entity class is an abstract class. - It should be instanciated as an InstructUserTaskExecution or UserWorkflowExecution. - - This is true for default constructor usage but also when retrieving data from the database: `db.session.query(InstructUserTaskExecution).all()`""" +class UserTaskExecution(MdUserTaskExecution): + """UserTaskExecution entity class that contains all the common properties and methods of an InstructUserTaskExecution or UserWorkflowExecution. + """ @property @@ -51,24 +48,14 @@ def task_name_in_user_language(self): raise Exception(f"{self.__class__.__name__} :: get_task_name_in_user_language :: {e}") @property - @abstractmethod def user_task(self): + """ contains the common informations of a UserTask, either from an Instruct or Workflow. """ - task property is abstract and should be implemented in the child class to retrieve either an InstructTask or Workflow entity. - Implementation will look like: - - ``` try: session = object_session(self) return session.query(UserTask).filter(UserTask.user_task_pk == self.user_task_fk).first() except Exception as e: raise Exception(f"{self.__class__.__name__} :: user_task :: {e}") - ``` - - replacing `Task` by `InstructTask` or `Workflow` depending on the child class. - """ - raise NotImplementedError - @property def user(self): diff --git a/mojodex_core/entities/user_workflow.py b/mojodex_core/entities/user_workflow.py index 87a4a589..5a5c2718 100644 --- a/mojodex_core/entities/user_workflow.py +++ b/mojodex_core/entities/user_workflow.py @@ -1,4 +1,4 @@ -from mojodex_core.entities.abstract_entities.user_task import UserTask +from mojodex_core.entities.user_task import UserTask from sqlalchemy.orm import object_session from mojodex_core.entities.workflow import Workflow diff --git a/mojodex_core/entities/user_workflow_execution.py b/mojodex_core/entities/user_workflow_execution.py index aaba9f1e..b3e5d420 100644 --- a/mojodex_core/entities/user_workflow_execution.py +++ b/mojodex_core/entities/user_workflow_execution.py @@ -1,9 +1,10 @@ from mojodex_core.entities.db_base_entities import MdWorkflowStep -from mojodex_core.entities.abstract_entities.user_task_execution import UserTaskExecution +from mojodex_core.entities.user_task_execution import UserTaskExecution from mojodex_core.entities.user_workflow import UserWorkflow from mojodex_core.entities.user_workflow_step_execution import UserWorkflowStepExecution from sqlalchemy.orm import object_session -from sqlalchemy import case, and_ +from sqlalchemy import case +from sqlalchemy.sql import and_ class UserWorkflowExecution(UserTaskExecution): @@ -35,10 +36,9 @@ def past_valid_step_executions(self): .filter( case( # When `MdWorkflowStep.user_validation_required` is `True`, we check that `MdUserWorkflowStepExecution.validated` is also `True` - [ - ( - MdWorkflowStep.user_validation_required == True, UserWorkflowStepExecution.validated == True), - ], + + (MdWorkflowStep.user_validation_required == True, UserWorkflowStepExecution.validated == True), + # if `user_validation_required` is `False`, we don't care about the `validated` status, and the `MdUserWorkflowStepExecution` will be included in the results regardless of its `validated` value. else_=True ) diff --git a/mojodex_core/entities/user_workflow_step_execution.py b/mojodex_core/entities/user_workflow_step_execution.py index 4cecd03c..83951f7d 100644 --- a/mojodex_core/entities/user_workflow_step_execution.py +++ b/mojodex_core/entities/user_workflow_step_execution.py @@ -6,6 +6,7 @@ import pytz from sqlalchemy.orm import object_session +from mojodex_core.entities.workflow_step import WorkflowStep from mojodex_core.steps_library import steps_class @@ -16,7 +17,7 @@ def workflow_step(self): try: session = object_session(self) md_step = session.query(MdWorkflowStep).get(self.workflow_step_fk) - step_class = steps_class[md_step.name_for_system] + step_class = steps_class[md_step.name_for_system] if md_step.name_for_system in steps_class else WorkflowStep return session.query(step_class).get(self.workflow_step_fk) except Exception as e: raise Exception(f"{self.__class__.__name__} :: workflow_step :: {e}") diff --git a/mojodex_core/entities/workflow.py b/mojodex_core/entities/workflow.py index 5206a7c7..c0e86cec 100644 --- a/mojodex_core/entities/workflow.py +++ b/mojodex_core/entities/workflow.py @@ -1,10 +1,11 @@ from mojodex_core.entities.db_base_entities import MdWorkflowStepDisplayedData, MdWorkflowStep -from mojodex_core.entities.abstract_entities.task import Task +from mojodex_core.entities.task import Task from sqlalchemy.orm import object_session from sqlalchemy.sql.functions import coalesce +from mojodex_core.entities.workflow_step import WorkflowStep from mojodex_core.steps_library import steps_class @@ -20,7 +21,7 @@ def steps(self): .filter(MdWorkflowStep.task_fk == self.task_pk) \ .order_by(MdWorkflowStep.rank.asc()).all() for md_step in md_steps: - step_class = steps_class[md_step.name_for_system] + step_class = steps_class[md_step.name_for_system] if md_step.name_for_system in steps_class else WorkflowStep step = session.query(step_class).get(md_step.workflow_step_pk) steps.append(step) return steps @@ -67,7 +68,7 @@ def _get_db_steps_with_translation(self, language_code): steps = [] for db_step, name_for_user, definition_for_user in md_steps: step_name_for_system = db_step.name_for_system - step_class = steps_class[step_name_for_system] + step_class = steps_class[step_name_for_system] if step_name_for_system in steps_class else WorkflowStep step = session.query(step_class).get(db_step.workflow_step_pk) steps.append((step, name_for_user, definition_for_user)) diff --git a/mojodex_core/entities/abstract_entities/workflow_step.py b/mojodex_core/entities/workflow_step.py similarity index 82% rename from mojodex_core/entities/abstract_entities/workflow_step.py rename to mojodex_core/entities/workflow_step.py index 90df8472..8d878beb 100644 --- a/mojodex_core/entities/abstract_entities/workflow_step.py +++ b/mojodex_core/entities/workflow_step.py @@ -1,24 +1,14 @@ -from abc import ABC, abstractmethod from typing import List - -from mojodex_core.entities.abstract_entities.abstract_entity import AbstractEntity from mojodex_core.entities.db_base_entities import MdWorkflowStep, MdWorkflowStepDisplayedData from sqlalchemy.orm import object_session from sqlalchemy import func, or_ -class WorkflowStep(MdWorkflowStep, ABC, metaclass=AbstractEntity): - """WorkflowStep entity class is an abstract class. - It should be instanciated as a class listed in `mojodex_core/steps_library.py`. - - This is true for default constructor usage but also when retrieving data from the database: `db.session.query(...)...`""" +class WorkflowStep(MdWorkflowStep): + """WorkflowStep contains additional properties and methods for a WorkflowStep entity.""" types_reserved_key = 'types' reserved_output_keys: List[str] = [types_reserved_key] - @property - @abstractmethod - def definition_for_system(self) -> str: - raise NotImplementedError def _get_displayed_data(self, language_code): try: @@ -34,7 +24,7 @@ def _get_displayed_data(self, language_code): func.nullif(MdWorkflowStepDisplayedData.language_code, 'en').asc()) \ .first() except Exception as e: - raise Exception(f"_get_displayed_data_in_language :: {e}") + raise Exception(f"_get_displayed_data :: {e}") def get_name_in_language(self, language_code): try: @@ -51,7 +41,11 @@ def get_definition_in_language(self, language_code): def _execute(self, parameter: dict, learned_instructions: dict, initial_parameters: dict, past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, task_name_for_system: str, session_id: str): - pass + """ The child of the workflow step must implement this method. + If not, it will raise a NotImplementedError. + This can happen for "deprecated" steps that are not used anymore. + """ + raise NotImplementedError def execute(self, parameter: dict, learned_instructions: dict, initial_parameter: dict, past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, diff --git a/mojodex_core/requirements.txt b/mojodex_core/requirements.txt index 75c5d564..35c3d064 100644 --- a/mojodex_core/requirements.txt +++ b/mojodex_core/requirements.txt @@ -1,7 +1,7 @@ # Database & entities requirements pgvector==0.2.4 -sqlalchemy==1.4.31 +sqlalchemy==2.0.31 psycopg2-binary==2.9.9 # LLM requirements diff --git a/mojodex_core/workflows/write_poem/divide_in_stanza.py b/mojodex_core/workflows/write_poem/divide_in_stanza.py index 1715143f..41aec230 100644 --- a/mojodex_core/workflows/write_poem/divide_in_stanza.py +++ b/mojodex_core/workflows/write_poem/divide_in_stanza.py @@ -1,8 +1,7 @@ -import json from typing import List -from mojodex_core.entities.abstract_entities.workflow_step import WorkflowStep +from mojodex_core.entities.workflow_step import WorkflowStep from mojodex_core.llm_engine.mpt import MPT diff --git a/mojodex_core/workflows/write_poem/write_stanza.py b/mojodex_core/workflows/write_poem/write_stanza.py index 955f22c7..873aa36b 100644 --- a/mojodex_core/workflows/write_poem/write_stanza.py +++ b/mojodex_core/workflows/write_poem/write_stanza.py @@ -1,6 +1,6 @@ from typing import List -from mojodex_core.entities.abstract_entities.workflow_step import WorkflowStep +from mojodex_core.entities.workflow_step import WorkflowStep from mojodex_core.llm_engine.mpt import MPT From 98dca7a80c6719d5ebb1d0afc8f5a47ab813326e Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 27 Jun 2024 13:59:43 +0200 Subject: [PATCH 4/8] add definition for system at creation --- backend/app/routes/task.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/app/routes/task.py b/backend/app/routes/task.py index 7362d17d..9741ce9d 100644 --- a/backend/app/routes/task.py +++ b/backend/app/routes/task.py @@ -248,13 +248,17 @@ def put(self): return {"error": "Step must be a dict"}, 400 if "name_for_system" not in step: return {"error": "Step must contain 'name_for_system'"}, 400 + if "definition_for_system" not in step: + return {"error": "Step must contain 'definition_for_system'"}, 400 step_name_for_system = step["name_for_system"] + step_definition_for_system = step["definition_for_system"] # ensure key exists in steps_class if step_name_for_system not in steps_class: return {"error": f"Step {step_name_for_system} not found in steps library"}, 400 db_step = MdWorkflowStep( name_for_system=step_name_for_system, + definition_for_system=step_definition_for_system, task_fk=task.task_pk, rank=step_index + 1, review_chat_enabled=step.get("review_chat_enabled", False) From 54ec2804619ba7e1621e2085c5c8c9d93b91e8a5 Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 27 Jun 2024 14:02:45 +0200 Subject: [PATCH 5/8] add definition for system in db --- mojodex_core/workflows/write_poem/divide_in_stanza.py | 5 ----- mojodex_core/workflows/write_poem/write_stanza.py | 4 ---- pgsql/create-mojodex-db.sql | 3 ++- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/mojodex_core/workflows/write_poem/divide_in_stanza.py b/mojodex_core/workflows/write_poem/divide_in_stanza.py index 41aec230..e98dfd2f 100644 --- a/mojodex_core/workflows/write_poem/divide_in_stanza.py +++ b/mojodex_core/workflows/write_poem/divide_in_stanza.py @@ -9,11 +9,6 @@ class StanzaDividerStep(WorkflowStep): logger_prefix = "StanzaDividerStep :: " determine_poem_stanzas_filename = "mojodex_core/workflows/write_poem/determine_poem_stanza.mpt" - - - @property - def definition_for_system(self): - return "Determine topic of each stanza of a poem." def _execute(self, parameter: dict, learned_instructions: dict, initial_parameter: dict, past_validated_steps_results: List[dict], user_id: str, user_task_execution_pk: int, task_name_for_system: str, session_id:str): try: diff --git a/mojodex_core/workflows/write_poem/write_stanza.py b/mojodex_core/workflows/write_poem/write_stanza.py index 873aa36b..3c1ec201 100644 --- a/mojodex_core/workflows/write_poem/write_stanza.py +++ b/mojodex_core/workflows/write_poem/write_stanza.py @@ -8,10 +8,6 @@ class StanzaWriterStep(WorkflowStep): write_poem_stanza_filename = "mojodex_core/workflows/write_poem/write_poem_stanza.mpt" - @property - def definition_for_system(self): - return "Write stanza of a poem" - def _execute(self, parameter: dict, learned_instructions: dict, initial_parameter: dict, past_validated_steps_results: List[dict], user_id: str,user_task_execution_pk: int, task_name_for_system: str, session_id: str): try: # input keys: stanza_topic diff --git a/pgsql/create-mojodex-db.sql b/pgsql/create-mojodex-db.sql index 1270e450..a847196e 100644 --- a/pgsql/create-mojodex-db.sql +++ b/pgsql/create-mojodex-db.sql @@ -1084,7 +1084,8 @@ CREATE TABLE public.md_workflow_step ( name_for_system character varying(255) NOT NULL, rank integer NOT NULL, user_validation_required boolean DEFAULT true NOT NULL, - review_chat_enabled boolean DEFAULT false NOT NULL + review_chat_enabled boolean DEFAULT false NOT NULL, + definition_for_system character varying(255) ); From 378ed4f84dcc77f5cfc723c1e627b186d97adeac Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 27 Jun 2024 14:07:56 +0200 Subject: [PATCH 6/8] no need to specify task types to generate executions title --- .../task_execution_title_summary_generator.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/mojodex_core/task_execution_title_summary_generator.py b/mojodex_core/task_execution_title_summary_generator.py index e6dfab43..ed561ab4 100644 --- a/mojodex_core/task_execution_title_summary_generator.py +++ b/mojodex_core/task_execution_title_summary_generator.py @@ -1,7 +1,5 @@ -from mojodex_core.entities.abstract_entities.user_task_execution import UserTaskExecution +from mojodex_core.entities.user_task_execution import UserTaskExecution from mojodex_core.knowledge_manager import KnowledgeManager -from mojodex_core.entities.db_base_entities import MdUserTaskExecution -from mojodex_core.entities.db_base_entities import MdTask, MdUserTask from mojodex_core.llm_engine.mpt import MPT from mojodex_core.db import with_db_session @@ -12,18 +10,7 @@ class TaskExecutionTitleSummaryGenerator: @with_db_session def generate_title_and_summary(user_task_execution_pk, db_session): try: - type = db_session.query(MdTask.type)\ - .join(MdUserTask, MdTask.task_pk == MdUserTask.task_fk)\ - .join(MdUserTaskExecution, MdUserTaskExecution.user_task_fk == MdUserTask.user_task_pk)\ - .filter(MdUserTaskExecution.user_task_execution_pk == user_task_execution_pk)\ - .first()[0] - user_task_execution: UserTaskExecution = None - if type == "workflow": - from mojodex_core.entities.user_workflow_execution import UserWorkflowExecution - user_task_execution = db_session.query(UserWorkflowExecution).get(user_task_execution_pk) - else: - from mojodex_core.entities.instruct_user_task_execution import InstructTaskExecution - user_task_execution = db_session.query(InstructTaskExecution).get(user_task_execution_pk) + user_task_execution = db_session.query(UserTaskExecution).get(user_task_execution_pk) task_execution_summary = MPT("mojodex_core/instructions/task_execution_summary.mpt", mojo_knowledge=KnowledgeManager().mojodex_knowledge, global_context=user_task_execution.user.datetime_context, From f3087899ea4c473bc082f776b93a25a747c6b996 Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 27 Jun 2024 14:56:28 +0200 Subject: [PATCH 7/8] call import datetime as last import in files --- backend/app/models/assistant/home_chat_assistant.py | 4 ++-- backend/app/models/assistant/session_controller.py | 3 +-- backend/app/models/documents/document_manager.py | 2 -- backend/app/models/purchase_manager.py | 8 +------- backend/app/models/session_creator.py | 2 +- backend/app/models/tasks/workflows/workflow_manager.py | 1 - backend/app/models/text_edit_action_manager.py | 3 +-- backend/app/routes/associate_free_product.py | 4 ++-- backend/app/routes/calendar_suggestion.py | 8 +++----- backend/app/routes/calendar_suggestion_notification.py | 4 ++-- backend/app/routes/check_expired_purchases.py | 4 ++-- backend/app/routes/company.py | 4 ++-- backend/app/routes/daily_emails.py | 5 ++--- backend/app/routes/daily_notifications.py | 4 ++-- backend/app/routes/document.py | 3 ++- backend/app/routes/document_chunk.py | 4 ++-- backend/app/routes/event.py | 4 ++-- backend/app/routes/extract_todos.py | 4 ++-- backend/app/routes/free_users_engagement.py | 6 +++--- backend/app/routes/home_chat.py | 4 +++- backend/app/routes/inapp_apple_purchase.py | 4 ++-- backend/app/routes/manual_purchase.py | 3 +-- backend/app/routes/message.py | 3 +-- backend/app/routes/mojo_message.py | 4 ++-- backend/app/routes/password.py | 9 ++++----- backend/app/routes/produced_text.py | 3 +-- backend/app/routes/purchase.py | 4 ++-- .../routes/relaunch_locked_workflow_step_executions.py | 4 ++-- backend/app/routes/resource.py | 4 ++-- backend/app/routes/retrieve_produced_text.py | 1 - backend/app/routes/task_json.py | 2 +- backend/app/routes/text_edit_action.py | 4 ++-- backend/app/routes/todo_daily_emails.py | 4 ++-- backend/app/routes/todo_scheduling.py | 5 ++--- backend/app/routes/todos.py | 6 +++--- backend/app/routes/user.py | 9 ++++----- backend/app/routes/user_message.py | 4 +--- backend/app/routes/user_task_execution.py | 6 +++--- backend/app/routes/user_task_execution_run.py | 4 ++-- backend/app/routes/user_workflow_step_execution.py | 3 --- backend/app/time_manager.py | 4 ++-- backend/app/user_task_execution_purchase_updater.py | 4 ++-- mojodex_core/costs_manager/costs_manager.py | 4 ++-- mojodex_core/costs_manager/news_api_costs_manager.py | 6 +++--- mojodex_core/costs_manager/serp_api_costs_manager.py | 6 +++--- mojodex_core/costs_manager/tokens_costs_manager.py | 6 +++--- mojodex_core/costs_manager/whisper_costs_manager.py | 6 +++--- mojodex_core/entities/user.py | 6 +++--- mojodex_core/logging_handler.py | 4 ++-- .../produced_text_managers/produced_text_manager.py | 3 +-- 50 files changed, 96 insertions(+), 120 deletions(-) diff --git a/backend/app/models/assistant/home_chat_assistant.py b/backend/app/models/assistant/home_chat_assistant.py index 4615c36f..315cad5f 100644 --- a/backend/app/models/assistant/home_chat_assistant.py +++ b/backend/app/models/assistant/home_chat_assistant.py @@ -1,4 +1,4 @@ -from datetime import datetime + from mojodex_core.knowledge_manager import KnowledgeManager from mojodex_core.tag_manager import TagManager @@ -14,7 +14,7 @@ from mojodex_core.entities.instruct_user_task import InstructUserTask from mojodex_core.llm_engine.mpt import MPT from mojodex_core.task_execution_title_summary_generator import TaskExecutionTitleSummaryGenerator - +from datetime import datetime class HomeChatAssistant(ChatAssistant): mpt_file = "instructions/home_chat_run.mpt" diff --git a/backend/app/models/assistant/session_controller.py b/backend/app/models/assistant/session_controller.py index 42449b77..c9765789 100644 --- a/backend/app/models/assistant/session_controller.py +++ b/backend/app/models/assistant/session_controller.py @@ -11,7 +11,6 @@ from mojodex_core.entities.user_workflow_execution import UserWorkflowExecution from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import MdProducedTextVersion, MdUserTask, MdTask, MdUserTaskExecution -from datetime import datetime from models.voice_generator import VoiceGenerator from packaging import version from functools import wraps @@ -19,7 +18,7 @@ from mojodex_core.db import MojodexCoreDB from mojodex_core.db import Session as DbSession from mojodex_core.task_execution_title_summary_generator import TaskExecutionTitleSummaryGenerator - +from datetime import datetime class SessionController: diff --git a/backend/app/models/documents/document_manager.py b/backend/app/models/documents/document_manager.py index 8dd0b389..062f1e1f 100644 --- a/backend/app/models/documents/document_manager.py +++ b/backend/app/models/documents/document_manager.py @@ -1,4 +1,3 @@ -import os from mojodex_core.entities.db_base_entities import * from app import db @@ -7,7 +6,6 @@ from mojodex_backend_logger import MojodexBackendLogger from mojodex_core.llm_engine.providers.model_loader import ModelLoader -from mojodex_core.llm_engine.providers.openai_embedding import OpenAIEmbedding class DocumentManager: diff --git a/backend/app/models/purchase_manager.py b/backend/app/models/purchase_manager.py index 93b0fa15..8027f26e 100644 --- a/backend/app/models/purchase_manager.py +++ b/backend/app/models/purchase_manager.py @@ -1,19 +1,13 @@ import os -from datetime import datetime, timedelta - -import pytz import stripe from mojodex_backend_logger import MojodexBackendLogger - from app import db from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * - from mojodex_core.mail import send_admin_email from sqlalchemy import and_, func, or_, text from sqlalchemy.sql.functions import coalesce -from packaging import version - +from datetime import timedelta class PurchaseManager: logger_prefix = "Purchase Manager:: " diff --git a/backend/app/models/session_creator.py b/backend/app/models/session_creator.py index 355480a5..78643487 100644 --- a/backend/app/models/session_creator.py +++ b/backend/app/models/session_creator.py @@ -1,10 +1,10 @@ from mojodex_core.db import with_db_session from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import MdUser, MdSession -from datetime import datetime import hashlib import random import string +from datetime import datetime class SessionCreator: @staticmethod diff --git a/backend/app/models/tasks/workflows/workflow_manager.py b/backend/app/models/tasks/workflows/workflow_manager.py index 6f93b812..4f9bd094 100644 --- a/backend/app/models/tasks/workflows/workflow_manager.py +++ b/backend/app/models/tasks/workflows/workflow_manager.py @@ -1,4 +1,3 @@ -from models.assistant.chat_assistant import ChatAssistant from mojodex_core.tag_manager import TagManager from app import server_socket, placeholder_generator from models.workflows.workflow_process_controller import WorkflowProcessController diff --git a/backend/app/models/text_edit_action_manager.py b/backend/app/models/text_edit_action_manager.py index 752dcde5..42ae91eb 100644 --- a/backend/app/models/text_edit_action_manager.py +++ b/backend/app/models/text_edit_action_manager.py @@ -1,5 +1,4 @@ import os -from datetime import datetime from models.assistant.execution_manager import ExecutionManager from mojodex_core.db import with_db_session from mojodex_core.entities.db_base_entities import MdProducedTextVersion, MdMessage @@ -9,7 +8,7 @@ from mojodex_core.llm_engine.providers.model_loader import ModelLoader from mojodex_core.produced_text_managers.produced_text_manager import ProducedTextManager from mojodex_core.produced_text_managers.task_produced_text_manager import TaskProducedTextManager - +from datetime import datetime class TextEditActionManager: logger_prefix = "TextEditActionManager" diff --git a/backend/app/routes/associate_free_product.py b/backend/app/routes/associate_free_product.py index 19c0781c..9217ae9a 100644 --- a/backend/app/routes/associate_free_product.py +++ b/backend/app/routes/associate_free_product.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + from bs4 import BeautifulSoup from jinja2 import Template @@ -14,7 +14,7 @@ from sqlalchemy import or_ from mojodex_core.mail import mojo_mail_client - +from datetime import datetime class FreeProductAssociation(Resource): welcome_email_dir = "mojodex_core/mails_templates/welcome" diff --git a/backend/app/routes/calendar_suggestion.py b/backend/app/routes/calendar_suggestion.py index 3e67f703..2c1ffba0 100644 --- a/backend/app/routes/calendar_suggestion.py +++ b/backend/app/routes/calendar_suggestion.py @@ -1,4 +1,3 @@ -import os import time from flask import request from flask_restful import Resource @@ -7,7 +6,7 @@ from mojodex_core.entities.user import User from mojodex_core.logging_handler import log_error -from datetime import datetime, timedelta + from jinja2 import Template from mojodex_core.entities.db_base_entities import * @@ -17,7 +16,7 @@ from mojodex_core.json_loader import json_decode_retry from mojodex_core.logging_handler import on_json_error from packaging import version - +from datetime import datetime, timedelta, timezone class CalendarSuggestion(Resource): @@ -37,8 +36,7 @@ def __get_global_context(self, timezoneOffsetMinutes): # TODO: with @kelly check how to mpt-ize this with open("mojodex_core/prompts/knowledge/global_context.txt", 'r') as f: template = Template(f.read()) - timestamp = datetime.utcnow( - ) - timedelta(minutes=timezoneOffsetMinutes if timezoneOffsetMinutes else 0) + timestamp = datetime.now(timezone.utc) - timedelta(minutes=timezoneOffsetMinutes if timezoneOffsetMinutes else 0) return template.render(weekday=timestamp.strftime("%A"), datetime=timestamp.strftime("%d %B %Y"), time=timestamp.strftime("%H:%M")) diff --git a/backend/app/routes/calendar_suggestion_notification.py b/backend/app/routes/calendar_suggestion_notification.py index 0ea70c44..98b9aec8 100644 --- a/backend/app/routes/calendar_suggestion_notification.py +++ b/backend/app/routes/calendar_suggestion_notification.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + import requests from flask import request @@ -7,7 +7,7 @@ from app import db from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * - +from datetime import datetime class CalendarSuggestionNotifications(Resource): diff --git a/backend/app/routes/check_expired_purchases.py b/backend/app/routes/check_expired_purchases.py index 6230637d..5f7edc54 100644 --- a/backend/app/routes/check_expired_purchases.py +++ b/backend/app/routes/check_expired_purchases.py @@ -8,12 +8,12 @@ from mojodex_core.entities.db_base_entities import * from models.purchase_manager import PurchaseManager -from datetime import datetime + from sqlalchemy import func, text from mojodex_core.mail import send_admin_email - +from datetime import datetime class ExpiredPurchasesChecker(Resource): diff --git a/backend/app/routes/company.py b/backend/app/routes/company.py index cfb97d4a..4017d022 100644 --- a/backend/app/routes/company.py +++ b/backend/app/routes/company.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + import requests from flask import request @@ -13,7 +13,7 @@ from mojodex_core.logging_handler import on_json_error from mojodex_core.llm_engine.mpt import MPT - +from datetime import datetime class Company(Resource): correct_company_info_mpt_filename = "instructions/correct_company_infos.mpt" diff --git a/backend/app/routes/daily_emails.py b/backend/app/routes/daily_emails.py index 6fc9fdef..33ee9678 100644 --- a/backend/app/routes/daily_emails.py +++ b/backend/app/routes/daily_emails.py @@ -1,6 +1,5 @@ -import json import os -from datetime import datetime, timedelta + import requests from flask import request @@ -12,7 +11,7 @@ from sqlalchemy.sql.functions import coalesce from mojodex_core.mail import send_admin_email, admin_email_receivers - +from datetime import datetime, timedelta class DailyEmails(Resource): reminder_email_type="reminder_email" diff --git a/backend/app/routes/daily_notifications.py b/backend/app/routes/daily_notifications.py index dd679356..2f37b4ff 100644 --- a/backend/app/routes/daily_notifications.py +++ b/backend/app/routes/daily_notifications.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + import requests from flask import request from flask_restful import Resource @@ -7,7 +7,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from sqlalchemy import func, text, extract - +from datetime import datetime class DailyNotifications(Resource): diff --git a/backend/app/routes/document.py b/backend/app/routes/document.py index 4080884a..1c2110eb 100644 --- a/backend/app/routes/document.py +++ b/backend/app/routes/document.py @@ -1,10 +1,11 @@ import os -from datetime import datetime + from flask import request from flask_restful import Resource from app import db from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * +from datetime import datetime class Document(Resource): def put(self): diff --git a/backend/app/routes/document_chunk.py b/backend/app/routes/document_chunk.py index 4494734d..abf0d9ec 100644 --- a/backend/app/routes/document_chunk.py +++ b/backend/app/routes/document_chunk.py @@ -1,12 +1,12 @@ import os -from datetime import datetime + from flask import request from flask_restful import Resource from app import db, document_manager from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * - +from datetime import datetime class DocumentChunk(Resource): diff --git a/backend/app/routes/event.py b/backend/app/routes/event.py index 8b9e9b16..04b91a20 100644 --- a/backend/app/routes/event.py +++ b/backend/app/routes/event.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + from flask import request from flask_restful import Resource @@ -8,7 +8,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from mojodex_core.mail import mojo_mail_client - +from datetime import datetime diff --git a/backend/app/routes/extract_todos.py b/backend/app/routes/extract_todos.py index 90cdb103..566fa892 100644 --- a/backend/app/routes/extract_todos.py +++ b/backend/app/routes/extract_todos.py @@ -1,5 +1,5 @@ import os -from datetime import datetime, timedelta + from operator import and_ import requests @@ -9,7 +9,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from sqlalchemy import func, desc - +from datetime import datetime, timedelta class ExtractTodos(Resource): diff --git a/backend/app/routes/free_users_engagement.py b/backend/app/routes/free_users_engagement.py index 10c36624..45175e18 100644 --- a/backend/app/routes/free_users_engagement.py +++ b/backend/app/routes/free_users_engagement.py @@ -1,6 +1,6 @@ import os -from datetime import datetime, timedelta + from flask import request from flask_restful import Resource @@ -14,7 +14,7 @@ from mojodex_core.mail import send_admin_email from models.purchase_manager import PurchaseManager - +from datetime import datetime, timedelta, timezone class FreeUsersEngagementChecker(Resource): logger_prefix = "FreeUsersEngagementChecker::" @@ -66,7 +66,7 @@ def post(self): # Calculate the date before 2 working days (we don't count today) # if today = monday, we check if user has done nothing thursday, friday and today - today = datetime.utcnow().date() - timedelta(days=3) + today =datetime.now(timezone.utc).date() - timedelta(days=3) start_date_cutoff = self.calculate_previous_working_day(today) # Query for users with active free and limited products and MdUser.creation_date before the start_date_cutoff diff --git a/backend/app/routes/home_chat.py b/backend/app/routes/home_chat.py index 08483310..b04fd29c 100644 --- a/backend/app/routes/home_chat.py +++ b/backend/app/routes/home_chat.py @@ -10,7 +10,7 @@ from mojodex_core.entities.message import Message from mojodex_core.llm_engine.mpt import MPT from mojodex_core.logging_handler import log_error -from datetime import datetime, timedelta + from mojodex_core.entities.db_base_entities import MdHomeChat, MdMessage, MdUserTaskExecution, MdUserTask, MdTask from packaging import version @@ -20,6 +20,8 @@ from mojodex_core.entities.session import Session from mojodex_core.entities.user import User +from datetime import datetime, timedelta + class HomeChat(Resource): welcome_message_mpt_filename = "instructions/welcome_message.mpt" message_header_start_tag, message_header_end_tag = "", "" diff --git a/backend/app/routes/inapp_apple_purchase.py b/backend/app/routes/inapp_apple_purchase.py index d4cbd6a9..0dcf4c40 100644 --- a/backend/app/routes/inapp_apple_purchase.py +++ b/backend/app/routes/inapp_apple_purchase.py @@ -5,7 +5,7 @@ from appstoreserverlibrary.api_client import AppStoreServerAPIClient from flask import request from flask_restful import Resource -from datetime import datetime + from app import authenticate, db from mojodex_core.entities.db_base_entities import * from models.purchase_manager import PurchaseManager @@ -14,7 +14,7 @@ from mojodex_core.mail import send_admin_email from mojodex_core.logging_handler import log_error - +from datetime import datetime class InAppApplePurchase(Resource): logger_prefix = "InAppApplePurchase Resource:: " diff --git a/backend/app/routes/manual_purchase.py b/backend/app/routes/manual_purchase.py index f8acbac4..f5b68552 100644 --- a/backend/app/routes/manual_purchase.py +++ b/backend/app/routes/manual_purchase.py @@ -4,9 +4,8 @@ from flask_restful import Resource from app import db from mojodex_core.entities.db_base_entities import * -from datetime import datetime from models.purchase_manager import PurchaseManager - +from datetime import datetime class ManualPurchase(Resource): active_status = "active" diff --git a/backend/app/routes/message.py b/backend/app/routes/message.py index 98406ffb..f612e1ee 100644 --- a/backend/app/routes/message.py +++ b/backend/app/routes/message.py @@ -1,6 +1,5 @@ import glob import os -from datetime import datetime from flask import request from flask_restful import Resource from app import db, authenticate @@ -9,7 +8,7 @@ from sqlalchemy import or_ from mojodex_core.entities.message import Message as MessageEntity - +from datetime import datetime class Message(Resource): def __init__(self): diff --git a/backend/app/routes/mojo_message.py b/backend/app/routes/mojo_message.py index 997824f8..5fe9f032 100644 --- a/backend/app/routes/mojo_message.py +++ b/backend/app/routes/mojo_message.py @@ -1,4 +1,4 @@ -from datetime import datetime + import os from flask import request @@ -8,7 +8,7 @@ from mojodex_core.entities.db_base_entities import * from models.voice_generator import VoiceGenerator - +from datetime import datetime class MojoMessage(Resource): logger_prefix = "MojoMessage" diff --git a/backend/app/routes/password.py b/backend/app/routes/password.py index 1bb4e773..51e30698 100644 --- a/backend/app/routes/password.py +++ b/backend/app/routes/password.py @@ -5,20 +5,19 @@ from mojodex_core.entities.db_base_entities import * from jinja2 import Template from werkzeug.security import generate_password_hash -from datetime import datetime, timedelta import random import string import os from bs4 import BeautifulSoup from routes.user import User - +from datetime import datetime, timedelta, timezone def generate_reset_password_token(user_id): payload = { - 'iat': datetime.utcnow(), - "exp": datetime.utcnow() + timedelta(minutes=10), + 'iat': datetime.now(timezone.utc), + "exp": datetime.now(timezone.utc) + timedelta(minutes=10), 'sub': user_id + os.environ['RESET_PASSWORD_SECRET_KEY'] + ''.join( - random.choices(string.ascii_uppercase + string.digits, k=10)) + datetime.utcnow().isoformat() + random.choices(string.ascii_uppercase + string.digits, k=10)) + datetime.now(timezone.utc).isoformat() } return jwt.encode(payload, os.environ["RESET_PASSWORD_JWT_SECRET"], algorithm=os.environ["ENCODING_ALGORITHM"]) diff --git a/backend/app/routes/produced_text.py b/backend/app/routes/produced_text.py index b18119f7..fe6f515b 100644 --- a/backend/app/routes/produced_text.py +++ b/backend/app/routes/produced_text.py @@ -1,5 +1,4 @@ import os -from datetime import datetime from sqlalchemy import func from flask import request from flask_restful import Resource @@ -7,7 +6,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from mojodex_core.produced_text_managers.produced_text_manager import ProducedTextManager - +from datetime import datetime class ProducedText(Resource): diff --git a/backend/app/routes/purchase.py b/backend/app/routes/purchase.py index 3c909d29..cffa987c 100644 --- a/backend/app/routes/purchase.py +++ b/backend/app/routes/purchase.py @@ -4,7 +4,7 @@ import stripe from flask import request from flask_restful import Resource -from datetime import datetime + from app import authenticate, db from mojodex_core.entities.db_base_entities import * from mojodex_core.mail import send_admin_email @@ -14,7 +14,7 @@ from models.purchase_manager import PurchaseManager from packaging import version - +from datetime import datetime class Purchase(Resource): logger_prefix = "Purchase Resource:: " diff --git a/backend/app/routes/relaunch_locked_workflow_step_executions.py b/backend/app/routes/relaunch_locked_workflow_step_executions.py index 71ea3958..14624beb 100644 --- a/backend/app/routes/relaunch_locked_workflow_step_executions.py +++ b/backend/app/routes/relaunch_locked_workflow_step_executions.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta + import os from sqlalchemy.orm.attributes import flag_modified import pytz @@ -9,7 +9,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import MdUserTaskExecution, MdUserWorkflowStepExecution, MdUserWorkflowStepExecutionResult from app import db, server_socket - +from datetime import datetime, timedelta class RelaunchLockedWorkflowStepExecutions(Resource): def post(self): diff --git a/backend/app/routes/resource.py b/backend/app/routes/resource.py index 841b2761..db43e28f 100644 --- a/backend/app/routes/resource.py +++ b/backend/app/routes/resource.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + import requests from flask import request @@ -10,7 +10,7 @@ from models.documents.website_parser import WebsiteParser from typing import List, Dict, Any - +from datetime import datetime class MojoResource(Resource): diff --git a/backend/app/routes/retrieve_produced_text.py b/backend/app/routes/retrieve_produced_text.py index 8361948e..c6ce4614 100644 --- a/backend/app/routes/retrieve_produced_text.py +++ b/backend/app/routes/retrieve_produced_text.py @@ -1,5 +1,4 @@ import os -from datetime import datetime from flask import request from flask_restful import Resource diff --git a/backend/app/routes/task_json.py b/backend/app/routes/task_json.py index d991ca38..80cd3711 100644 --- a/backend/app/routes/task_json.py +++ b/backend/app/routes/task_json.py @@ -1,5 +1,4 @@ import os -from datetime import datetime from flask import request from flask_restful import Resource @@ -10,6 +9,7 @@ from mojodex_core.llm_engine.mpt import MPT from mojodex_core.json_loader import json_decode_retry from mojodex_core.logging_handler import on_json_error +from datetime import datetime class TaskJson(Resource): diff --git a/backend/app/routes/text_edit_action.py b/backend/app/routes/text_edit_action.py index 53a6e3cd..a91b924c 100644 --- a/backend/app/routes/text_edit_action.py +++ b/backend/app/routes/text_edit_action.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + from jinja2 import Template from flask import request from flask_restful import Resource @@ -12,7 +12,7 @@ from models.text_edit_action_manager import TextEditActionManager from sqlalchemy.sql.functions import coalesce from packaging import version - +from datetime import datetime class TextEditAction (Resource): base_prompt_files_path = "mojodex_core/prompts/text_edit_actions" diff --git a/backend/app/routes/todo_daily_emails.py b/backend/app/routes/todo_daily_emails.py index 10f05a10..087552d3 100644 --- a/backend/app/routes/todo_daily_emails.py +++ b/backend/app/routes/todo_daily_emails.py @@ -1,6 +1,6 @@ import os -from datetime import datetime + import requests from flask import request @@ -11,7 +11,7 @@ from sqlalchemy import func, text, extract, and_ from mojodex_backend_logger import MojodexBackendLogger - +from datetime import datetime class TodoDailyEmails(Resource): diff --git a/backend/app/routes/todo_scheduling.py b/backend/app/routes/todo_scheduling.py index 8e6bb562..f60ea537 100644 --- a/backend/app/routes/todo_scheduling.py +++ b/backend/app/routes/todo_scheduling.py @@ -1,5 +1,4 @@ import os -from datetime import datetime, timedelta import requests from flask import request from flask_restful import Resource @@ -7,7 +6,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from sqlalchemy import func, text, extract - +from datetime import datetime, timedelta, timezone class TodosScheduling(Resource): @@ -102,7 +101,7 @@ def post(self): results = [] while len(results) == 50 or offset == 0: - yesterday = datetime.utcnow() - timedelta(days=1) + yesterday = datetime.now(timezone.utc) - timedelta(days=1) latest_todo_scheduling = db.session.query(MdTodoScheduling.todo_fk, func.max(MdTodoScheduling.scheduled_date).label('scheduled_date')) \ .group_by(MdTodoScheduling.todo_fk) \ diff --git a/backend/app/routes/todos.py b/backend/app/routes/todos.py index 9cda5755..353ca1ee 100644 --- a/backend/app/routes/todos.py +++ b/backend/app/routes/todos.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + from flask import request from flask_restful import Resource @@ -7,7 +7,7 @@ from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from sqlalchemy import func, text - +from datetime import datetime, timezone class Todos(Resource): MAX_TODOS = 50 @@ -212,7 +212,7 @@ def get(self, user_id): .group_by(MdTodoScheduling.todo_fk)\ .subquery() # Get the current date in UTC - now_utc = datetime.utcnow().date() + now_utc = datetime.now(timezone.utc).date() if "user_task_execution_fk" in request.args: user_task_execution_pk = request.args["user_task_execution_fk"] # ensure user_task_execution_pk exists for this user diff --git a/backend/app/routes/user.py b/backend/app/routes/user.py index d3c6874a..269ad7b4 100644 --- a/backend/app/routes/user.py +++ b/backend/app/routes/user.py @@ -12,7 +12,6 @@ from mojodex_core.entities.db_base_entities import * import hashlib import string -from datetime import datetime, timedelta import jwt from werkzeug.security import generate_password_hash, check_password_hash from bs4 import BeautifulSoup @@ -20,7 +19,7 @@ from mojodex_core.mail import send_admin_email from packaging import version - +from datetime import datetime, timedelta, timezone def generate_user_id(name): random_string = ''.join(random.choices(string.ascii_uppercase + string.digits, k=10)) clear_string = f"{random_string}_mojodex_{name}_{datetime.now().isoformat()}" @@ -30,10 +29,10 @@ def generate_user_id(name): def generate_token(user_id): payload = { - 'iat': datetime.utcnow(), - "exp": datetime.utcnow() + timedelta(days=180), + 'iat': datetime.now(timezone.utc), + "exp": datetime.now(timezone.utc) + timedelta(days=180), 'sub': user_id + os.environ['TOKEN_SECRET_SPLITTER'] + ''.join( - random.choices(string.ascii_uppercase + string.digits, k=10)) + datetime.utcnow().isoformat() + random.choices(string.ascii_uppercase + string.digits, k=10)) + datetime.now(timezone.utc).isoformat() } return jwt.encode(payload, os.environ["JWT_SECRET"], algorithm=os.environ["ENCODING_ALGORITHM"]) diff --git a/backend/app/routes/user_message.py b/backend/app/routes/user_message.py index 3dc6cdbe..a09c5444 100644 --- a/backend/app/routes/user_message.py +++ b/backend/app/routes/user_message.py @@ -1,16 +1,14 @@ import os -from datetime import datetime from flask import request from flask_restful import Resource from app import db, authenticate, server_socket, time_manager, main_logger - from mojodex_core.entities.message import Message from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * from models.assistant.session_controller import SessionController from mojodex_core.user_storage_manager.user_audio_file_manager import UserAudioFileManager from packaging import version - +from datetime import datetime class UserMessage(Resource): general_backend_error_message = "Oops, something weird has happened. We'll help you by email!" diff --git a/backend/app/routes/user_task_execution.py b/backend/app/routes/user_task_execution.py index fddadb89..ca39f0c5 100644 --- a/backend/app/routes/user_task_execution.py +++ b/backend/app/routes/user_task_execution.py @@ -5,13 +5,13 @@ from mojodex_core.entities.user_workflow_execution import UserWorkflowExecution from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * -from datetime import datetime + from models.session_creator import SessionCreator from sqlalchemy import func, and_, or_, text from sqlalchemy.sql.functions import coalesce from models.purchase_manager import PurchaseManager - +from datetime import datetime, timezone class UserTaskExecution(Resource): @@ -367,7 +367,7 @@ def get_n_todos(user_task_execution_pk): ) def get_n_todos_not_read(user_task_execution_pk): - now_utc = datetime.utcnow().date() + now_utc = datetime.now(timezone.utc).date() # Subquery to get the latest todo_scheduling for each todo latest_todo_scheduling = db.session.query( MdTodoScheduling.todo_fk, diff --git a/backend/app/routes/user_task_execution_run.py b/backend/app/routes/user_task_execution_run.py index e9bb6471..794a72c0 100644 --- a/backend/app/routes/user_task_execution_run.py +++ b/backend/app/routes/user_task_execution_run.py @@ -1,4 +1,4 @@ -from datetime import datetime + import json from models.user_task_execution_inputs_manager import UserTaskExecutionInputsManager @@ -10,7 +10,7 @@ from mojodex_core.entities.db_base_entities import MdUserTaskExecution, MdTask, MdUserTask from sqlalchemy.orm.attributes import flag_modified from packaging import version - +from datetime import datetime class UserTaskExecutionRun(Resource): logger_prefix = "UserTaskExecutionRun" image_type = "image" diff --git a/backend/app/routes/user_workflow_step_execution.py b/backend/app/routes/user_workflow_step_execution.py index 71e2c37d..b864feab 100644 --- a/backend/app/routes/user_workflow_step_execution.py +++ b/backend/app/routes/user_workflow_step_execution.py @@ -1,13 +1,10 @@ -from datetime import datetime from flask import request from flask_restful import Resource from app import db, authenticate, server_socket from models.workflows.workflow_process_controller import WorkflowProcessController -from mojodex_core.entities.user_workflow_step_execution import UserWorkflowStepExecution as UserWorkflowStepExecutionEntity from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import * -from jinja2 import Template class UserWorkflowStepExecution(Resource): diff --git a/backend/app/time_manager.py b/backend/app/time_manager.py index dc55bdec..1be48000 100644 --- a/backend/app/time_manager.py +++ b/backend/app/time_manager.py @@ -1,5 +1,5 @@ import pytz -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from tzlocal import get_localzone from dateutil.parser import parse @@ -46,7 +46,7 @@ def current_time_in_timezone(self, timezone_offset): """ try: offset = timedelta(minutes=timezone_offset) - return datetime.utcnow() - offset + return datetime.now(timezone.utc) - offset except Exception as e: raise Exception(f"Invalid timezone_offset : {e}") diff --git a/backend/app/user_task_execution_purchase_updater.py b/backend/app/user_task_execution_purchase_updater.py index 72a5f8a8..62eac972 100644 --- a/backend/app/user_task_execution_purchase_updater.py +++ b/backend/app/user_task_execution_purchase_updater.py @@ -1,11 +1,11 @@ import os -from datetime import datetime + import socketio from mojodex_core.logging_handler import log_error from mojodex_backend_logger import MojodexBackendLogger import requests - +from datetime import datetime class UserTaskExecutionPurchaseUpdater: logger_prefix = "UserTaskExecutionPurchaseUpdater:: " diff --git a/mojodex_core/costs_manager/costs_manager.py b/mojodex_core/costs_manager/costs_manager.py index 16d0a860..0033cc27 100644 --- a/mojodex_core/costs_manager/costs_manager.py +++ b/mojodex_core/costs_manager/costs_manager.py @@ -1,7 +1,7 @@ import os -from datetime import datetime -from abc import ABC +from abc import ABC +from datetime import datetime class CostsManager(ABC): logger_prefix = "CostsManager" cost_dir = "/data/costs" diff --git a/mojodex_core/costs_manager/news_api_costs_manager.py b/mojodex_core/costs_manager/news_api_costs_manager.py index 9d124b43..db4cb08c 100644 --- a/mojodex_core/costs_manager/news_api_costs_manager.py +++ b/mojodex_core/costs_manager/news_api_costs_manager.py @@ -1,7 +1,7 @@ -from datetime import datetime + from mojodex_core.costs_manager.costs_manager import CostsManager from mojodex_core.mail import send_technical_error_email - +from datetime import datetime, timezone class NewsAPICostsManager(CostsManager): logger_prefix = "NewsAPICostsManager" @@ -18,6 +18,6 @@ def __init__(self): def on_search(self, user_id, num_of_results_asked, user_task_execution_pk, task_name_for_system): try: with open(self.file_path, "a") as f: - f.write(f"{datetime.utcnow().isoformat()},{user_id},{num_of_results_asked},{user_task_execution_pk},{task_name_for_system}\n") + f.write(f"{datetime.now(timezone.utc).isoformat()},{user_id},{num_of_results_asked},{user_task_execution_pk},{task_name_for_system}\n") except Exception as e: send_technical_error_email(f"{NewsAPICostsManager.logger_prefix}: on_search: {e}") \ No newline at end of file diff --git a/mojodex_core/costs_manager/serp_api_costs_manager.py b/mojodex_core/costs_manager/serp_api_costs_manager.py index fe1f562b..7fccf936 100644 --- a/mojodex_core/costs_manager/serp_api_costs_manager.py +++ b/mojodex_core/costs_manager/serp_api_costs_manager.py @@ -1,7 +1,7 @@ -from datetime import datetime + from mojodex_core.costs_manager.costs_manager import CostsManager from mojodex_core.mail import send_technical_error_email - +from datetime import datetime, timezone class SerpAPICostsManager(CostsManager): logger_prefix = "SerpAPICostsManager" name = "serp_api" @@ -17,6 +17,6 @@ def __init__(self): def on_search(self, user_id, num_of_results_asked, user_task_execution_pk, task_name_for_system): try: with open(self.file_path, "a") as f: - f.write(f"{datetime.utcnow().isoformat()},{user_id},{num_of_results_asked},{user_task_execution_pk},{task_name_for_system}\n") + f.write(f"{datetime.now(timezone.utc).isoformat()},{user_id},{num_of_results_asked},{user_task_execution_pk},{task_name_for_system}\n") except Exception as e: send_technical_error_email(f"{SerpAPICostsManager.logger_prefix}: on_search: {e}") \ No newline at end of file diff --git a/mojodex_core/costs_manager/tokens_costs_manager.py b/mojodex_core/costs_manager/tokens_costs_manager.py index 5183a39e..5968203e 100644 --- a/mojodex_core/costs_manager/tokens_costs_manager.py +++ b/mojodex_core/costs_manager/tokens_costs_manager.py @@ -1,8 +1,8 @@ -from datetime import datetime + from mojodex_core.costs_manager.costs_manager import CostsManager from mojodex_core.logging_handler import log_error - +from datetime import datetime, timezone class TokensCostsManager(CostsManager): logger_prefix = "TokensCostsManager" @@ -21,7 +21,7 @@ def on_tokens_counted(self, user_id, n_prompts_tokens, n_conversation_tokens, n_ user_task_execution_pk, task_name_for_system): try: with open(self.file_path, "a") as f: - f.write(f"{datetime.utcnow().isoformat()},{user_id},{n_prompts_tokens},{n_conversation_tokens},{n_response_tokens},{model},{name}," + f.write(f"{datetime.now(timezone.utc).isoformat()},{user_id},{n_prompts_tokens},{n_conversation_tokens},{n_response_tokens},{model},{name}," f"{user_task_execution_pk},{task_name_for_system}\n") except Exception as e: log_error(f"{TokensCostsManager.logger_prefix}: on_tokens_counted: {e}", notify_admin=True) \ No newline at end of file diff --git a/mojodex_core/costs_manager/whisper_costs_manager.py b/mojodex_core/costs_manager/whisper_costs_manager.py index 3d09a615..9f29af58 100644 --- a/mojodex_core/costs_manager/whisper_costs_manager.py +++ b/mojodex_core/costs_manager/whisper_costs_manager.py @@ -1,7 +1,7 @@ -from datetime import datetime + from mojodex_core.costs_manager.costs_manager import CostsManager from mojodex_core.logging_handler import log_error - +from datetime import datetime, timezone class WhisperCostsManager(CostsManager): logger_prefix = "WhisperCostsManager" name = "whisper" @@ -17,6 +17,6 @@ def __init__(self): def on_seconds_counted(self, user_id, n_seconds, user_task_execution_pk, task_name_for_system, mode): try: with open(self.file_path, "a") as f: - f.write(f"{datetime.utcnow().isoformat()},{user_id},{n_seconds},{user_task_execution_pk},{task_name_for_system},{mode}\n") + f.write(f"{datetime.now(timezone.utc).isoformat()},{user_id},{n_seconds},{user_task_execution_pk},{task_name_for_system},{mode}\n") except Exception as e: log_error(f"{WhisperCostsManager.logger_prefix}: on_seconds_counted: {e}", notify_admin=True) \ No newline at end of file diff --git a/mojodex_core/entities/user.py b/mojodex_core/entities/user.py index 15923c8e..cf716eeb 100644 --- a/mojodex_core/entities/user.py +++ b/mojodex_core/entities/user.py @@ -1,11 +1,11 @@ -from datetime import datetime, timedelta + from mojodex_core.entities.db_base_entities import MdUser, MdTask, MdUserTask from sqlalchemy.orm import object_session from mojodex_core.entities.instruct_task import InstructTask from mojodex_core.llm_engine.mpt import MPT - +from datetime import datetime, timedelta, timezone class User(MdUser): @@ -24,7 +24,7 @@ def available_instruct_tasks(self): @property def local_datetime(self): try: - timestamp = datetime.utcnow() + timestamp = datetime.now(timezone.utc) if self.timezone_offset: timestamp -= timedelta(minutes=self.timezone_offset) return timestamp diff --git a/mojodex_core/logging_handler.py b/mojodex_core/logging_handler.py index 75fc6f82..917c6ce5 100644 --- a/mojodex_core/logging_handler.py +++ b/mojodex_core/logging_handler.py @@ -1,10 +1,10 @@ import logging import os -from datetime import datetime + from mojodex_core.db import with_db_session from mojodex_core.entities.db_base_entities import MdError - +from datetime import datetime class EmojiFormatter(logging.Formatter): def __init__(self): super().__init__() diff --git a/mojodex_core/produced_text_managers/produced_text_manager.py b/mojodex_core/produced_text_managers/produced_text_manager.py index 2df8946f..04544e8a 100644 --- a/mojodex_core/produced_text_managers/produced_text_manager.py +++ b/mojodex_core/produced_text_managers/produced_text_manager.py @@ -1,11 +1,10 @@ from abc import ABC, abstractmethod -from datetime import datetime from mojodex_core.db import with_db_session from mojodex_core.logging_handler import log_error from mojodex_core.entities.db_base_entities import MdProducedText, MdProducedTextVersion, MdTextType from mojodex_core.llm_engine.providers.model_loader import ModelLoader from mojodex_core.llm_engine.mpt import MPT - +from datetime import datetime class ProducedTextManager(ABC): get_text_type_mpt_filename = "mojodex_core/instructions/get_text_type.mpt" From 6f0822158cc21bcf1e744f2e739ed181f6328e7a Mon Sep 17 00:00:00 2001 From: KellyRoussel Date: Thu, 27 Jun 2024 15:03:14 +0200 Subject: [PATCH 8/8] change datetime imports in backgorund --- background/app/models/cortex/extract_todos_cortex.py | 4 ++-- background/app/models/cortex/reschedule_todo_cortex.py | 6 +++--- background/app/models/knowledge/knowledge_collector.py | 6 +++--- background/app/routes/event_generation.py | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/background/app/models/cortex/extract_todos_cortex.py b/background/app/models/cortex/extract_todos_cortex.py index ab7e8bb0..fb77aa4e 100644 --- a/background/app/models/cortex/extract_todos_cortex.py +++ b/background/app/models/cortex/extract_todos_cortex.py @@ -1,5 +1,5 @@ import os -from datetime import datetime + import requests from app import db, language_retriever, conversation_retriever @@ -12,7 +12,7 @@ from models.todos.todos_creator import TodosCreator from sqlalchemy import func - +from datetime import datetime class ExtractTodosCortex: logger_prefix = "ExtractTodosCortex" diff --git a/background/app/models/cortex/reschedule_todo_cortex.py b/background/app/models/cortex/reschedule_todo_cortex.py index 87496fa1..c1846a91 100644 --- a/background/app/models/cortex/reschedule_todo_cortex.py +++ b/background/app/models/cortex/reschedule_todo_cortex.py @@ -1,4 +1,4 @@ -from datetime import datetime + from app import db, language_retriever, conversation_retriever from mojodex_core.entities.db_base_entities import * @@ -12,7 +12,7 @@ from models.todos.todos_rescheduler import TodosRescheduler from mojodex_core.mail import send_technical_error_email - +from datetime import datetime, timezone class RescheduleTodoCortex: logger_prefix = "RescheduleTodoCortex" @@ -124,7 +124,7 @@ def __get_todolist(self, user_id): .group_by(MdTodoScheduling.todo_fk) \ .subquery() # Get the current date in UTC - now_utc = datetime.utcnow().date() + now_utc = datetime.now(timezone.utc).date() results = db.session.query(MdTodo.description, latest_todo_scheduling.c.latest_scheduled_date) \ .join(MdUserTaskExecution, MdTodo.user_task_execution_fk == MdUserTaskExecution.user_task_execution_pk) \ .join(latest_todo_scheduling, MdTodo.todo_pk == latest_todo_scheduling.c.todo_fk) \ diff --git a/background/app/models/knowledge/knowledge_collector.py b/background/app/models/knowledge/knowledge_collector.py index 30421953..2dea3e15 100644 --- a/background/app/models/knowledge/knowledge_collector.py +++ b/background/app/models/knowledge/knowledge_collector.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from mojodex_core.logging_handler import MojodexCoreLogger @@ -26,7 +26,7 @@ def get_mojo_knowledge(): def get_global_context_knowledge(timezone_offset=0): """Returns the global context knowledge for the current time :param timezone_offset: offset in minutes to remove from UTC time to get user time""" - timestamp = datetime.utcnow() + timestamp = datetime.now(timezone.utc) timestamp -= timedelta(minutes=timezone_offset) global_context = MPT("mojodex_core/instructions/global_context.mpt", weekday=timestamp.strftime("%A"), @@ -41,7 +41,7 @@ def mojodex_knowledge(self): @property def localized_context(self): try: - timestamp = datetime.utcnow() + timestamp = datetime.now(timezone.utc) if self.user_timezone_offset: timestamp -= timedelta(minutes=self.user_timezone_offset) return MPT("mojodex_core/instructions/global_context.mpt", diff --git a/background/app/routes/event_generation.py b/background/app/routes/event_generation.py index 51178447..97eb973e 100644 --- a/background/app/routes/event_generation.py +++ b/background/app/routes/event_generation.py @@ -1,7 +1,6 @@ from flask import request from flask_restful import Resource from app import db, executor -from mojodex_core.entities.db_base_entities import * from models.events.daily_notifications_generator import DailyNotificationsGenerator from models.events.daily_emails_generator import DailyEmailsGenerator