diff --git a/app/db_sql.py b/app/db_sql.py index c815ca6..7b2898b 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -1,4 +1,3 @@ -from __future__ import annotations import datetime, pytz, redis, secrets from timeit import default_timer as timer diff --git a/app/main.py b/app/main.py index d003fc4..d1c841c 100644 --- a/app/main.py +++ b/app/main.py @@ -18,7 +18,7 @@ from . import config from app.log import log, logging # Import the routers here first: -from app.routers import api_crud, api, importing, account, activity_log, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, data_store, event, event_badge, event_badge_template, event_device, event_exhibit, event_exhibit_tracking, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, site, site_domain, user, websockets, e_cvent, c_idaa, e_impexium +from app.routers import api_crud, api, importing, sql, account, activity_log, address, archive, archive_content, contact, cont_edu_cert, cont_edu_cert_person, data_store, event, event_badge, event_badge_template, event_device, event_exhibit, event_exhibit_tracking, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, hosted_file, journal, journal_entry, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, site, site_domain, user, websockets, e_cvent, c_idaa, e_impexium from app.db_sql import db @@ -73,6 +73,11 @@ app.include_router( prefix='/importing', tags=['Importing'], ) +app.include_router( + sql.router, + # prefix='/sql', + tags=['SQL'], +) # app.include_router( # flask_cfg.router, # prefix='/redis', diff --git a/app/methods/event_methods.py b/app/methods/event_methods.py index 64259aa..f988f04 100644 --- a/app/methods/event_methods.py +++ b/app/methods/event_methods.py @@ -68,7 +68,7 @@ def load_event_obj( exclude_unset: bool = True, model_as_dict: bool = False, ) -> Event_Base|bool: - log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass diff --git a/app/models/event_device_models.py b/app/models/event_device_models.py index b1ef5c0..a782444 100644 --- a/app/models/event_device_models.py +++ b/app/models/event_device_models.py @@ -77,6 +77,9 @@ class Event_Device_Base(BaseModel): check_event_location_loop_period: Optional[int] check_event_session_loop_period: Optional[int] + alert: Optional[bool] + alert_msg: Optional[str] + enable: Optional[bool] # hide: Optional[bool] diff --git a/app/models/event_location_models.py b/app/models/event_location_models.py index 5fb93cd..330c754 100644 --- a/app/models/event_location_models.py +++ b/app/models/event_location_models.py @@ -43,6 +43,9 @@ class Event_Location_Base(BaseModel): file_count: Optional[int] + alert: Optional[bool] + alert_msg: Optional[str] + enable: Optional[bool] enable_from: Optional[datetime.datetime] = None enable_to: Optional[datetime.datetime] = None diff --git a/app/models/event_session_models.py b/app/models/event_session_models.py index 57af5f2..02167ec 100644 --- a/app/models/event_session_models.py +++ b/app/models/event_session_models.py @@ -89,6 +89,9 @@ class Event_Session_Base(BaseModel): approve: Optional[bool] ready: Optional[bool] + alert: Optional[bool] + alert_msg: Optional[str] + enable: Optional[bool] enable_from: Optional[datetime.datetime] = None enable_to: Optional[datetime.datetime] = None diff --git a/app/models/sql_request_models.py b/app/models/sql_request_models.py new file mode 100644 index 0000000..43f9e34 --- /dev/null +++ b/app/models/sql_request_models.py @@ -0,0 +1,69 @@ +import datetime + +from typing import Dict, List, Optional, Set, Union +from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator + +from app.db_sql import redis_lookup_id_random +from app.lib_general import log, logging + +from app.models.common_field_schema import base_fields, default_num_bytes + +# ### BEGIN ### API SQL Request Models ### SQL_Request_Base() ### +class SQL_Request_Base(BaseModel): + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + account_id_random: Optional[str] + account_id: Optional[int] + + sql_qry: Optional[str] + sql_data: Optional[dict] + + # enable: Optional[bool] + + # hide: Optional[bool] + # priority: Optional[bool] + # sort: Optional[int] + # group: Optional[str] + + # Including convenience data + # This is only for convenience. Probably going to keep unless it causes a problem. + + # Including JSON data + # other_json: Optional[Json] + # meta_json: Optional[Json] + + # Including other related objects + + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) + + class Config: + underscore_attrs_are_private = True + allow_population_by_field_name = True + fields = base_fields +# ### END ### API SQL Request Models ### SQL_Request_Base() ### + + +# ### BEGIN ### API SQL Result Models ### SQL_Result_Base() ### +class SQL_Result_Base(BaseModel): + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + result: Optional[dict|list] + + # Including convenience data + # This is only for convenience. Probably going to keep unless it causes a problem. + + # Including JSON data + # other_json: Optional[Json] + # meta_json: Optional[Json] + + # Including other related objects + + _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) + + class Config: + underscore_attrs_are_private = True + allow_population_by_field_name = True + fields = base_fields +# ### END ### API SQL Result Models ### SQL_Result_Base() ### diff --git a/app/routers/sql.py b/app/routers/sql.py new file mode 100644 index 0000000..32dde9f --- /dev/null +++ b/app/routers/sql.py @@ -0,0 +1,45 @@ +import datetime +from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query, Response, status +from pydantic import BaseModel, EmailStr, Field +from typing import Dict, List, Optional, Set, Union + +from app.lib_general import log, logging, common_route_params, Common_Route_Params +from app.config import settings +from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, redis_lookup_id_random + +from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template + +from app.models.response_models import Resp_Body_Base, mk_resp +from app.models.sql_request_models import SQL_Request_Base, SQL_Result_Base + + +router = APIRouter() + + +# ### BEGIN ### API SQL Anything ### get_sql_result() ### +# Updated 2022-05-23 +@router.post('/sql/select', response_model=Resp_Body_Base) +async def select_result( + sql_request: SQL_Request_Base, + as_list: bool = False, + + commons: Common_Route_Params = Depends(common_route_params), + ): + log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.debug(locals()) + + sql = sql_request.sql_qry + log.debug(sql) + + data = sql_request.sql_data + log.debug(data) + + if sql_query_result := sql_select(data=data, sql=sql, as_list=as_list): + data = sql_query_result + status_code = 200 + else: + data = None + status_code = 404 + + log.debug(sql_query_result) + return mk_resp(data=data, status_code=status_code, response=commons.response)