Router Registry Cleanup: Archive unreferenced legacy routes

- Moved 29 unreferenced legacy router files to app/routers/archive/
- Restored and registered 'websockets' router in registry.py (exempted from deprecation)
- Cleaned up registry imports and verified application compilation.
This commit is contained in:
Scott Idem
2026-01-28 11:47:18 -05:00
parent cfbe6f458f
commit 3eaf176b05
30 changed files with 2 additions and 1 deletions

View File

@@ -0,0 +1,182 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
#from ..log import *
from app.config import settings
from app.db_sql import *
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.activity_log_methods import get_activity_log_rec_list, load_activity_log_obj
from app.models.activity_log_models import Activity_Log_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/activity_log', response_model=Resp_Body_Base)
async def post_activity_log_obj(
activity_log_obj: Activity_Log_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'activity_log'
activity_log_obj_data_dict = activity_log_obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type = obj_type,
data = activity_log_obj_data_dict,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
@router.patch('/activity_log/{activity_log_id}', response_model=Resp_Body_Base)
async def patch_activity_log_obj(
activity_log_obj: Activity_Log_Base,
activity_log_id: str = Path(..., min_length=1, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'activity_log'
activity_log_obj_data_dict = activity_log_obj.dict(by_alias=False, exclude_unset=True)
activity_log_obj_data_dict['id'] = redis_lookup_id_random(record_id_random=activity_log_id, table_name=obj_type)
activity_log_obj_data_dict['id_random'] = activity_log_id
result = patch_obj_template(
obj_type = obj_type,
data = activity_log_obj_data_dict,
obj_id = activity_log_id,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
@router.get('/activity_log/list', response_model=Resp_Body_Base)
async def get_activity_log_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'activity_log'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/activity_log/{obj_id}', response_model=Resp_Body_Base)
async def get_activity_log_obj(
obj_id: str = Path(min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'activity_log'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Activity Log ### get_account_obj_activity_log_list() ###
# Updated 2021-09-21
@router.get('/account/{account_id}/activity_log/list', response_model=Resp_Body_Base)
async def get_account_obj_activity_log_list(
account_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=response)
# Updated 2021-09-21
if activity_log_rec_list_result := get_activity_log_rec_list(
account_id = account_id,
enabled = enabled,
limit = limit,
):
activity_log_result_list = []
for activity_log_rec in activity_log_rec_list_result:
if load_activity_log_result := load_activity_log_obj(
activity_log_id = activity_log_rec.get('activity_log_id', None),
enabled = enabled,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
activity_log_result_list.append(load_activity_log_result)
else:
activity_log_result_list.append(None)
response_data = activity_log_result_list
elif isinstance(activity_log_rec_list_result, list) or activity_log_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Activity Log ### get_account_obj_activity_log_list() ###
@router.delete('/activity_log/{obj_id}', response_model=Resp_Body_Base)
async def delete_activity_log_obj(
obj_id: str = Path(min_length=1, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'activity_log'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,180 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
from app.config import settings
from app.db_sql import *
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.address_methods import load_address_obj, update_address_obj
from app.models.address_models import Address_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_address_obj(
address_obj: Address_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
#include: Optional[list] = [],
#exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'address'
obj_data_dict = address_obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{address_obj_id}', response_model=Resp_Body_Base)
async def patch_address_obj(
address_obj: Address_Base,
address_obj_id: str = Path(min_length=1, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
address_obj_type = 'address'
address_obj_data_dict = address_obj.dict(by_alias=False, exclude_unset=True)
address_obj_data_dict['id'] = redis_lookup_id_random(record_id_random=address_obj_id, table_name=address_obj_type)
address_obj_data_dict['id_random'] = address_obj_id
result = patch_obj_template(
obj_type=address_obj_type,
data=address_obj_data_dict,
obj_id=address_obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Address ### patch_address_json() ###
@router.patch('/{address_id}/json', response_model=Resp_Body_Base)
async def patch_address_json(
address_obj: Address_Base,
address_id: str = Path(min_length=1, max_length=22),
create_sub_obj: bool = False,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if address_id := redis_lookup_id_random(record_id_random=address_id, table_name='address'): pass
else:
return mk_resp(data=None, status_code=404)
if address_obj_up_result := update_address_obj(
address_id=address_id,
address_obj_up=address_obj,
create_sub_obj=create_sub_obj,
):
log.debug(address_obj_up_result)
if return_obj:
address_obj = load_address_obj(address_id=address_id)
address_dict = address_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=address_dict)
else:
return mk_resp(data=address_obj_up_result)
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
# ### END ### API Address ### patch_address_json() ###
@router.get('/list', response_model=Resp_Body_Base)
async def get_address_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'address'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_address_obj(
obj_id: str = Path(min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'address'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_address_obj(
obj_id: str = Path(min_length=1, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'address'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,246 @@
from fastapi import APIRouter, Depends, HTTPException, Query
import os
import platform
import json
import shutil
from typing import Dict, Any, List, Optional
from datetime import datetime
from app.lib_general_v3 import AccountContext, get_account_context
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
def is_admin(account: AccountContext):
if account.auth_method == 'bypass':
return True
if getattr(account, "administrator", False) or getattr(account, "manager", False):
return True
return False
@router.get("/status", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def get_container_status(
account: AccountContext = Depends(get_account_context)
):
"""
Returns diagnostic information about the container environment.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
# Simple check for administrative access or bypass
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
boot_time = None
try:
import psutil
boot_time = datetime.fromtimestamp(psutil.boot_time()).isoformat()
except Exception as e:
boot_time = f"Error: {str(e)}"
status_data = {
"os": platform.system(),
"release": platform.release(),
"python_version": platform.python_version(),
"hostname": platform.node(),
"cpu_count": os.cpu_count(),
"environment_vars": {k: v for k, v in os.environ.items() if not any(s in k.upper() for s in ["PASSWORD", "KEY", "SECRET", "AUTH", "TOKEN"])},
"cwd": os.getcwd(),
"container": os.path.exists('/.dockerenv'),
"boot_time": boot_time
}
return mk_resp(data=status_data)
@router.get("/system/usage", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def get_system_usage(
account: AccountContext = Depends(get_account_context)
):
"""
Returns real-time CPU, Memory, and Disk usage.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
cpu_data = {"error": "psutil not available"}
mem_data = {"error": "psutil not available"}
try:
import psutil
# CPU usage per core
cpu_percent = psutil.cpu_percent(interval=0.1, percpu=True)
cpu_data = {
"percent_avg": sum(cpu_percent) / len(cpu_percent) if cpu_percent else 0,
"percent_per_core": cpu_percent,
"count": psutil.cpu_count(),
"load_avg": os.getloadavg() if hasattr(os, 'getloadavg') else None
}
# Memory usage
mem = psutil.virtual_memory()
mem_data = {
"total": mem.total,
"available": mem.available,
"percent": mem.percent,
"used": mem.used
}
except Exception as e:
cpu_data = {"error": str(e)}
mem_data = {"error": str(e)}
# Disk usage (root) - uses shutil which is standard lib
disk_data = {}
try:
disk = shutil.disk_usage("/")
disk_data = {
"total": disk.total,
"used": disk.used,
"free": disk.free,
"percent": (disk.used / disk.total) * 100 if disk.total else 0
}
except Exception as e:
disk_data = {"error": str(e)}
usage_data = {
"cpu": cpu_data,
"memory": mem_data,
"disk": disk_data
}
return mk_resp(data=usage_data)
@router.get("/logs", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def get_latest_logs(
lines: int = 50,
log_file: str = "aether_api.log",
account: AccountContext = Depends(get_account_context)
):
"""
Returns the last N lines of a specified log file.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
# Sanitize log_file to prevent directory traversal
log_file = os.path.basename(log_file)
from app.config import settings
log_dir = os.path.dirname(settings.LOG_PATH.get('app', '/logs/aether_api.log'))
log_path = os.path.join(log_dir, log_file)
if not os.path.exists(log_path):
return mk_resp(data=False, status_message=f"Log file not found at {log_path}", status_code=404)
try:
# Using tail if available for efficiency
import subprocess
result = subprocess.run(['tail', f'-n {lines}', log_path], capture_output=True, text=True)
if result.returncode == 0:
return mk_resp(data=result.stdout)
else:
raise Exception(result.stderr)
except Exception as e:
# Fallback to python read if tail fails
try:
with open(log_path, 'r') as f:
log_lines = f.readlines()
latest = log_lines[-lines:] if len(log_lines) > lines else log_lines
return mk_resp(data="".join(latest))
except Exception as inner_e:
return mk_resp(data=False, status_message=f"Error reading logs: {str(e)} | {str(inner_e)}", status_code=500)
@router.get("/logs/list", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def list_log_files(
account: AccountContext = Depends(get_account_context)
):
"""
Lists available log files in the log directory.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
from app.config import settings
log_dir = os.path.dirname(settings.LOG_PATH.get('app', '/logs/aether_api.log'))
if not os.path.exists(log_dir):
return mk_resp(data=[], status_message=f"Log directory not found at {log_dir}")
files = []
for f in os.listdir(log_dir):
path = os.path.join(log_dir, f)
if os.path.isfile(path):
stats = os.stat(path)
files.append({
"name": f,
"size": stats.st_size,
"modified": datetime.fromtimestamp(stats.st_mtime).isoformat()
})
return mk_resp(data=files)
@router.get("/processes", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def list_processes(
limit: int = 10,
sort_by: str = Query("cpu", enum=["cpu", "memory"]),
account: AccountContext = Depends(get_account_context)
):
"""
Lists top processes by CPU or Memory usage.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
procs = []
try:
import psutil
for proc in psutil.process_iter(['pid', 'name', 'username', 'cpu_percent', 'memory_info']):
try:
pinfo = proc.info
pinfo['memory_rss'] = pinfo['memory_info'].rss if pinfo.get('memory_info') else 0
procs.append(pinfo)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
except Exception as e:
return mk_resp(data=[], status_message=f"Error listing processes: {str(e)}", status_code=500)
if sort_by == "cpu":
procs.sort(key=lambda x: x['cpu_percent'], reverse=True)
else:
procs.sort(key=lambda x: x['memory_rss'], reverse=True)
return mk_resp(data=procs[:limit])
@router.get("/container/metadata", response_model=Resp_Body_Base, tags=["Agent Bridge"])
async def get_container_metadata(
account: AccountContext = Depends(get_account_context)
):
"""
Attempts to gather Docker-specific metadata from the environment.
Only accessible to administrators/managers via existing hierarchy or bypass.
"""
if not is_admin(account):
raise HTTPException(status_code=403, detail="Administrative access required.")
metadata = {
"is_docker": os.path.exists('/.dockerenv'),
"cgroup": None,
"mounts": None
}
if os.path.exists('/proc/self/cgroup'):
try:
with open('/proc/self/cgroup', 'r') as f:
metadata['cgroup'] = f.read()
except:
pass
if os.path.exists('/proc/self/mounts'):
try:
with open('/proc/self/mounts', 'r') as f:
metadata['mounts'] = f.read()
except:
pass
return mk_resp(data=metadata)

View File

@@ -0,0 +1,175 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.archive_methods import load_archive_obj
from app.models.archive_models import Archive_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/archive', response_model=Resp_Body_Base)
async def post_archive_obj(
obj: Archive_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/archive/{obj_id}', response_model=Resp_Body_Base)
async def patch_archive_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Archive_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/archive/list', response_model=Resp_Body_Base)
async def get_archive_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Archive ### get_archive_obj() ###
# Working well as of 2021-11-01. Using as a template for other routes.
@router.get('/archive/{archive_id}', response_model=Resp_Body_Base)
async def get_archive_obj(
archive_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # enabled, disabled, all
hidden: str = 'not_hidden', # hidden, not_hidden, all
# inc_address: bool = False, # Under archive and under contact
# inc_contact: bool = False,
inc_archive_content_list: bool = False,
x_account_id: str = Header(...),
limit: int = 500, # For now this covers any included objects or object lists
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if archive_id := redis_lookup_id_random(record_id_random=archive_id, table_name='archive'): pass
else: return mk_resp(data=None, status_code=404, response=response)
if archive_obj := load_archive_obj(
archive_id = archive_id,
enabled = enabled,
hidden = hidden,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_archive_content_list = inc_archive_content_list,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=archive_obj, response=response)
# ### END ### API Archive ### get_archive_obj() ###
# @router.get('/archive/{obj_id}', response_model=Resp_Body_Base)
# async def get_archive_obj(
# obj_id: str = Path(min_length=11, max_length=22),
# x_account_id: str = Header(...),
# by_alias: Optional[bool] = True,
# exclude_unset: Optional[bool] = True,
# response: Response = Response,
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'archive'
# result = get_obj_template(
# obj_type=obj_type,
# obj_id=obj_id,
# by_alias=True,
# exclude_unset=True,
# )
# return result
@router.delete('/archive/{obj_id}', response_model=Resp_Body_Base)
async def delete_archive_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,186 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.models.archive_content_models import Archive_Content_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_archive_content_obj(
obj: Archive_Content_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive_content'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{obj_id}', response_model=Resp_Body_Base)
async def patch_archive_content_obj(
obj_id: str = Path(min_length=1, max_length=22),
obj: Archive_Content_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive_content'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/list', response_model=Resp_Body_Base)
async def get_archive_content_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive_content'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=False,
)
return result
@router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_archive_content_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'archive_content'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# @router.delete('/{obj_id}', response_model=Resp_Body_Base)
# async def delete_archive_content_obj(
# obj_id: str = Path(min_length=11, max_length=22),
# x_account_id: str = Header(...),
# response: Response = Response,
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'archive_content'
# result = delete_obj_template(
# obj_type=obj_type,
# obj_id=obj_id,
# )
# return result
# ### BEGIN ### API Archive Content ### delete_archive_content_obj() ###
# Updated 2021-11-02
@router.delete('/{archive_content_id}', response_model=Resp_Body_Base)
async def delete_archive_content_obj(
archive_content_id: str = Path(min_length=11, max_length=22),
# hosted_file_id: str = Path(min_length=11, max_length=22),
# for_type: str = Query(..., min_length=1, max_length=25),
# for_id: str = Path(min_length=11, max_length=22),
delete_hosted_file: bool = False,
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if archive_content_id := redis_lookup_id_random(record_id_random=archive_content_id, table_name='archive_content'): pass
else: return mk_resp(data=None, status_code=404, response=response)
if archive_content_select_result := sql_select(table_name='archive_content', record_id=archive_content_id):
log.info(f'Selected Archive Content ID: {archive_content_id}')
log.debug(archive_content_select_result)
archive_content_rec = archive_content_select_result
else: return mk_resp(data=False, status_code=500, response=response) # Internal Server Error
if archive_content_delete_result := sql_delete(table_name='archive_content', record_id=archive_content_id):
log.info(f'Deleted Event File ID: {archive_content_id}')
else: return mk_resp(data=False, status_code=500, response=response) # Internal Server Error
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
hosted_file_id = archive_content_rec.get('hosted_file_id')
sql = f"""
DELETE FROM hosted_file_link
WHERE hosted_file_id = :hosted_file_id
AND link_to_type = :for_type
AND link_to_id = :for_id
"""
log.debug(sql)
hosted_file_link_data = {}
hosted_file_link_data['hosted_file_id'] = hosted_file_id
hosted_file_link_data['for_type'] = 'archive_content'
hosted_file_link_data['for_id'] = archive_content_id
log.debug(hosted_file_link_data)
if archive_content_delete_result := sql_delete(sql=sql, data=hosted_file_link_data):
log.info(f'Deleted Hosted File Link. Hosted File ID: {hosted_file_id}, Link To Type: archive_content, Link To ID: {archive_content_id}')
else: return mk_resp(data=False, status_code=500, response=response) # Internal Server Error
return mk_resp(data=True, response=response)
# ### END ### API Archive Content ### delete_archive_content_obj() ###

View File

@@ -0,0 +1,261 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.cont_edu_cert_methods import get_cont_edu_cert_rec_list, load_cont_edu_cert_obj
from app.models.cont_edu_cert_models import Cont_Edu_Cert_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/cont_edu/cert', response_model=Resp_Body_Base)
async def post_cont_edu_cert_obj(
obj: Cont_Edu_Cert_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/cont_edu/cert/{obj_id}', response_model=Resp_Body_Base)
async def patch_cont_edu_cert_obj(
obj: Cont_Edu_Cert_Base,
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Cont Edu Cert ### patch_cont_edu_cert_json() ###
@router.patch('/cont_edu/cert/{cont_edu_cert_id}/json', response_model=Resp_Body_Base)
async def patch_cont_edu_cert_json(
cont_edu_cert_obj: Cont_Edu_Cert_Base,
cont_edu_cert_id: str = Path(min_length=11, max_length=22),
create_sub_obj: bool = False,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if cont_edu_cert_id := redis_lookup_id_random(record_id_random=cont_edu_cert_id, table_name='cont_edu_cert'): pass
else:
return mk_resp(data=None, status_code=404)
if cont_edu_cert_obj_up_result := update_cont_edu_cert_obj(
cont_edu_cert_id=cont_edu_cert_id,
cont_edu_cert_obj_up=cont_edu_cert_obj,
create_sub_obj=create_sub_obj,
):
log.debug(cont_edu_cert_obj_up_result)
if return_obj:
cont_edu_cert_obj = load_cont_edu_cert_obj(cont_edu_cert_id=cont_edu_cert_id)
cont_edu_cert_dict = cont_edu_cert_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=cont_edu_cert_dict)
else:
return mk_resp(data=cont_edu_cert_obj_up_result)
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
# ### END ### API Cont Edu Cert ### patch_cont_edu_cert_json() ###
@router.get('/cont_edu/cert/list', response_model=Resp_Body_Base)
async def get_cont_edu_cert_obj_li(
for_obj_type: str = Query(None, min_length=2, max_length=50),
for_obj_id: str = Query(None, min_length=1, max_length=22),
group: str = Query(None, min_length=2, max_length=50),
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert'
if for_obj_type == 'event_exhibit' and for_obj_id:
#base_name = obj_type_li[obj_type]['base_name']
base_name = Cont_Edu_Cert_Base
for_obj_id_random = for_obj_id
for_obj_id = redis_lookup_id_random(record_id_random=for_obj_id_random, table_name=for_obj_type)
data = {}
data['for_obj_type'] = for_obj_type
data['for_obj_id'] = for_obj_id
data['for_obj_id_random'] = for_obj_id_random
data['group'] = group
if group:
sql = """
SELECT *
FROM `cont_edu_cert` AS cont_edu_cert
WHERE cont_edu_cert.for_type = :for_obj_type AND cont_edu_cert.for_id = :for_obj_id
AND cont_edu_cert.group = :group
"""
else:
sql = """
SELECT *
FROM `cont_edu_cert` AS cont_edu_cert
WHERE cont_edu_cert.for_type = :for_obj_type AND cont_edu_cert.for_id = :for_obj_id
"""
if sql_result := sql_select(data=data, sql=sql, as_list=True):
resp_data_li = []
for record in sql_result:
resp_data = base_name(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset)
resp_data_li.append(resp_data)
return mk_resp(data=resp_data_li)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404, response=response)
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/cont_edu/cert/{obj_id}', response_model=Resp_Body_Base)
async def get_cont_edu_cert_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Cont Edu Cert ### get_account_obj_cont_edu_cert_list() ###
# Updated 2021-07-28
@router.get('/account/{account_id}/cont_edu/cert/list', response_model=Resp_Body_Base)
async def get_account_obj_cont_edu_cert_list(
account_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_cont_edu_cert_person_list: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404)
response_data = None
# log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-07-28
if cont_edu_cert_rec_list_result := get_cont_edu_cert_rec_list(
account_id = account_id,
limit = limit,
enabled = enabled,
):
cont_edu_cert_result_list = []
for cont_edu_cert_rec in cont_edu_cert_rec_list_result:
if load_cont_edu_cert_result := load_cont_edu_cert_obj(
cont_edu_cert_id = cont_edu_cert_rec.get('cont_edu_cert_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_cont_edu_cert_person_list = inc_cont_edu_cert_person_list,
):
cont_edu_cert_result_list.append(load_cont_edu_cert_result)
else:
cont_edu_cert_result_list.append(None)
response_data = cont_edu_cert_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API ### get_account_obj_cont_edu_cert_list() ###
@router.delete('/cont_edu/cert/{obj_id}', response_model=Resp_Body_Base)
async def delete_cont_edu_cert_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,478 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.cont_edu_cert_person_methods import get_cont_edu_cert_person_rec_list, load_cont_edu_cert_person_obj
from app.models.cont_edu_cert_person_models import Cont_Edu_Cert_Person_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/cont_edu/cert/person', response_model=Resp_Body_Base)
async def post_cont_edu_cert_person_obj(
obj: Cont_Edu_Cert_Person_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert_person'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/cont_edu/cert/person/{obj_id}', response_model=Resp_Body_Base)
async def patch_cont_edu_cert_person_obj(
obj: Cont_Edu_Cert_Person_Base,
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert_person'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Cont Edu Cert Person ### patch_cont_edu_cert_person_json() ###
@router.patch('/cont_edu/cert/person/{cont_edu_cert_person_id}/json', response_model=Resp_Body_Base)
async def patch_cont_edu_cert_person_json(
cont_edu_cert_person_obj: Cont_Edu_Cert_Person_Base,
cont_edu_cert_person_id: str = Path(min_length=11, max_length=22),
create_sub_obj: bool = False,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
include: Optional[list] = [],
exclude: Optional[list] = [],
exclude_unset: Optional[bool] = True,
exclude_none: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if cont_edu_cert_person_id := redis_lookup_id_random(record_id_random=cont_edu_cert_person_id, table_name='cont_edu_cert_person'): pass
else:
return mk_resp(data=None, status_code=404, response=response)
if cont_edu_cert_person_obj_up_result := update_cont_edu_cert_person_obj(
cont_edu_cert_person_id=cont_edu_cert_person_id,
cont_edu_cert_person_obj_up=cont_edu_cert_person_obj,
create_sub_obj=create_sub_obj,
):
log.debug(cont_edu_cert_person_obj_up_result)
if return_obj:
cont_edu_cert_person_obj = load_cont_edu_cert_person_obj(cont_edu_cert_person_id=cont_edu_cert_person_id)
cont_edu_cert_person_dict = cont_edu_cert_person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=cont_edu_cert_person_dict, response=response)
else:
return mk_resp(data=cont_edu_cert_person_obj_up_result, response=response)
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
# ### END ### API Cont Edu Cert Person ### patch_cont_edu_cert_person_json() ###
@router.get('/cont_edu/cert/person/list', response_model=Resp_Body_Base)
async def get_cont_edu_cert_person_obj_li(
for_obj_type: str = Query(None, min_length=2, max_length=50),
for_obj_id: str = Query(None, min_length=1, max_length=22),
group: str = Query(None, min_length=2, max_length=50),
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert_person'
if for_obj_type == 'event_exhibit' and for_obj_id:
#base_name = obj_type_li[obj_type]['base_name']
base_name = Cont_Edu_Cert_Person_Base
for_obj_id_random = for_obj_id
for_obj_id = redis_lookup_id_random(record_id_random=for_obj_id_random, table_name=for_obj_type)
data = {}
data['for_obj_type'] = for_obj_type
data['for_obj_id'] = for_obj_id
data['for_obj_id_random'] = for_obj_id_random
data['group'] = group
if group:
sql = """
SELECT *
FROM `cont_edu_cert_person` AS cont_edu_cert_person
WHERE cont_edu_cert_person.for_type = :for_obj_type AND cont_edu_cert_person.for_id = :for_obj_id
AND cont_edu_cert_person.group = :group
"""
else:
sql = """
SELECT *
FROM `cont_edu_cert_person` AS cont_edu_cert_person
WHERE cont_edu_cert_person.for_type = :for_obj_type AND cont_edu_cert_person.for_id = :for_obj_id
"""
if sql_result := sql_select(data=data, sql=sql, as_list=True):
resp_data_li = []
for record in sql_result:
resp_data = base_name(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset)
resp_data_li.append(resp_data)
return mk_resp(data=resp_data_li, response=response)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404, response=response)
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Cont Edu Cert Person ### search_cont_edu_cert_person_obj_li() ###
# Updated 2021-07-28
@router.get('/cont_edu/cert/person/search', response_model=Resp_Body_Base)
async def search_cont_edu_cert_person_obj_li(
cont_edu_cert_id_list: List[str] = Query(['']),
external_id: str = Query('%', max_length=50),
given_name: str = Query('%', max_length=25),
family_name: str = Query('%', max_length=25),
email: str = Query('%', max_length=50),
from_datetime: Optional[datetime.datetime] = None, # based on created_on
to_datetime: Optional[datetime.datetime] = None, # based on created_on
limit: int = 50,
enabled: str = 'enabled',
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=x_account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=response)
log.debug(cont_edu_cert_id_list)
print('---- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ----')
print(cont_edu_cert_id_list)
print('---- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ----')
if cont_edu_cert_id_list:
# Do something to change from id_random to id
cont_edu_cert_id_list_new = []
for cont_edu_cert_id in cont_edu_cert_id_list:
cont_edu_cert_id = redis_lookup_id_random(record_id_random=cont_edu_cert_id, table_name='cont_edu_cert')
cont_edu_cert_id_list_new.append(cont_edu_cert_id)
cont_edu_cert_id_list = cont_edu_cert_id_list_new
log.debug(cont_edu_cert_id_list)
# cont_edu_cert_id_list = [1, 2]
# cont_edu_cert_id_list = [3, 4]
# cont_edu_cert_id_list = ['3vqsbpWjd9s', 'bCv8WBzdRJQ']
data = {}
data['account_id'] = account_id
data['cont_edu_cert_id_list'] = cont_edu_cert_id_list
# data['external_id'] = external_id
# data['given_name'] = given_name
# data['family_name'] = family_name
data['email'] = '%'+email+'%' # Adding the % symbol here because it turns certain combinations into special characters
# data['from_datetime'] = from_datetime
# data['to_datetime'] = to_datetime
log.debug(data)
if enabled in ['enabled', 'disabled', 'all']:
if enabled == 'enabled':
data['enable'] = True
sql_enabled = f'AND `cont_edu_cert_person`.enable = :enable'
elif enabled == 'disabled':
data['enable'] = False
sql_enabled = f'AND `cont_edu_cert_person`.enable = :enable'
elif enabled == 'all':
sql_enabled = ''
if limit:
data['limit'] = limit
sql_limit = f'LIMIT :limit'
else:
sql_limit = ''
sql = f"""
SELECT *
FROM `v_cont_edu_cert_person` AS cont_edu_cert_person
WHERE cont_edu_cert_person.account_id = :account_id
AND cont_edu_cert_person.cont_edu_cert_id IN :cont_edu_cert_id_list
AND (cont_edu_cert_person.external_id LIKE :external_id OR cont_edu_cert_person.external_id IS NULL)
AND (cont_edu_cert_person.given_name LIKE :given_name
AND cont_edu_cert_person.family_name LIKE :family_name)
AND cont_edu_cert_person.email LIKE :email
{sql_enabled}
ORDER BY cont_edu_cert_person.given_name ASC, cont_edu_cert_person.family_name ASC, cont_edu_cert_person.created_on DESC, cont_edu_cert_person.updated_on DESC
{sql_limit};
"""
sql = f"""
SELECT *
FROM `v_cont_edu_cert_person` AS cont_edu_cert_person
WHERE cont_edu_cert_person.account_id = :account_id
AND cont_edu_cert_person.cont_edu_cert_id IN :cont_edu_cert_id_list
AND cont_edu_cert_person.email LIKE :email
{sql_enabled}
ORDER BY cont_edu_cert_person.given_name ASC, cont_edu_cert_person.family_name ASC, cont_edu_cert_person.created_on DESC, cont_edu_cert_person.updated_on DESC
{sql_limit};
"""
log.debug(sql)
if sql_result := sql_select(data=data, sql=sql, as_list=True, rm_id_random=True):
resp_data_li = []
for record in sql_result:
resp_data = Cont_Edu_Cert_Person_Base(**record).dict(by_alias=by_alias, exclude_unset=exclude_unset)
resp_data_li.append(resp_data)
return mk_resp(data=resp_data_li, response=response)
else:
log.debug(sql_result)
return mk_resp(data=False, status_code=404, response=response)
# ### END ### API Cont Edu Cert Person ### search_cont_edu_cert_person_obj_li() ###
# ### BEGIN ### API Cont Edu Cert Person ### get_cont_edu_cert_person_obj() ###
# Updated 2021-08-05
@router.get('/cont_edu/cert/person/{cont_edu_cert_person_id}', response_model=Resp_Body_Base)
async def get_cont_edu_cert_person_obj(
cont_edu_cert_person_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_cont_edu_cert: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if cont_edu_cert_person_id := redis_lookup_id_random(record_id_random=cont_edu_cert_person_id, table_name='cont_edu_cert_person'): pass
else: return mk_resp(data=None, status_code=404, response=response)
cont_edu_cert_person_obj = load_cont_edu_cert_person_obj(
cont_edu_cert_person_id = cont_edu_cert_person_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_cont_edu_cert = inc_cont_edu_cert,
)
cont_edu_cert_person_dict = cont_edu_cert_person_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=cont_edu_cert_person_dict, response=response)
# ### END ### API Cont Edu Cert Person ### get_cont_edu_cert_person_obj() ###
# ### BEGIN ### API Cont Edu Cert Person ### get_account_obj_cont_edu_cert_person_list() ###
# Updated 2021-07-28
@router.get('/account/{account_id}/cont_edu/cert/person/list', response_model=Resp_Body_Base)
async def get_account_obj_cont_edu_cert_person_list(
account_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_cont_edu_cert: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=response)
response_data = None
# log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-07-28
if cont_edu_cert_person_rec_list_result := get_cont_edu_cert_person_rec_list(
account_id = account_id,
limit = limit,
enabled = enabled,
):
cont_edu_cert_person_result_list = []
for cont_edu_cert_person_rec in cont_edu_cert_person_rec_list_result:
if load_cont_edu_cert_person_result := load_cont_edu_cert_person_obj(
cont_edu_cert_person_id = cont_edu_cert_person_rec.get('cont_edu_cert_person_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_cont_edu_cert = inc_cont_edu_cert,
):
cont_edu_cert_person_result_list.append(load_cont_edu_cert_person_result)
else:
cont_edu_cert_person_result_list.append(None)
response_data = cont_edu_cert_person_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Cont Edu Cert Person ### get_account_obj_cont_edu_cert_person_list() ###
# ### BEGIN ### API Cont Edu Cert Person ### get_person_obj_cont_edu_cert_person_list() ###
# Updated 2021-07-28
@router.get('/person/{person_id}/cont_edu/cert/person/list', response_model=Resp_Body_Base)
async def get_person_obj_cont_edu_cert_person_list(
person_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404, response=response)
# Updated 2021-10-01
if cont_edu_cert_person_rec_list_result := get_cont_edu_cert_person_rec_list(
person_id = person_id,
enabled = enabled,
limit = limit,
):
cont_edu_cert_person_result_list = []
for cont_edu_cert_person_rec in cont_edu_cert_person_rec_list_result:
if load_cont_edu_cert_person_result := load_cont_edu_cert_person_obj(
cont_edu_cert_person_id = cont_edu_cert_person_rec.get('cont_edu_cert_person_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
):
cont_edu_cert_person_result_list.append(load_cont_edu_cert_person_result)
else:
cont_edu_cert_person_result_list.append(None)
response_data = cont_edu_cert_person_result_list
elif isinstance(cont_edu_cert_person_rec_list_result, list) or cont_edu_cert_person_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Cont Edu Cert Person ### get_account_obj_cont_edu_cert_person_list() ###
# ### BEGIN ### API Cont Edu Cert Person ### get_cont_edu_cert_obj_cont_edu_cert_person_list() ###
# Updated 2021-07-28
@router.get('/cont_edu/cert/{cont_edu_cert_id}/cont_edu/cert/person/list', response_model=Resp_Body_Base)
async def get_cont_edu_cert_obj_cont_edu_cert_person_list(
cont_edu_cert_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_cont_edu_cert: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if cont_edu_cert_id := redis_lookup_id_random(record_id_random=cont_edu_cert_id, table_name='cont_edu_cert'): pass
else: return mk_resp(data=None, status_code=404, response=response)
response_data = None
# log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-07-28
if cont_edu_cert_person_rec_list_result := get_cont_edu_cert_person_rec_list(
cont_edu_cert_id = cont_edu_cert_id,
limit = limit,
enabled = enabled,
):
cont_edu_cert_person_result_list = []
for cont_edu_cert_person_rec in cont_edu_cert_person_rec_list_result:
if load_cont_edu_cert_person_result := load_cont_edu_cert_person_obj(
cont_edu_cert_person_id = cont_edu_cert_person_rec.get('cont_edu_cert_person_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_cont_edu_cert = inc_cont_edu_cert,
):
cont_edu_cert_person_result_list.append(load_cont_edu_cert_person_result)
else:
cont_edu_cert_person_result_list.append(None)
response_data = cont_edu_cert_person_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Cont Edu Cert Person ### get_cont_edu_cert_obj_cont_edu_cert_person_list() ###
@router.delete('/cont_edu/cert/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_cont_edu_cert_person_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'cont_edu_cert_person'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,292 @@
import datetime, json
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, 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, get_id_random, 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.methods.event_abstract_methods import create_update_event_abstract_obj, load_event_abstract_obj, get_event_abstract_rec_list, remove_event_abstract_obj
from app.models.event_abstract_models import Event_Abstract_In
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Event Abstract ### post_event_abstract_obj() ###
# Updated 2023-03-22
@router.post('/event/abstract', response_model=Resp_Body_Base)
async def post_event_abstract_obj(
event_abstract_obj: Event_Abstract_In,
event_id: str = Query(..., min_length=11, max_length=22),
event_person_id: str = Query(..., min_length=11, max_length=22),
# create_sub_obj: bool = False,
# fail_any: bool = True, # Fail if any thing goes wrong for sub objects
return_obj: bool = False,
inc_event_file_list: bool = False,
inc_event_person: bool = False,
inc_event_presentation_list: bool = False,
inc_event_presenter_list: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
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
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event ID was invalid or not found.')
if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Person ID was invalid or not found.')
# There should probably be a check for the event ID before calling the create function?
if create_event_abstract_obj_result := create_update_event_abstract_obj(
event_abstract_obj = event_abstract_obj,
event_id = event_id, # event_abstract_obj.event_id,
event_person_id = event_person_id, # event_abstract_obj.event_person_id,
# create_sub_obj = create_sub_obj,
# fail_any = fail_any,
return_outline = False,
): pass
else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The event abstract was not created. Check the field names and data types.')
if isinstance(create_event_abstract_obj_result, int):
event_abstract_id = create_event_abstract_obj_result
if return_obj:
if load_event_abstract_obj_result := load_event_abstract_obj(
event_abstract_id = event_abstract_id,
inc_event_file_list = inc_event_file_list,
inc_event_person = inc_event_person,
inc_event_presentation_list = inc_event_presentation_list,
inc_event_presenter_list = inc_event_presenter_list,
):
data = load_event_abstract_obj_result
else:
data = False
else:
event_abstract_id = event_abstract_id
event_abstract_id_random = get_id_random(record_id=event_abstract_id, table_name='event_abstract')
data = {}
data['event_abstract_id'] = event_abstract_id
data['event_abstract_id_random'] = event_abstract_id_random
return mk_resp(data=data, response=commons.response, status_message='The event abstract was created.')
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='The result from trying to create an event abstract was unexpected.')
# ### END ### API Event Abstract ### post_event_abstract_obj() ###
# ### BEGIN ### API Event Abstract ### patch_event_abstract_obj() ###
# Updated 2023-03-22
@router.patch('/event/abstract/{event_abstract_id}', response_model=Resp_Body_Base)
async def patch_event_abstract_obj(
event_abstract_obj: Event_Abstract_In,
event_abstract_id: str = Path(min_length=11, max_length=22),
# create_sub_obj: bool = False,
# fail_any: bool = True, # Fail if any thing goes wrong for sub objects
return_obj: bool = True,
inc_event_file_list: bool = False,
inc_event_person: bool = False,
inc_event_presentation_list: bool = False,
inc_event_presenter_list: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_abstract_id := redis_lookup_id_random(record_id_random=event_abstract_id, table_name='event_abstract'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Abstract ID was invalid or not found.')
if update_event_abstract_obj_result := create_update_event_abstract_obj(
event_abstract_obj = event_abstract_obj,
event_abstract_id = event_abstract_id,
# create_sub_obj = create_sub_obj,
# fail_any = fail_any,
return_outline = False,
): pass
else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The event abstract was not created. Check the field names and data types.')
if update_event_abstract_obj_result:
if return_obj:
if load_event_abstract_obj_result := load_event_abstract_obj(
event_abstract_id = event_abstract_id,
inc_event_file_list = inc_event_file_list,
inc_event_person = inc_event_person,
inc_event_presentation_list = inc_event_presentation_list,
inc_event_presenter_list = inc_event_presenter_list,
):
data = load_event_abstract_obj_result
else:
data = False
else:
event_abstract_id_random = get_id_random(record_id=event_abstract_id, table_name='event_abstract')
data = {}
data['event_abstract_id'] = event_abstract_id
data['event_abstract_id_random'] = event_abstract_id_random
return mk_resp(data=data, response=commons.response, status_message='The event abstract was created or updated.')
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='The result from trying to create an event abstract was unexpected.')
# ### END ### API Event Abstract ### patch_event_abstract_obj() ###
# ### BEGIN ### API Event Abstract ### get_event_abstract_obj() ###
# Updated 2023-03-22
@router.get('/event/abstract/{event_abstract_id}', response_model=Resp_Body_Base)
async def get_event_abstract_obj(
event_abstract_id: str = Path(min_length=11, max_length=22),
inc_event_cfg: bool = False,
inc_event_file_list: bool = False,
inc_event_person: bool = False,
inc_event_person_profile: bool = True,
inc_event_presentation_list: bool = False,
inc_event_presenter_list: bool = False,
approved: str = 'all', # approved, not_approved, all
hidden: str = 'not_hidden', # hidden, not_hidden, all
review: str = 'all', # hidden, not_hidden, all
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# time.sleep(.5)
# ### SECTION ### Secondary data validation
event_abstract_id_random = event_abstract_id # This is used later for the response data
if event_abstract_id := redis_lookup_id_random(record_id_random=event_abstract_id, table_name='event_abstract'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event Abstract ID was invalid or not found.')
if event_abstract_obj_result := load_event_abstract_obj(
event_abstract_id = event_abstract_id,
enabled = commons.enabled,
approved = approved, # approved, not_approved, all
hidden = hidden, # hidden, not_hidden, all
review = review, # ready, not_ready, all
inc_event_cfg = inc_event_cfg,
inc_event_file_list = inc_event_file_list,
inc_event_person = inc_event_person,
inc_event_person_profile = inc_event_person_profile,
inc_event_presentation_list = inc_event_presentation_list,
inc_event_presenter_list = inc_event_presenter_list,
):
log.info('Loading successful. Returning result')
event_abstract_obj_result.xyz = 'asdf!!!'
log.debug(event_abstract_obj_result)
return mk_resp(data=event_abstract_obj_result, response=commons.response) # Success
elif isinstance(event_abstract_obj_result, list) or event_abstract_obj_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Event Abstract ### get_event_abstract_obj() ###
# ### BEGIN ### API Event Abstract ### get_event_id_event_abstract_obj_li() ###
# Updated 2023-05-22
@router.get('/event/{event_id}/event/abstract/list', response_model=Resp_Body_Base)
async def get_event_id_event_abstract_obj_li(
event_id: str = Path(min_length=11, max_length=22),
# inc_address: bool = False,
# inc_contact: bool = False,
# inc_event_file_list: bool = False,
inc_event_person: bool = False, # Intended for event_presenter
# inc_file_count: bool = False, # NOTE: file counts are from separate views
# inc_poc_event_person: bool = False,
approved: str = 'all', # approved, not_approved, all
hidden: str = 'not_hidden', # hidden, not_hidden, all
review: str = 'all', # hidden, not_hidden, all
commons: Common_Route_Params = Depends(common_route_params),
):
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
else: return mk_resp(data=None, status_code=404, response=commons.response)
# Updated 2023-05-22
if event_abstract_rec_list_result := get_event_abstract_rec_list(
event_id = event_id,
# review = review, # ready, not_ready, all
approved = approved, # approve(d), not_approved, all
# hidden = hidden, # hidden, not_hidden, all
enabled = commons.enabled,
limit = commons.limit,
offset = commons.offset,
):
event_abstract_result_list = []
for event_abstract_rec in event_abstract_rec_list_result:
if load_event_abstract_result := load_event_abstract_obj(
event_abstract_id = event_abstract_rec.get('event_abstract_id', None),
# review = review,
# approved = approved,
hidden = hidden,
enabled = commons.enabled,
limit = commons.limit,
inc_event_person = inc_event_person,
):
event_abstract_result_list.append(load_event_abstract_result)
else:
event_abstract_result_list.append(None)
response_data = event_abstract_result_list
elif isinstance(event_abstract_rec_list_result, list) or event_abstract_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Event Abstract ### get_event_id_event_abstract_obj_li() ###
# # ### BEGIN ### API Event Abstract ### delete_event_abstract_obj() ###
# # Updated 2023-03-22
# @router.delete('/event/abstract/{event_abstract_id}', response_model=Resp_Body_Base)
# def delete_event_abstract_obj(
# event_abstract_id: str = Path(min_length=11, max_length=22),
# method: str = None, # None, delete, disable, hide
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# # ### SECTION ### Secondary data validation
# if event_abstract_id := redis_lookup_id_random(record_id_random=event_abstract_id, table_name='event_abstract'): pass
# else: return mk_resp(data=None, status_code=404, response=response, status_message='The Event Abstract ID was invalid or not found.')
# if event_abstract_obj_result := remove_event_abstract_obj(
# event_abstract_id = event_abstract_id,
# method = method,
# ):
# log.info('Delete successful. Returning True')
# return mk_resp(data=True, response=commons.response) # Success
# elif event_abstract_obj_result is None: # None
# log.info('No results')
# return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
# else:
# log.warning('Likely bad request')
# return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# # ### END ### API Event Abstract ### delete_event_abstract_obj() ###

View File

@@ -0,0 +1,131 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
#from ..log import *
from app.config import settings
from app.db_sql import *
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.event_person_detail_models import Event_Person_Detail_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_event_person_detail_obj(
obj: Event_Person_Detail_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_detail'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{obj_id}', response_model=Resp_Body_Base)
async def patch_event_person_detail_obj(
obj: Event_Person_Detail_Base,
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_detail'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/list', response_model=Resp_Body_Base)
async def get_event_person_detail_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_detail'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_event_person_detail_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_detail'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_event_person_detail_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_detail'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,244 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
from app.config import settings
from app.db_sql import sql_insert, sql_update, sql_insert_or_update, sql_select, sql_delete, get_id_random,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.methods.event_person_tracking_methods import get_event_person_tracking_rec_list, load_event_person_tracking_obj
from app.models.event_person_tracking_models import Event_Person_Tracking_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/event/person/tracking', response_model=Resp_Body_Base)
async def post_event_person_tracking_obj(
event_person_tracking_obj: Event_Person_Tracking_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_tracking'
event_person_tracking_obj_data_dict = event_person_tracking_obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type = obj_type,
data = event_person_tracking_obj_data_dict,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
@router.patch('/event/person/tracking/{event_person_tracking_id}', response_model=Resp_Body_Base)
async def patch_event_person_tracking_obj(
event_person_tracking_obj: Event_Person_Tracking_Base,
event_person_tracking_id: str = Path(min_length=11, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_tracking'
event_person_tracking_obj_data_dict = event_person_tracking_obj.dict(by_alias=False, exclude_unset=True)
event_person_tracking_obj_data_dict['id'] = redis_lookup_id_random(record_id_random=event_person_tracking_id, table_name=obj_type)
event_person_tracking_obj_data_dict['id_random'] = event_person_tracking_id
result = patch_obj_template(
obj_type = obj_type,
data = event_person_tracking_obj_data_dict,
obj_id = event_person_tracking_id,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
@router.get('/event/person/tracking/list', response_model=Resp_Body_Base)
async def get_event_person_tracking_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_tracking'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/event/person/tracking/{obj_id}', response_model=Resp_Body_Base)
async def get_event_person_tracking_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_tracking'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Event Person Tracking ### get_event_person_obj_tracking_list() ###
# Updated 2021-09-23
@router.get('/event/person/{event_person_id}/tracking/list', response_model=Resp_Body_Base)
async def get_event_person_obj_tracking_list(
event_person_id: str = Path(min_length=11, max_length=22),
event_session_id: str = Query(None, min_length=11, max_length=22),
in_out_type: str = Query(None, min_length=1, max_length=15),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_event_person: bool = False,
inc_event_session: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass
else: return mk_resp(data=None, status_code=404, response=response)
if event_session_id:
if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass
else: return mk_resp(data=None, status_code=404, response=response)
# Updated 2021-09-21
if event_person_tracking_rec_list_result := get_event_person_tracking_rec_list(
account_id = x_account_id,
event_person_id = event_person_id,
event_session_id = event_session_id,
in_out_type = in_out_type,
enabled = enabled,
limit = limit,
):
event_person_tracking_result_list = []
for event_person_tracking_rec in event_person_tracking_rec_list_result:
if load_event_person_tracking_result := load_event_person_tracking_obj(
event_person_tracking_id = event_person_tracking_rec.get('event_person_tracking_id', None),
enabled = enabled,
limit = limit,
inc_event_person = inc_event_person,
inc_event_session = inc_event_session,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
event_person_tracking_result_list.append(load_event_person_tracking_result)
else:
event_person_tracking_result_list.append(None)
response_data = event_person_tracking_result_list
elif isinstance(event_person_tracking_rec_list_result, list):
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Event Person Tracking ### get_event_person_obj_tracking_list() ###
# ### BEGIN ### API Event Person Tracking ### get_event_session_obj_event_person_tracking_list() ###
# Updated 2021-09-21
@router.get('/event/session/{event_session_id}/event/person/tracking/list', response_model=Resp_Body_Base)
async def get_event_session_obj_event_person_tracking_list(
event_session_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
inc_event_person: bool = False,
inc_event_session: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_session_id := redis_lookup_id_random(record_id_random=event_session_id, table_name='event_session'): pass
else: return mk_resp(data=None, status_code=404, response=response)
# Updated 2021-09-21
if event_person_tracking_rec_list_result := get_event_person_tracking_rec_list(
account_id = x_account_id,
event_session_id = event_session_id,
enabled = enabled,
limit = limit,
):
event_person_tracking_result_list = []
for event_person_tracking_rec in event_person_tracking_rec_list_result:
if load_event_person_tracking_result := load_event_person_tracking_obj(
event_person_tracking_id = event_person_tracking_rec.get('event_person_tracking_id', None),
enabled = enabled,
limit = limit,
inc_event_person = inc_event_person,
inc_event_session = inc_event_session,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
event_person_tracking_result_list.append(load_event_person_tracking_result)
else:
event_person_tracking_result_list.append(None)
response_data = event_person_tracking_result_list
elif isinstance(event_person_tracking_rec_list_result, list):
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Event Person Tracking ### get_event_session_obj_event_person_tracking_list() ###
@router.delete('/event/person/tracking/{obj_id}', response_model=Resp_Body_Base)
async def delete_event_person_tracking_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_person_tracking'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,152 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.event_registration_methods import load_event_registration_obj
from app.models.event_registration_models import Event_Registration_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_event_registration_obj(
obj: Event_Registration_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_registration'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{obj_id}', response_model=Resp_Body_Base)
async def patch_event_registration_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Event_Registration_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_registration'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/list', response_model=Resp_Body_Base)
async def get_event_registration_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_registration'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/{event_registration_id}', response_model=Resp_Body_Base)
async def get_event_registration_obj(
event_registration_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
# inc_event_cfg: bool = False,
inc_event_person_list: bool = False,
inc_event_registration_cfg: bool = False,
# inc_event_registration_list: bool = False,
inc_person: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_registration_id := redis_lookup_id_random(record_id_random=event_registration_id, table_name='event_registration'): pass
else: return mk_resp(data=None, status_code=404)
if event_registration_obj := load_event_registration_obj(
event_registration_id = event_registration_id,
inc_event_person_list = inc_event_person_list,
inc_event_registration_cfg = inc_event_registration_cfg,
# inc_event_registration_list = inc_event_registration_list,
inc_person = inc_person,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
):
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=event_registration_obj)
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_event_registration_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'event_registration'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,112 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, 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, get_id_random, 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.methods.event_presenter_methods import get_event_presenter_url_list
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Event Reports ### event_id_rpt_presenter_links() ###
# Updated 2022-04-12
@router.get('/event/{event_id}/rpt_presenter_links', response_model=Resp_Body_Base)
async def event_id_rpt_presenter_links(
event_id: str = Path(min_length=11, max_length=22),
commons: Common_Route_Params = Depends(common_route_params),
):
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
else: return mk_resp(data=None, status_code=404, response=commons.response)
if order_line_rec_list_result := get_order_line_rec_list(
for_obj_type = obj_type,
for_obj_id = obj_id,
from_datetime = from_datetime,
to_datetime = to_datetime,
product_for_type = prod_type,
status = status,
full_detail = full_detail,
# enabled = enabled,
limit = limit,
):
order_line_result_list = []
data_dict_list_for_export = []
for order_line_rec in order_line_rec_list_result:
if not full_detail:
if load_order_line_result := load_order_obj_line(
order_line_id = order_line_rec.get('order_line_id', None),
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
order_line_result_list.append(load_order_line_result)
else:
order_line_result_list.append(None)
else: # Uses a different view: v_order_line_full_detail
if load_order_line_result := load_order_obj_line_full_detail(
order_line_rec = order_line_rec,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = False,
):
if create_export:
data_dict = load_order_line_result.dict(by_alias=by_alias, exclude_unset=exclude_unset)
data_dict_list_for_export.append(data_dict)
order_line_result_list.append(load_order_line_result)
else:
order_line_result_list.append(None)
response_data = order_line_result_list
elif isinstance(order_line_rec_list_result, list) or order_line_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
if create_export:
# column_name_li = ['order_id_random', 'order_line_id_random', '', 'product_name', 'quantity', 'amount', 'dollar_amount', 'person_email']
# column_name_li = ['order_line_id_random', 'order_id_random', 'product_id_random', 'product_type', 'product_name', 'product_unit_price', 'product_recurring', 'curr_product_id_random', 'curr_product_type', 'curr_product_type_name', 'curr_product_name', 'name', 'quantity', 'amount', 'dollar_amount', 'recurring', 'message', 'person_id_random', 'person_given_name', 'person_family_name', 'person_full_name', 'person_full_name_override', 'person_contact_email', 'person_contact_cc_email', 'person_contact_phone_mobile', 'person_contact_phone_home', 'person_contact_phone_office', 'person_contact_phone_land', 'person_contact_phone_fax', 'person_contact_phone_other', 'person_contact_address_name', 'person_contact_address_organization_name', 'person_contact_address_line_1', 'person_contact_address_line_2', 'person_contact_address_line_3', 'person_contact_address_city', 'person_contact_address_country_subdivision_code', 'person_contact_address_state_province', 'person_contact_address_postal_code', 'person_contact_address_country_alpha_2_code', 'person_contact_address_country_name', 'person_contact_address_country', 'order_status', 'order_created_on', 'order_updated_on', 'created_on', 'updated_on']
column_name_li = [
'event_presenter_id_random',
'event_id_random',
'events_session_id_random',
'events_presentation_id_random',
'event_presenter_given_name',
'event_presenter_family_name',
'event_presenter_email',
'event_presenter_created_on', 'event_presenter_updated_on'
]
# column_name_li = []
datetime_format='%Y-%m-%d_%H%M'
# current_datetime = datetime.datetime.now() # Servers timezone (Eastern)
current_datetime_utc = datetime.datetime.utcnow()
current_datetime_utc = current_datetime_utc.strftime(datetime_format)
filename = f'order_line_list_{current_datetime_utc}'
if result := create_export_file(data_dict_list=data_dict_list_for_export, column_name_li=column_name_li, subdir_path='order_line', filename=filename, export_type='Excel'):
tmp_file_path = result
else:
log.error('Something went wrong while creating or saving the export file')
tmp_file_path = result
else: tmp_file_path = None
return mk_resp(data=response_data, tmp_file_path=tmp_file_path, response=response)
# ### END ### API Event Reports ### get_obj_id_order_line_list() ###

View File

@@ -0,0 +1,83 @@
import datetime, time
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging, secure_hash_string, verify_secure_hash_string, 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.methods.fundraising_methods import get_fundraising_rec_list, load_fundraising_obj
# from app.methods.fundraising_cfg_methods import load_fundraising_cfg_obj
from app.models.fundraising_models import Fundraising_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Event ### get_account_obj_fundraising_list() ###
# Updated 2021-12-13
@router.get('/account/{account_id}/fundraising/list', response_model=Resp_Body_Base)
async def get_account_obj_fundraising_list(
account_id: str = Path(min_length=11, max_length=22),
hidden: str = 'not_hidden', # hidden, not_hidden, all
priority: str = 'all', # priority, not_priority, all
inc_account_cfg: bool = False,
inc_fundraising_cfg: bool = False,
inc_product: bool = False,
inc_product_list: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
account_id = commons.x_account_id
# Updated 2021-12-13
if fundraising_rec_list_result := get_fundraising_rec_list(
account_id = account_id,
enabled = commons.enabled,
hidden = hidden,
priority = priority,
limit = commons.limit,
offset = commons.offset,
):
fundraising_result_list = []
for fundraising_rec in fundraising_rec_list_result:
if load_fundraising_result := load_fundraising_obj(
fundraising_id = fundraising_rec.get('fundraising_id', None),
inc_fundraising_cfg = inc_fundraising_cfg,
inc_product_list = inc_product_list,
enabled = commons.enabled,
limit = commons.limit,
offset = commons.offset,
# exclude_unset = commons.exclude_unset,
# model_as_dict = model_as_dict,
):
fundraising_result_list.append(load_fundraising_result)
else:
fundraising_result_list.append(None)
response_data = fundraising_result_list
elif isinstance(fundraising_rec_list_result, list) or fundraising_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
log.debug(response_data)
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Event ### get_account_obj_fundraising_list() ###

View File

@@ -0,0 +1,246 @@
import datetime, json
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, 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, get_id_random, 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.methods.grant_methods import create_update_grant_obj, load_grant_obj, get_grant_rec_list
# from app.methods.grant_methods import create_update_grant_obj, load_grant_obj, get_grant_rec_list, remove_grant_obj
from app.models.grant_models import Grant_In
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# # ### BEGIN ### API Grant ### post_grant_obj() ###
# # Updated 2023-03-22
# @router.post('/grant', response_model=Resp_Body_Base)
# async def post_grant_obj(
# grant_obj: Grant_In,
# # account_id: str = Query(..., min_length=11, max_length=22),
# event_id: str = Query(..., min_length=11, max_length=22),
# return_obj: bool = False,
# inc_event_abstract: bool = False,
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# 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
# else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Event ID was invalid or not found.')
# # There should probably be a check for the event ID before calling the create function?
# if create_grant_obj_result := create_update_grant_obj(
# grant_obj = grant_obj,
# account_id = commons.account_id,
# event_id = event_id,
# return_outline = False,
# ): pass
# else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The grant was not created. Check the field names and data types.')
# if isinstance(create_grant_obj_result, int):
# grant_id = create_grant_obj_result
# if return_obj:
# if load_grant_obj_result := load_grant_obj(
# grant_id = grant_id,
# inc_event_file_list = inc_event_file_list,
# inc_event_person = inc_event_person,
# inc_event_presentation_list = inc_event_presentation_list,
# inc_event_presenter_list = inc_event_presenter_list,
# ):
# data = load_grant_obj_result
# else:
# data = False
# else:
# grant_id = grant_id
# grant_id_random = get_id_random(record_id=grant_id, table_name='grant')
# data = {}
# data['grant_id'] = grant_id
# data['grant_id_random'] = grant_id_random
# return mk_resp(data=data, response=commons.response, status_message='The grant was created.')
# else:
# return mk_resp(data=False, status_code=400, response=commons.response, status_message='The result from trying to create an grant was unexpected.')
# # ### END ### API Grant ### post_grant_obj() ###
# ### BEGIN ### API Grant ### patch_grant_obj() ###
# Updated 2023-06-28
@router.patch('/grant/{grant_id}', response_model=Resp_Body_Base)
async def patch_grant_obj(
grant_obj: Grant_In,
grant_id: str = Path(min_length=11, max_length=22),
return_obj: bool = True,
inc_event_abstract: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if grant_id := redis_lookup_id_random(record_id_random=grant_id, table_name='grant'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Grant ID was invalid or not found.')
if update_grant_obj_result := create_update_grant_obj(
grant_obj = grant_obj,
grant_id = grant_id,
return_outline = False,
): pass
else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The grant was not created. Check the field names and data types.')
if update_grant_obj_result:
if return_obj:
if load_grant_obj_result := load_grant_obj(
grant_id = grant_id,
inc_event_abstract = inc_event_abstract,
):
data = load_grant_obj_result
else:
data = False
else:
grant_id_random = get_id_random(record_id=grant_id, table_name='grant')
data = {}
data['grant_id'] = grant_id
data['grant_id_random'] = grant_id_random
return mk_resp(data=data, response=commons.response, status_message='The grant was created or updated.')
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='The result from trying to create an grant was unexpected.')
# ### END ### API Grant ### patch_grant_obj() ###
# ### BEGIN ### API Grant ### get_grant_obj() ###
# Updated 2023-03-22
@router.get('/grant/{grant_id}', response_model=Resp_Body_Base)
async def get_grant_obj(
grant_id: str = Path(min_length=11, max_length=22),
inc_event_abstract: bool = False,
hidden: str = 'not_hidden', # hidden, not_hidden, all
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# time.sleep(.5)
# ### SECTION ### Secondary data validation
grant_id_random = grant_id # This is used later for the response data
if grant_id := redis_lookup_id_random(record_id_random=grant_id, table_name='grant'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The Grant ID was invalid or not found.')
if grant_obj_result := load_grant_obj(
grant_id = grant_id,
enabled = commons.enabled,
hidden = hidden, # hidden, not_hidden, all
inc_event_abstract = inc_event_abstract,
):
log.info('Loading successful. Returning result')
log.debug(grant_obj_result)
return mk_resp(data=grant_obj_result, response=commons.response) # Success
elif isinstance(grant_obj_result, list) or grant_obj_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Grant ### get_grant_obj() ###
# ### BEGIN ### API Grant ### get_event_id_grant_obj_li() ###
# Updated 2023-06-23
@router.get('/event/{event_id}/grant/list', response_model=Resp_Body_Base)
async def get_event_id_grant_obj_li(
event_id: str = Path(min_length=11, max_length=22),
inc_event_abstract: bool = False,
hidden: str = 'not_hidden', # hidden, not_hidden, all
commons: Common_Route_Params = Depends(common_route_params),
):
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
else: return mk_resp(data=None, status_code=404, response=commons.response)
# Updated 2023-06-23
if grant_rec_list_result := get_grant_rec_list(
event_id = event_id,
hidden = hidden, # hidden, not_hidden, all
enabled = commons.enabled,
limit = commons.limit,
offset = commons.offset,
):
grant_result_list = []
for grant_rec in grant_rec_list_result:
if load_grant_result := load_grant_obj(
grant_id = grant_rec.get('grant_id', None),
hidden = hidden,
enabled = commons.enabled,
limit = commons.limit,
inc_event_abstract = inc_event_abstract,
):
grant_result_list.append(load_grant_result)
else:
grant_result_list.append(None)
response_data = grant_result_list
elif isinstance(grant_rec_list_result, list) or grant_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Grant ### get_event_id_grant_obj_li() ###
# # ### BEGIN ### API Grant ### delete_grant_obj() ###
# # Updated 2023-03-22
# @router.delete('/grant/{grant_id}', response_model=Resp_Body_Base)
# def delete_grant_obj(
# grant_id: str = Path(min_length=11, max_length=22),
# method: str = None, # None, delete, disable, hide
# commons: Common_Route_Params = Depends(common_route_params),
# ):
# log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# # ### SECTION ### Secondary data validation
# if grant_id := redis_lookup_id_random(record_id_random=grant_id, table_name='grant'): pass
# else: return mk_resp(data=None, status_code=404, response=response, status_message='The Grant ID was invalid or not found.')
# if grant_obj_result := remove_grant_obj(
# grant_id = grant_id,
# method = method,
# ):
# log.info('Delete successful. Returning True')
# return mk_resp(data=True, response=response) # Success
# elif grant_obj_result is None: # None
# log.info('No results')
# return mk_resp(data=None, status_code=404, response=response) # Not Found
# else:
# log.warning('Likely bad request')
# return mk_resp(data=False, status_code=400, response=response) # Bad Request
# # ### END ### API Grant ### delete_grant_obj() ###

View File

@@ -0,0 +1,135 @@
import datetime, pytz, time
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.log_client_viewing_methods import get_log_client_viewing_rec_list, load_log_client_viewing_obj
from app.models.log_client_viewing_models import Log_Client_Viewing_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/log/client_viewing', response_model=Resp_Body_Base)
async def post_log_client_viewing_obj(
obj: Log_Client_Viewing_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'log_client_viewing'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/log/client_viewing/{obj_id}', response_model=Resp_Body_Base)
async def patch_log_client_viewing_obj(
obj: Log_Client_Viewing_Base,
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'log_client_viewing'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Log Client Viewing Methods ### get_account_log_client_viewing_obj_li() ###
# Updated 2021-07-01
@router.get('/account/{account_id}/log/client_viewing/list', response_model=Resp_Body_Base)
async def get_account_log_client_viewing_obj_li(
account_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled',
limit: int = 1000,
from_datetime: datetime.datetime = None,
to_datetime: datetime.datetime = None,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404)
# Updated 2021-07-02
if log_client_viewing_rec_list_result := get_log_client_viewing_rec_list(
account_id = account_id,
from_datetime = from_datetime,
to_datetime = to_datetime,
limit = limit,
enabled = enabled,
):
log_client_viewing_result_list = []
for log_client_viewing_rec in log_client_viewing_rec_list_result:
if load_log_client_viewing_result := load_log_client_viewing_obj(
log_client_viewing_id = log_client_viewing_rec.get('log_client_viewing_id', None),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
log_client_viewing_result_list.append(load_log_client_viewing_result)
else:
log_client_viewing_result_list.append(None)
response_data = log_client_viewing_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Log Client Viewing Methods ### get_account_log_client_viewing_obj_li() ###
@router.delete('/log/client_viewing/{log_client_viewing_obj_id}', response_model=Resp_Body_Base)
async def delete_log_client_viewing_obj(
log_client_viewing_obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'log_client_viewing'
result = delete_obj_template(
obj_type=obj_type,
obj_id=log_client_viewing_obj_id,
)
return result

View File

@@ -0,0 +1,46 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
from app.config import settings
from app.db_sql import 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.methods.membership_cfg_methods import load_membership_cfg_obj
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Membership Cfg ### get_account_obj_membership_cfg() ###
# Updated 2021-07-13
@router.get('/account/{account_id}/membership/cfg', response_model=Resp_Body_Base)
async def get_account_obj_membership_cfg(
account_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404)
if membership_cfg_result := load_membership_cfg_obj(
account_id = account_id,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = True,
):
response_data = membership_cfg_result
else: return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Cfg ### get_account_obj_membership_cfg() ###

View File

@@ -0,0 +1,321 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.membership_group_methods import get_membership_group_rec_list, load_membership_group_obj
from app.models.membership_group_models import Membership_Group_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/group', response_model=Resp_Body_Base)
async def post_membership_group_obj(
obj: Membership_Group_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/membership/group/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_group_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Membership_Group_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/membership/group/list', response_model=Resp_Body_Base)
async def get_membership_group_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Membership Group Methods ### get_account_membership_group_obj_li() ###
# Updated 2021-07-01
@router.get('/account/{account_id}/membership/group/list', response_model=Resp_Body_Base)
async def get_account_membership_group_obj_li(
account_id: str = Path(min_length=11, max_length=22),
# product_id: Optional[str] = Query(None, min_length=1, max_length=22),
# type_level: Optional[int] = None,
enabled: str = 'enabled',
limit: int = 1000,
inc_address: bool = False,
inc_contact: bool = False,
inc_membership_cfg: bool = False,
inc_membership_person_group_list: bool = False,
inc_organization: bool = False,
inc_person: bool = False,
inc_product_list: bool = False,
inc_user: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404)
# Updated 2021-07-01
if membership_group_rec_list_result := get_membership_group_rec_list(
account_id = account_id,
# product_id = product_id,
# type_level = type_level,
limit = limit,
enabled = enabled,
):
membership_group_result_list = []
for membership_group_rec in membership_group_rec_list_result:
if load_membership_group_result := load_membership_group_obj(
membership_group_id = membership_group_rec.get('membership_group_id', None),
enabled = enabled,
limit = limit,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list,
inc_organization = inc_organization,
inc_person = inc_person,
inc_product_list = inc_product_list,
inc_user = inc_user,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
membership_group_result_list.append(load_membership_group_result)
else:
membership_group_result_list.append(None)
response_data = membership_group_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Group Methods ### get_account_membership_group_obj_li() ###
# Look up is only for account, person, or user records
@router.get('/membership/group/lookup', response_model=Resp_Body_Base)
async def lookup_membership_group_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
x_account_id: str = Header(...),
inc_membership_person_profile: bool = True,
inc_membership_cfg: bool = True,
inc_extended_profile: bool = True,
inc_person: bool = True,
inc_user: bool = True,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
base_name = Membership_Group_Base
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
data = {}
as_list = False
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = for_obj_id
sql_where_for_obj_type = """`membership_group`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_group`.person_id = :person_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = for_obj_id
sql_where_for_obj_type = """`membership_group`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_group' and for_obj_id:
data['membership_group_id'] = for_obj_id
sql_where_for_obj_type = """`membership_group`.id = :membership_group_id"""
sql_limit = 'LIMIT 1'
else:
log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
sql = f"""
SELECT id AS 'membership_group_id', id_random AS 'membership_group_id_random'
FROM `membership_group` AS `membership_group`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_group_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_group_obj_result, dict):
membership_group_id = membership_group_obj_result.get('membership_group_id', None)
membership_group_obj = load_membership_group_obj(
membership_group_id = membership_group_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_group_obj
elif isinstance(membership_group_obj_result, list):
membership_group_obj_li = []
for membership_group_obj in membership_group_obj_result:
membership_group_id = membership_group_obj.get('membership_group_id', None)
membership_group_obj_li.append(
load_membership_group_obj(
membership_group_id = membership_group_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
)
data = membership_group_obj_li
else:
log.debug(membership_group_obj_result)
return mk_resp(data=None, status_code=404) # Not Found
return mk_resp(data=data)
# ### BEGIN ### API Membership Group ### get_membership_group_obj() ###
# Working well as of 2021-06-21. Using as a template for other routes.
@router.get('/membership/group/{membership_group_id}', response_model=Resp_Body_Base)
async def get_membership_group_obj(
membership_group_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_address: bool = False, # Per member
inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # List of groups per member
inc_membership_person_group_list: bool = False, # List of members belonging to this group
inc_membership_person_profile: bool = False, # Per member
inc_organization: bool = False, # Per member
inc_person: bool = False, # Per member
inc_product: bool = False, # Per member
inc_product_list: bool = False,
inc_user: bool = False, # Per member
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_group_id := redis_lookup_id_random(record_id_random=membership_group_id, table_name='membership_group'): pass
else:
return mk_resp(data=None, status_code=404)
if membership_group_result := load_membership_group_obj(
membership_group_id = membership_group_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict, # NOTE: returning model as a dict
enabled = enabled,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
# inc_membership_group_list = inc_membership_group_list,
inc_membership_person_group_list = inc_membership_person_group_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_organization = inc_organization,
inc_person = inc_person,
# inc_product = inc_product,
inc_product_list = inc_product_list,
inc_user = inc_user,
):
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=membership_group_result)
# ### END ### API Membership ### get_membership_group_obj() ###
@router.delete('/membership/group/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_group_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_group'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,439 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, 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_enable_part, sql_insert, sql_update, sql_insert_or_update, sql_limit_offset_part, 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.methods.membership_person_methods import create_membership_person_obj, get_membership_person_rec_list, load_membership_person_obj, update_membership_person_obj
from app.models.common_field_schema import default_num_bytes
from app.models.membership_person_models import Membership_Person_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Membership Person ### post_membership_person_obj() ###
# Using create_membership_person_obj()
# Updated 2022-01-11
@router.post('/membership/person', response_model=Resp_Body_Base)
async def post_membership_person_obj(
membership_person_obj: Membership_Person_Base,
person_id: str = Query(..., min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
inc_membership_cfg: bool = False,
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# if not person_id:
# person_id = membership_person_obj.person_id
# person_id_random = membership_person_obj.person_id_random
# log.debug(f'Person ID: {person_id}, Person ID Random: {person_id_random}')
# ### SECTION ### Secondary data validation
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
# elif person_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The person ID was invalid or not found.')
# ### SECTION ### Process data
if membership_person_id := create_membership_person_obj(
account_id = commons.x_account_id,
person_id = person_id,
membership_person_dict_obj = membership_person_obj,
): pass
else: return mk_resp(data=False, status_code=400, response=commons.response, status_message='The membership person was not created. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = commons.enabled,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=commons.response, status_message='The membership person was probably created, but there was a problem returning the data.')
else:
membership_person_id_random = get_id_random(record_id=membership_person_id, table_name='membership_person')
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Membership Person ### post_membership_person_obj() ###
# ### BEGIN ### API Membership Person ### patch_membership_person_obj() ###
# Using update_membership_person_obj()
# Updated 2022-01-11
@router.patch('/membership/person/{membership_person_id}', response_model=Resp_Body_Base)
async def patch_membership_person_obj(
membership_person_obj: Membership_Person_Base,
membership_person_id: Optional[str] = Path(min_length=11, max_length=22),
create_sub_obj: bool = False,
fail_any: bool = True, # Fail if any thing goes wrong for sub objects
inc_membership_cfg: bool = False,
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(f'Membership Person ID: {membership_person_id}')
membership_person_id_random = membership_person_id # This is used later for the response data
# ### SECTION ### Secondary data validation
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=False, status_code=404, response=commons.response, status_message='The membership person ID was invalid or not found.') # Not Found
# ### SECTION ### Process data
if update_membership_person_obj_result := update_membership_person_obj(
membership_person_id = membership_person_id,
membership_person_dict_obj = membership_person_obj,
): pass
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response, status_message='The membership person was not updated. Check the field names and data types.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_membership_person_obj_result := load_membership_person_obj(
membership_person_id = membership_person_id,
enabled = commons.enabled,
):
data = load_membership_person_obj_result
else:
data = False
return mk_resp(data=data, response=commons.response, status_message='The membership person was probably updated, but there was a problem returning the data.')
else:
data = {}
data['membership_person_id'] = membership_person_id
data['membership_person_id_random'] = membership_person_id_random
return mk_resp(data=data, response=commons.response, status_message='The membership person was updated.')
# ### END ### API Membership Person ### patch_membership_person_obj() ###
# ### BEGIN ### API Membership Person ### get_membership_person_obj() ###
# Updated 2022-01-11
@router.get('/membership/person/{membership_person_id}', response_model=Resp_Body_Base)
async def get_membership_person_obj(
membership_person_id: str = Path(min_length=11, max_length=22),
# inc_address: bool = False, # Per member
# inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group for a person
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_person_profile: bool = False,
# inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False, # The list of all membership types a person is a part of
# inc_membership_person_type: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_person: bool = False,
# inc_product: bool = False, # Per member or group member belongs to
# inc_product_list: bool = False,
# inc_user: bool = False, # Per member
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if membership_person_rec_result := load_membership_person_obj(
membership_person_id = membership_person_id,
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = commons.model_as_dict,
enabled = commons.enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list,
# inc_membership_person_profile = inc_membership_person_profile,
# inc_membership_person_profile_cust = inc_membership_person_profile_cust,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_type = inc_membership_person_type,
# inc_membership_person_type_list = inc_membership_person_type_list, # All the membership types they are a part of.
# inc_membership_type = inc_membership_type,
# inc_membership_type_list = inc_membership_type_list,
# inc_order = inc_order,
# inc_organization = inc_organization,
# inc_person = inc_person,
# inc_product = inc_product,
# inc_product_list = inc_product_list,
# inc_user = inc_user,
):
response_data = membership_person_rec_result
elif membership_person_rec_result is None: # Empty dict or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_membership_person_obj() ###
# ### BEGIN ### API Membership Person ### get_person_obj_membership_person() ###
# Updated 2022-01-11
@router.get('/person/{person_id}/membership/person', response_model=Resp_Body_Base)
async def get_person_obj_membership_person(
person_id: str = Path(min_length=11, max_length=22),
# inc_address: bool = False, # Per member
# inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False, # The primary membership group for a person
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_person_group_list: bool = False,
# inc_membership_person_profile_cust: bool = False, # Extended profile?
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False, # The list of all membership types a person is a part of
# inc_membership_type: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_product: bool = False, # The product the person actually purchased for a member_type or member_group
# inc_product_list: bool = False, # The list of products that give access to a member_type or member_group
# inc_user: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
if membership_person_rec := sql_select(table_name='membership_person', field_name='person_id', field_value=person_id): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
log.debug(membership_person_rec)
membership_person_id = membership_person_rec.get('id') # 'membership_person_id' is using the view
log.debug(membership_person_id)
if membership_person_rec_result := load_membership_person_obj(
membership_person_id = membership_person_id,
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
enabled = commons.enabled,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list, # List of membership group for a person - 2022-01-11
inc_membership_person_profile = inc_membership_person_profile, # Membership profile for a person - 2022-01-11
inc_membership_person_type = inc_membership_person_type, # Primary membership type for a person - 2022-01-11
):
response_data = membership_person_rec_result
elif membership_person_rec_result is None: # Empty dict or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_person_obj_membership_person() ###
# ### BEGIN ### API Membership Person ### get_account_obj_membership_person_list() ###
# Updated 2022-01-11
@router.get('/account/{account_id}/membership/person/list', response_model=Resp_Body_Base)
async def get_account_obj_membership_person_list(
account_id: str = Path(min_length=11, max_length=22),
# inc_account_cfg: bool = False,
# inc_address: bool = False, # Under contact
# inc_contact: bool = False,
inc_membership_cfg: bool = False,
# inc_membership_group: bool = False,
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
# inc_membership_person: bool = False,
# inc_membership_person_list: bool = False,
# inc_membership_person_profile: bool = False,
# inc_membership_person_profile_cust: bool = False,
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
# inc_membership_type_list: bool = False,
# inc_order: bool = False,
# inc_organization: bool = False,
# inc_person: bool = False,
# inc_product: bool = False,
# inc_product_list: bool = False,
# inc_user: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response)
response_data = None
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# Updated 2021-06-23
if membership_person_rec_list_result := get_membership_person_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = commons.limit,
enabled = commons.enabled,
):
membership_person_result_list = []
for membership_person_rec in membership_person_rec_list_result:
if load_membership_person_result := load_membership_person_obj(
membership_person_id = membership_person_rec.get('membership_person_id', None),
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = commons.model_as_dict,
enabled = commons.enabled,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list,
# inc_membership_person_group_list = inc_membership_person_group_list,
# inc_membership_person = inc_membership_person,
# inc_membership_person_list = inc_membership_person_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_type = inc_membership_person_type,
# inc_order = inc_order,
# inc_organization = inc_organization,
# inc_person = inc_person,
# inc_product = inc_product,
# inc_product_list = inc_product_list,
# inc_user = inc_user,
):
membership_person_result_list.append(load_membership_person_result)
else:
membership_person_result_list.append(None)
response_data = membership_person_result_list
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### END ### API Membership Person ### get_account_obj_membership_person_list() ###
# Look up is only for account, person, or user records
# Deprecated 2022-01-11
@router.get('/membership/person/lookup', response_model=Resp_Body_Base)
async def lookup_membership_person_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
inc_membership_cfg: bool = True,
inc_membership_person_group_list: bool = False, # List of membership group for a person - 2022-01-11
inc_membership_person_profile: bool = False, # Membership profile for a person - 2022-01-11
inc_membership_person_type: bool = False, # Primary membership type for a person - 2022-01-11
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
base_name = Membership_Person_Base
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
data = {}
as_list = False
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.person_id = :person_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_person' and for_obj_id:
data['membership_person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_person`.id = :membership_person_id"""
sql_limit = 'LIMIT 1'
else:
log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
sql = f"""
SELECT id AS 'membership_person_id', id_random AS 'membership_person_id_random'
FROM `membership_person` AS `membership_person`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_person_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_person_obj_result, dict):
membership_person_id = membership_person_obj_result.get('membership_person_id', None)
membership_person_obj = load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_type = inc_membership_person_type,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset)
data = membership_person_obj
elif isinstance(membership_person_obj_result, list):
membership_person_obj_li = []
for membership_person_obj in membership_person_obj_result:
membership_person_id = membership_person_obj.get('membership_person_id', None)
membership_person_obj_li.append(
load_membership_person_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_group_list = inc_membership_person_group_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_person_type = inc_membership_person_type,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset)
)
data = membership_person_obj_li
else:
log.debug(membership_person_obj_result)
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
return mk_resp(data=data, response=commons.response)
@router.delete('/membership/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_person_obj(
obj_id: str = Path(min_length=11, max_length=22),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,123 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.membership_person_group_methods import get_membership_person_group_rec_list, load_membership_person_group_obj
from app.models.membership_person_group_models import Membership_Person_Group_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/group/person', response_model=Resp_Body_Base)
async def post_membership_person_group_obj(
obj: Membership_Person_Group_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_group'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/membership/group/person/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_person_group_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Membership_Person_Group_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_group'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Membership Type Person ### get_membership_person_group_obj() ###
# Updated 2021-07-27
@router.get('/membership/group/person/{membership_person_group_id}', response_model=Resp_Body_Base)
async def get_membership_person_group_obj(
membership_person_group_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_product: bool = False, # Per member or group member belongs to
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_person_group_id := redis_lookup_id_random(record_id_random=membership_person_group_id, table_name='membership_person_group'): pass
else: return mk_resp(data=None, status_code=404)
if membership_person_group_result := load_membership_person_group_obj(
membership_person_group_id = membership_person_group_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_product = inc_product,
):
response_data = membership_person_group_result
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Type Person ### get_membership_person_group_obj() ###
@router.delete('/membership/group/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_person_group_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_group'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,101 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
from app.config import settings
from app.db_sql import 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.methods.membership_person_profile_methods import load_membership_person_profile_obj
from app.models.membership_person_profile_models import Membership_Person_Profile_Base, Membership_Person_Profile_Base_Up
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/person/profile', response_model=Resp_Body_Base)
async def post_membership_person_profile_obj(
obj: Membership_Person_Profile_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_profile'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/membership/person/profile/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_person_profile_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Membership_Person_Profile_Base_Up = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_profile'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type = obj_type,
data = obj_data_dict,
obj_id = obj_id,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
# ### BEGIN ### API Membership Profile ### get_membership_person_obj_profile() ###
# Updated 2021-07-13
@router.get('/membership/person/{membership_person_id}/profile', response_model=Resp_Body_Base)
async def get_membership_person_obj_profile(
membership_person_id: str = Path(min_length=11, max_length=22),
inc_membership_cfg: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_person_id := redis_lookup_id_random(record_id_random=membership_person_id, table_name='membership_person'): pass
else: return mk_resp(data=None, status_code=404)
if membership_person_profile_result := load_membership_person_profile_obj(
membership_person_id = membership_person_id,
inc_membership_cfg = inc_membership_cfg,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = True,
):
response_data = membership_person_profile_result
else: return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Profile ### get_membership_person_obj_profile() ###

View File

@@ -0,0 +1,123 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import log, logging
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.methods.membership_person_type_methods import get_membership_person_type_rec_list, load_membership_person_type_obj
from app.models.membership_person_type_models import Membership_Person_Type_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/type/person', response_model=Resp_Body_Base)
async def post_membership_person_type_obj(
obj: Membership_Person_Type_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_type'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/membership/type/person/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_person_type_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Membership_Person_Type_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_type'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Membership Type Person ### get_membership_person_type_obj() ###
# Updated 2021-07-27
@router.get('/membership/type/person/{membership_person_type_id}', response_model=Resp_Body_Base)
async def get_membership_person_type_obj(
membership_person_type_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_product: bool = False, # Per member or group member belongs to
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_person_type_id := redis_lookup_id_random(record_id_random=membership_person_type_id, table_name='membership_person_type'): pass
else: return mk_resp(data=None, status_code=404)
if membership_person_type_result := load_membership_person_type_obj(
membership_person_type_id = membership_person_type_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
enabled = enabled,
inc_product = inc_product,
):
response_data = membership_person_type_result
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Membership Type Person ### get_membership_person_type_obj() ###
@router.delete('/membership/type/person/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_person_type_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_person_type'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,343 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, 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.methods.membership_type_methods import get_membership_type_rec_list, load_membership_type_obj
from app.models.membership_type_models import Membership_Type_Base
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
@router.post('/membership/type', response_model=Resp_Body_Base)
async def post_membership_type_obj(
obj: Membership_Type_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_type'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/membership/type/{obj_id}', response_model=Resp_Body_Base)
async def patch_membership_type_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Membership_Type_Base = None,
#x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_type'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/membership/type/list', response_model=Resp_Body_Base)
async def get_membership_type_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_type'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Membership Type Methods ### get_account_membership_type_obj_li() ###
# Updated 2022-01-13
@router.get('/account/{account_id}/membership/type/list', response_model=Resp_Body_Base)
async def get_account_membership_type_obj_li(
account_id: str = Path(min_length=11, max_length=22),
# product_id: Optional[str] = Query(None, min_length=1, max_length=22),
# type_level: Optional[int] = None,
# inc_address: bool = False,
# inc_contact: bool = False,
inc_membership_cfg: bool = False,
inc_membership_person_list: bool = False,
# inc_organization: bool = False,
# inc_person: bool = False,
inc_product_list: bool = False,
# inc_user: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The account ID was invalid or not found.')
# Updated 2022-01-13
if membership_type_rec_list_result := get_membership_type_rec_list(
account_id = account_id,
# product_id = product_id,
# type_level = type_level,
limit = commons.limit,
enabled = commons.enabled,
):
membership_type_result_list = []
for membership_type_rec in membership_type_rec_list_result:
if load_membership_type_result := load_membership_type_obj(
membership_type_id = membership_type_rec.get('membership_type_id', None),
enabled = commons.enabled,
limit = commons.limit,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_person_list = inc_membership_person_list,
# inc_organization = inc_organization,
# inc_person = inc_person,
inc_product_list = inc_product_list,
# inc_user = inc_user,
# by_alias = by_alias,
# exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
membership_type_result_list.append(load_membership_type_result)
else:
membership_type_result_list.append(None)
response_data = membership_type_result_list
elif isinstance(membership_person_rec_result, list) or membership_person_rec_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
return mk_resp(data=response_data, response=commons.response)
# ### BEGIN ### API Membership Type Methods ### get_account_membership_type_obj_li() ###
# Look up is only for account, person, or user records
@router.get('/membership/type/lookup', response_model=Resp_Body_Base)
async def lookup_membership_type_obj(
for_obj_id: Union[int,str],
for_obj_type: str = Query(..., min_length=2, max_length=50),
x_account_id: str = Header(...),
inc_membership_person_profile: bool = True,
inc_membership_cfg: bool = True,
inc_extended_profile: bool = True,
inc_person: bool = True,
inc_user: bool = True,
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_type'
base_name = Membership_Type_Base
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
# log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
data = {}
as_list = False
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = for_obj_id
sql_where_for_obj_type = """`membership_type`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`membership_type`.person_id = :person_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = for_obj_id
sql_where_for_obj_type = """`membership_type`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'membership_type' and for_obj_id:
data['membership_type_id'] = for_obj_id
sql_where_for_obj_type = """`membership_type`.id = :membership_type_id"""
sql_limit = 'LIMIT 1'
else:
log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
sql = f"""
SELECT id AS 'membership_type_id', id_random AS 'membership_type_id_random'
FROM `membership_type` AS `membership_type`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
membership_type_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(membership_type_obj_result, dict):
membership_type_id = membership_type_obj_result.get('membership_type_id', None)
membership_type_obj = load_membership_type_obj(
membership_type_id = membership_type_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
data = membership_type_obj
elif isinstance(membership_type_obj_result, list):
membership_type_obj_li = []
for membership_type_obj in membership_type_obj_result:
membership_type_id = membership_type_obj.get('membership_type_id', None)
membership_type_obj_li.append(
load_membership_type_obj(
membership_type_id = membership_type_id,
inc_membership_person_profile = inc_membership_person_profile,
inc_membership_cfg = inc_membership_cfg,
inc_extended_profile = inc_extended_profile,
inc_person = inc_person,
inc_user = inc_user,
).dict(by_alias=by_alias, exclude_unset=exclude_unset)
)
data = membership_type_obj_li
else:
log.debug(membership_type_obj_result)
return mk_resp(data=None, status_code=404) # Not Found
return mk_resp(data=data)
# ### BEGIN ### API Membership Type ### get_membership_type_obj() ###
# Working well as of 2021-07-01. Using as a template for other routes.
@router.get('/membership/type/{membership_type_id}', response_model=Resp_Body_Base)
async def get_membership_type_obj(
membership_type_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled', # For now this covers any included objects or object lists
limit: int = 500, # For now this covers any included objects or object lists
inc_address: bool = False, # Per member
inc_contact: bool = False, # Per member
inc_membership_cfg: bool = False,
inc_membership_group_list: bool = False, # Per member
inc_membership_person_list: bool = False,
inc_membership_person_profile: bool = False, # Per member
inc_organization: bool = False, # Per member
inc_person: bool = False, # Per member
inc_product: bool = False, # Per member
inc_product_list: bool = False,
inc_user: bool = False, # Per member
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if membership_type_id := redis_lookup_id_random(record_id_random=membership_type_id, table_name='membership_type'): pass
else:
return mk_resp(data=None, status_code=404)
if membership_type_result := load_membership_type_obj(
membership_type_id = membership_type_id,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict, # NOTE: returning model as a dict
enabled = enabled,
inc_address = inc_address,
inc_contact = inc_contact,
inc_membership_cfg = inc_membership_cfg,
inc_membership_group_list = inc_membership_group_list,
inc_membership_person_list = inc_membership_person_list,
inc_membership_person_profile = inc_membership_person_profile,
inc_organization = inc_organization,
inc_person = inc_person,
inc_product = inc_product,
inc_product_list = inc_product_list,
inc_user = inc_user,
):
pass
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=membership_type_result)
# ### END ### API Membership ### get_membership_type_obj() ###
# @router.get('/membership/type/{obj_id}', response_model=Resp_Body_Base)
# async def get_membership_type_obj_old(
# obj_id: str = Path(min_length=11, max_length=22),
# x_account_id: str = Header(...),
# by_alias: Optional[bool] = True,
# exclude_unset: Optional[bool] = True,
# response: Response = Response,
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# obj_type = 'membership_type'
# result = get_obj_template(
# obj_type=obj_type,
# obj_id=obj_id,
# by_alias=True,
# exclude_unset=True,
# )
# return result
@router.delete('/membership/type/{obj_id}', response_model=Resp_Body_Base)
async def delete_membership_type_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'membership_type'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,447 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from app.config import settings
from app.db_sql import *
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.order_methods import get_order_rec_list, load_order_obj, save_order_obj
from app.models.response_models import *
from app.models.order_models import Order_Base, Order_DB_Base
router = APIRouter()
# NOTE 2021-08-09: Use with rework of order_cart
# account_id is required, person_id is ideal
@router.post('/order', response_model=Resp_Body_Base)
async def post_order_obj(
order_obj: Order_DB_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
order_obj = order_obj.dict(by_alias=False, exclude_unset=False)
result = post_obj_template(
obj_type = obj_type,
data = order_obj,
return_obj = True,
by_alias = True,
exclude_unset = True,
)
return result
# NOTE 2021-08-09: Use with rework of order_cart
@router.patch('/order/{obj_id}', response_model=Resp_Body_Base)
async def patch_order_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Order_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# NOTE 2021-08-09: Use with rework of order_cart
# NOTE: The router needs to have the prefix (/order) removed.
@router.patch('/order/{order_id}/line/add', response_model=Resp_Body_Base)
async def patch_order_obj_line_add(
order_id: str = Path(min_length=11, max_length=22),
obj: Order_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
@router.get('/order/list', response_model=Resp_Body_Base)
async def get_order_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
order_status: Optional[str] = 'complete',
from_datetime: Optional[datetime.datetime] = None,
to_datetime: Optional[datetime.datetime] = None,
limit: Optional[int] = None,
inc_order_line_list: Optional[bool] = False,
inc_order_cfg: Optional[bool] = False,
inc_person_obj: Optional[bool] = False,
inc_user_obj: Optional[bool] = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
data = {}
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='account')
sql_account_person_user = f"""`order`.account_id = :account_id"""
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='person')
sql_account_person_user = f"""`order`.person_id = :person_id"""
# elif for_obj_type == 'user' and for_obj_id:
# data['user_id'] = redis_lookup_id_random(record_id_random=for_obj_id, table_name='user')
# sql_account_person_user = f"""`order`.user_id = :user_id"""
else:
sql_account_person_user = ''
if order_status in ['canceled', 'complete', 'in progress', 'started']:
data['status'] = order_status
sql_status = f"""AND `order`.status = :status"""
else:
sql_status = ''
if from_datetime and to_datetime:
data['from_datetime'] = from_datetime
data['to_datetime'] = to_datetime
sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime AND `order`.created_on <= :to_datetime"""
elif from_datetime:
data['from_datetime'] = from_datetime
sql_from_to_datetime = f"""AND `order`.created_on >= :from_datetime"""
elif to_datetime:
data['to_datetime'] = to_datetime
sql_from_to_datetime = f"""AND `order`.created_on <= :to_datetime"""
else:
sql_from_to_datetime = ''
if limit:
data['limit'] = limit
sql_limit = f"""LIMIT :limit"""
else:
sql_limit = ''
sql = f"""
SELECT `order`.id AS 'order_id', `order`.id_random AS 'order_id_random'
FROM `order` AS `order`
WHERE {sql_account_person_user}
{sql_status}
{sql_from_to_datetime}
ORDER BY `order`.created_on DESC, `order`.updated_on DESC
{sql_limit};
"""
if order_obj_li_result := sql_select(data=data, sql=sql, as_list=True):
order_obj_li = []
for order_obj in order_obj_li_result:
order_id = order_obj.get('order_id', None)
if order_obj := load_order_obj(order_id=order_id, inc_order_line_list=inc_order_line_list, inc_order_cfg=inc_order_cfg, inc_person_obj=inc_person_obj):
data = order_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
order_obj_li.append(data)
return mk_resp(data=order_obj_li)
else:
log.debug(order_obj_li_result)
return mk_resp(data=False, status_code=404, response=response)
# ### BEGIN ### API Order Routes ### get_order_obj() ###
# NOTE 2021-08-09: Use with rework of order_cart
# Updated 2021-08-07
@router.get('/order/{order_id}', response_model=Resp_Body_Base)
async def get_order_obj(
order_id: str = Path(min_length=11, max_length=22),
limit: int = 500,
enabled: str = 'enabled',
inc_order_line_list: bool = False,
inc_order_cfg: bool = False,
inc_person: bool = False,
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_obj := load_order_obj(
order_id = order_id,
limit = limit,
enabled = enabled,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
inc_order_line_list = inc_order_line_list,
inc_order_cfg = inc_order_cfg,
inc_person = inc_person,
):
log.debug(order_obj)
data = order_obj.dict(by_alias=by_alias, exclude_unset=False) # NOTE NOTE NOTE NOTE exclude_unset is forced to False for now. Will return more fields than is ideal. Need to create another Order_Line_Base. Probably Order_Line_OUT_Base
return mk_resp(data=data)
else:
return mk_resp(data=False, status_code=404, response=response) # Not Found
# ### END ### API Order Routes ### get_order_obj() ###
# ### BEGIN ### API Order ### get_obj_id_order_list() ###
# Updated 2021-12-13
@router.get('/{obj_type}/{obj_id}/order/list', response_model=Resp_Body_Base)
async def get_obj_id_order_list(
obj_type: str = Path(min_length=4, max_length=25), # Expects account or person
obj_id: str = Path(min_length=11, max_length=22),
from_datetime: datetime.datetime = None,
to_datetime: datetime.datetime = None,
inc_order_cfg: bool = False,
inc_order_line_list: bool = False,
# w_prod_type: str = 'all', # all, cont_edu_cert, event, fundraising, membership, etc
inc_person: bool = False,
status: str = 'closed', # open, locked, reopened?, closed (complete), canceled, other
enabled: str = 'enabled',
limit: int = 50,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
x_account_id: str = Header(..., min_length=11, max_length=22),
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if obj_type in ['account', 'person']:
if obj_id := redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type): pass
else: return mk_resp(data=None, status_code=404, response=response)
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
if order_rec_list_result := get_order_rec_list(
for_obj_type = obj_type,
for_obj_id = obj_id,
from_datetime = from_datetime,
to_datetime = to_datetime,
status = status,
enabled = enabled,
limit = limit,
):
order_result_list = []
for order_rec in order_rec_list_result:
if load_order_result := load_order_obj(
order_id = order_rec.get('order_id', None),
inc_order_cfg = inc_order_cfg,
inc_order_line_list = inc_order_line_list,
inc_person = inc_person,
enabled = enabled,
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
order_result_list.append(load_order_result)
else:
order_result_list.append(None)
response_data = order_result_list
elif isinstance(order_rec_list_result, list) or order_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data, response=response)
# ### END ### API Order ### get_obj_id_order_list() ###
# # ### BEGIN ### API Order ### get_account_obj_order_list() ###
# # Updated 2021-11-19
# @router.get('/account/{account_id}/order/list', response_model=Resp_Body_Base)
# async def get_account_id_order_list(
# account_id: str = Query(..., min_length=11, max_length=22),
# limit: int = 50,
# enabled: str = 'enabled',
# from_datetime: datetime.datetime = None,
# to_datetime: datetime.datetime = None,
# inc_order_cfg: bool = False,
# inc_order_line_list: bool = False,
# # inc_order_w_prod_type: str = 'all', # all, membership, fundraising, event, etc
# status: str = 'closed', # open, locked, reopened?, closed (complete), canceled, other
# x_account_id: str = Header(...),
# by_alias: Optional[bool] = True,
# exclude_unset: Optional[bool] = True,
# response: Response = Response,
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
# else: return mk_resp(data=None, status_code=404, response=response)
# # Updated 2021-06-28
# if order_rec_list_result := get_order_rec_list(
# for_obj_type = 'account',
# for_obj_id = account_id,
# limit = limit,
# enabled = enabled,
# from_datetime = from_datetime,
# to_datetime = to_datetime,
# status = status,
# ):
# order_result_list = []
# for order_rec in order_rec_list_result:
# if load_order_result := load_order_obj(
# order_id = order_rec.get('order_id', None),
# limit = limit,
# enabled = enabled,
# by_alias = by_alias,
# exclude_unset = exclude_unset,
# # model_as_dict = model_as_dict,
# inc_order_cfg = inc_order_cfg,
# inc_order_line_list = inc_order_line_list,
# ):
# order_result_list.append(load_order_result)
# else:
# order_result_list.append(None)
# response_data = order_result_list
# else:
# return mk_resp(data=False, status_code=400, response=response) # Bad Request
# return mk_resp(data=response_data)
# # ### END ### API Order ### get_account_obj_order_list() ###
# # ### BEGIN ### API Order ### get_person_obj_order_list() ###
# # Updated 2021-11-19
# @router.get('/person/{person_id}/order/list', response_model=Resp_Body_Base)
# async def get_person_id_order_list(
# person_id: str = Query(..., min_length=11, max_length=22),
# limit: int = 50,
# enabled: str = 'enabled',
# from_datetime: datetime.datetime = None,
# to_datetime: datetime.datetime = None,
# inc_order_cfg: bool = False,
# inc_order_line_list: bool = False,
# # inc_order_w_prod_type: str = 'all', # all, membership, fundraising, event, etc
# status: str = 'closed', # open, locked, reopened?, closed (complete), canceled, other
# x_account_id: str = Header(...),
# by_alias: Optional[bool] = True,
# exclude_unset: Optional[bool] = True,
# response: Response = Response,
# ):
# log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
# log.debug(locals())
# if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
# else: return mk_resp(data=None, status_code=404, response=response)
# # Updated 2021-06-28
# if order_rec_list_result := get_order_rec_list(
# for_obj_type = 'person',
# for_obj_id = person_id,
# limit = limit,
# enabled = enabled,
# from_datetime = from_datetime,
# to_datetime = to_datetime,
# status = status,
# ):
# order_result_list = []
# for order_rec in order_rec_list_result:
# if load_order_result := load_order_obj(
# order_id = order_rec.get('order_id', None),
# limit = limit,
# enabled = enabled,
# by_alias = by_alias,
# exclude_unset = exclude_unset,
# # model_as_dict = model_as_dict,
# inc_order_cfg = inc_order_cfg,
# inc_order_line_list = inc_order_line_list,
# ):
# order_result_list.append(load_order_result)
# else:
# order_result_list.append(None)
# response_data = order_result_list
# else:
# return mk_resp(data=False, status_code=400, response=response) # Bad Request
# return mk_resp(data=response_data)
# # ### END ### API Order ### get_person_obj_order_list() ###
# ### BEGIN ### API Order ### get_person_id_order_cart() ###
# NOTE 2021-08-09: Use with rework of order_cart. The most recent (hopefully only one) "open" order for a person.
# Updated 2021-11-19
@router.get('/person/{person_id}/order/cart', response_model=Resp_Body_Base)
async def get_person_id_order_cart(
person_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled',
inc_order_line_list: bool = False,
inc_order_cfg: bool = False,
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# Query to get the one "open" order status for a person ID
return False
# ### END ### API Order ### get_person_id_order_cart() ###
@router.delete('/order/{obj_id}', response_model=Resp_Body_Base)
async def delete_order_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result
# NOTE 2021-08-09: Use with rework of order_cart
# NOTE: The router needs to have the prefix (/order) removed.
@router.delete('/order/{order_id}/line/<order_line_id>/remove', response_model=Resp_Body_Base)
async def delete_order_line_obj_NOT_SURE(
order_id: str = Path(min_length=11, max_length=22),
obj: Order_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())

View File

@@ -0,0 +1,251 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.order_cart_methods import update_order_cart_obj, load_order_cart_obj
from app.models.order_cart_models import Order_Cart_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_order_cart_obj(
obj: Order_Cart_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order_cart'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
# Update 2021-08-02 (partially)
@router.patch('/{order_cart_id}', response_model=Resp_Body_Base)
async def patch_order_cart_obj(
order_cart_id: str = Path(min_length=11, max_length=22),
order_cart_obj: Order_Cart_Base = None,
repl_order_cart_line_list: Optional[bool] = False, # Replace all the lines instead of trying to update
# was repl_order_cart_line_list # NOTE: It was with out _list, just _li
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
inc_order_cart_line_list: Optional[bool] = True,
inc_order_cfg: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(order_cart_obj)
order_cart_obj_up_result = update_order_cart_obj(
order_cart_obj = order_cart_obj,
repl_order_cart_line_list = repl_order_cart_line_list,
)
if isinstance(order_cart_obj_up_result, int):
log.info(f'Order cart update and the result was an int: {order_cart_obj_up_result}')
pass
elif isinstance(order_cart_obj_up_result, bool) and order_cart_obj_up_result:
log.info(f'Order cart update and the result was an bool: {order_cart_obj_up_result}')
pass
elif isinstance(order_cart_obj_up_result, bool) and not order_cart_obj_up_result:
log.error(f'Order cart update and the result was an bool: {order_cart_obj_up_result}')
return mk_resp(data=False, status_code=500, response=response) # Internal Server Error
if return_obj:
if order_cart_obj := load_order_cart_obj(
order_cart_id = order_cart_id,
inc_order_cart_line_list = inc_order_cart_line_list,
inc_order_cfg = inc_order_cfg
):
data = order_cart_obj.dict(by_alias=True, exclude_unset=False)
return mk_resp(data=data)
else:
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
return mk_resp(data=True)
@router.get('/list', response_model=Resp_Body_Base)
async def get_order_cart_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order_cart'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# Look up is only for account, order, person, or user records
@router.get('/lookup', response_model=Resp_Body_Base)
async def lookup_order_cart_obj(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[Union[int,str]] = None,
inc_order_cart_line_list: Optional[bool] = True,
inc_order_cfg: Optional[bool] = True,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order_cart'
base_name = Order_Cart_Base
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=response) # Not Found
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
data = {}
as_list = False
if for_obj_type == 'account' and for_obj_id:
data['account_id'] = for_obj_id
sql_where_for_obj_type = """`order_cart`.account_id = :account_id"""
sql_limit = ''
as_list = True
elif for_obj_type == 'order' and for_obj_id:
data['order_id'] = for_obj_id
sql_where_for_obj_type = """`order_cart`.order_id = :order_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'person' and for_obj_id:
data['person_id'] = for_obj_id
sql_where_for_obj_type = """`order_cart`.person_id = :person_id"""
sql_limit = 'LIMIT 1'
elif for_obj_type == 'user' and for_obj_id:
data['user_id'] = for_obj_id
sql_where_for_obj_type = """`order_cart`.user_id = :user_id"""
sql_limit = 'LIMIT 1'
else:
log.debug(f'Object type={for_obj_type}; Object ID={for_obj_id}')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
sql = f"""
SELECT id AS 'order_cart_id', id_random AS 'order_cart_id_random'
FROM `order_cart` AS `order_cart`
WHERE {sql_where_for_obj_type}
{sql_limit}
"""
# This will return a list if selecting by account ID
order_cart_obj_result = sql_select(data=data, sql=sql, as_list=as_list)
if isinstance(order_cart_obj_result, dict):
order_cart_id = order_cart_obj_result.get('order_cart_id', None)
order_cart_id_random = order_cart_obj_result.get('order_cart_id_random', None)
if order_cart_obj := load_order_cart_obj(
order_cart_id = order_cart_id,
inc_order_cart_line_list = inc_order_cart_line_list,
inc_order_cfg = inc_order_cfg,
):
data = order_cart_obj.dict(by_alias=True, exclude_unset=False)
return mk_resp(data=data)
else:
return mk_resp(data=False, status_code=404, response=response) # Not Found
elif isinstance(order_cart_obj_result, list):
order_cart_obj_li = []
for order_cart_obj in order_cart_obj_result:
order_cart_id = order_cart_obj.get('order_cart_id', None)
order_cart_obj_li.append(
load_order_cart_obj(
order_cart_id = order_cart_id,
inc_order_cart_line_list = inc_order_cart_line_list,
inc_order_cfg = inc_order_cfg,
)
)
data = order_cart_obj_li
return mk_resp(data=data)
else:
log.debug(order_cart_obj_result)
return mk_resp(data=False, status_code=404, response=response) # Not Found
# ### BEGIN ### API Order Cart Routes ### get_order_cart_obj() ###
# Updated 2021-08-07
@router.get('/{order_cart_id}', response_model=Resp_Body_Base)
async def get_order_cart_obj(
order_cart_id: str = Path(min_length=11, max_length=22),
limit: int = 500,
enabled: str = 'enabled',
inc_order_cart_line_list: bool = False,
inc_order_cfg: bool = False,
x_account_id: str = Header(...),
by_alias: bool = True,
exclude_unset: bool = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_cart_obj := load_order_cart_obj(
order_cart_id = order_cart_id,
limit = limit,
enabled = enabled,
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
inc_order_cart_line_list = inc_order_cart_line_list,
inc_order_cfg = inc_order_cfg,
):
data = order_cart_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset)
return mk_resp(data=data)
else:
return mk_resp(data=False, status_code=404, response=response) # Not Found
# ### END ### API Order Cart Routes ### get_order_cart_obj() ###
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_order_cart_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'order_cart'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,126 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from app.config import settings
from app.db_sql import *
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.order_line_methods import get_order_line_rec_list, load_order_obj_line, load_order_obj_line_full_detail
from app.models.response_models import Resp_Body_Base, mk_resp
router = APIRouter()
# ### BEGIN ### API Order Line ### get_obj_id_order_line_list() ###
# Updated 2022-01-04
@router.get('/{obj_type}/{obj_id}/order/line/list', response_model=Resp_Body_Base)
async def get_obj_id_order_line_list(
obj_type: str = Path(min_length=4, max_length=25), # Expects account or order or person
obj_id: str = Path(min_length=11, max_length=22),
from_datetime: datetime.datetime = None,
to_datetime: datetime.datetime = None,
prod_type: str = 'all', # all, cont_edu_cert, event, fundraising, membership, etc
status: str = 'closed', # open, locked, reopened?, closed (complete), canceled, other
full_detail: bool = False, # Uses a different view: v_order_line_full_detail
# enabled: str = 'enabled',
limit: int = 50,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
create_export: Optional[bool] = False,
x_account_id: str = Header(..., min_length=11, max_length=22),
response: Response = Response,
):
log.setLevel(logging.INFO) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if obj_type in ['account', 'order', 'person']:
if obj_id := redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type): pass
else: return mk_resp(data=None, status_code=404, response=response)
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
if order_line_rec_list_result := get_order_line_rec_list(
for_obj_type = obj_type,
for_obj_id = obj_id,
from_datetime = from_datetime,
to_datetime = to_datetime,
product_for_type = prod_type,
status = status,
full_detail = full_detail,
# enabled = enabled,
limit = limit,
):
order_line_result_list = []
data_dict_list_for_export = []
for order_line_rec in order_line_rec_list_result:
if not full_detail:
if load_order_line_result := load_order_obj_line(
order_line_id = order_line_rec.get('order_line_id', None),
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
order_line_result_list.append(load_order_line_result)
else:
order_line_result_list.append(None)
else: # Uses a different view: v_order_line_full_detail
if load_order_line_result := load_order_obj_line_full_detail(
order_line_rec = order_line_rec,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = False,
):
if create_export:
data_dict = load_order_line_result.dict(by_alias=by_alias, exclude_unset=exclude_unset)
data_dict_list_for_export.append(data_dict)
order_line_result_list.append(load_order_line_result)
else:
order_line_result_list.append(None)
response_data = order_line_result_list
elif isinstance(order_line_rec_list_result, list) or order_line_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=None, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
if create_export:
# column_name_li = ['order_id_random', 'order_line_id_random', '', 'product_name', 'quantity', 'amount', 'dollar_amount', 'person_email']
# column_name_li = ['order_line_id_random', 'order_id_random', 'product_id_random', 'product_type', 'product_name', 'product_unit_price', 'product_recurring', 'curr_product_id_random', 'curr_product_type', 'curr_product_type_name', 'curr_product_name', 'name', 'quantity', 'amount', 'dollar_amount', 'recurring', 'message', 'person_id_random', 'person_given_name', 'person_family_name', 'person_display_name', 'person_full_name', 'person_contact_email', 'person_contact_cc_email', 'person_contact_phone_mobile', 'person_contact_phone_home', 'person_contact_phone_office', 'person_contact_phone_land', 'person_contact_phone_fax', 'person_contact_phone_other', 'person_contact_address_name', 'person_contact_address_organization_name', 'person_contact_address_line_1', 'person_contact_address_line_2', 'person_contact_address_line_3', 'person_contact_address_city', 'person_contact_address_country_subdivision_code', 'person_contact_address_state_province', 'person_contact_address_postal_code', 'person_contact_address_country_alpha_2_code', 'person_contact_address_country_name', 'person_contact_address_country', 'order_status', 'order_created_on', 'order_updated_on', 'created_on', 'updated_on']
column_name_li = ['order_line_id_random', 'order_id_random', 'product_id_random', 'product_type', 'product_name', 'quantity', 'amount', 'dollar_amount', 'message',
'person_id_random', 'person_given_name', 'person_family_name', 'person_display_name', 'person_full_name', 'person_contact_email', 'person_contact_cc_email',
'person_contact_address_name', 'person_contact_address_organization_name', 'person_contact_address_line_1', 'person_contact_address_line_2', 'person_contact_address_line_3',
'person_contact_address_city', 'person_contact_address_country_subdivision_code', 'person_contact_address_state_province', 'person_contact_address_postal_code',
'person_contact_address_country_alpha_2_code', 'person_contact_address_country_name', 'person_contact_address_country',
'order_status',
'order_created_on', 'order_updated_on',
# 'order_started_on', 'order_last_updated_on'
'created_on', 'updated_on'
]
# column_name_li = []
datetime_format='%Y-%m-%d_%H%M'
# current_datetime = datetime.datetime.now() # Servers timezone (Eastern)
current_datetime_utc = datetime.datetime.utcnow()
current_datetime_utc = current_datetime_utc.strftime(datetime_format)
filename = f'order_line_list_{current_datetime_utc}'
if result := create_export_file(data_dict_list=data_dict_list_for_export, column_name_li=column_name_li, subdir_path='order_line', filename=filename, export_type='Excel'):
tmp_file_path = result
else:
log.error('Something went wrong while creating or saving the export file')
tmp_file_path = result
else: tmp_file_path = None
return mk_resp(data=response_data, tmp_file_path=tmp_file_path, response=response)
# ### END ### API Order Line ### get_obj_id_order_line_list() ###

View File

@@ -0,0 +1,480 @@
import datetime
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from app.config import settings
from app.db_sql import *
from app.routers.api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.order_methods import create_order_obj, update_order_obj, get_order_rec_list, load_order_obj, save_order_obj
from app.methods.order_line_methods import create_order_obj_line, update_order_obj_line, load_order_obj_line
from app.models.response_models import Resp_Body_Base, mk_resp
from app.models.order_models_v3 import Order_Base
from app.models.order_line_models_v3 import Order_Line_Base
router = APIRouter()
# ### BEGIN ### API Order Routers ### post_order_obj() ###
# Updated 2022-01-18
@router.post('/v3/order', response_model=Resp_Body_Base)
@router.post('/v3/person/{person_id}/order', response_model=Resp_Body_Base)
async def post_order_obj(
order_obj: Order_Base,
person_id: str = Path(min_length=11, max_length=22),
inc_address: bool = False,
inc_contact: bool = False,
inc_order_line_list: bool = True,
inc_person: bool = False,
return_obj: bool = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
# elif person_id is None: pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The person ID was invalid or not found.')
# ### SECTION ### Process data
if order_id := create_order_obj(
account_id = commons.x_account_id,
person_id = person_id,
order_dict_obj = order_obj,
): pass
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Something failed while processing the data.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_order_obj_result := load_order_obj(
order_id = order_id,
inc_address = inc_address,
inc_contact = inc_contact,
inc_order_line_list = inc_order_line_list,
inc_person = inc_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset):
log.info('Loading successful. Returning result')
log.debug(load_order_obj_result)
return mk_resp(data=load_order_obj_result, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
else:
order_id_random = get_id_random(record_id=order_id, table_name='order')
data = {}
data['order_id'] = order_id
data['order_id_random'] = order_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Order Routers ### post_order_obj() ###
# ### BEGIN ### API Order Routers ### patch_order_obj() ###
# Updated 2022-01-18
@router.patch('/v3/order/{order_id}', response_model=Resp_Body_Base)
# @router.patch('/v3/person/{person_id}/order/{order_id}', response_model=Resp_Body_Base)
async def patch_order_obj(
order_obj: Order_Base,
order_id: str = Path(min_length=11, max_length=22),
# person_id: str = Query(None, min_length=11, max_length=22),
inc_address: bool = False,
inc_contact: bool = False,
inc_order_line_list: bool = True,
inc_person: bool = False,
return_obj: Optional[bool] = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
order_id_random = order_id # This is used later for the response data
# person_id_random = person_id # This is used later for the response data
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
# if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
# elif person_id is None: pass
# else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The person ID was invalid or not found.')
# ### SECTION ### Process data
if update_order_obj_result := update_order_obj(
order_id = order_id,
order_dict_obj = order_obj,
# person_id = person_id,
): pass
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Something failed while processing the data.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_order_obj_result := load_order_obj(
order_id = order_id,
inc_address = inc_address,
inc_contact = inc_contact,
inc_order_line_list = inc_order_line_list,
inc_person = inc_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset):
log.info('Loading successful. Returning result')
log.debug(load_order_obj_result)
return mk_resp(data=load_order_obj_result, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
else:
data = {}
data['order_id'] = order_id
data['order_id_random'] = order_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Order Routers ### patch_order_obj() ###
# ### BEGIN ### API Order Routers ### patch_order_obj_add_line() ###
# Updated 2022-01-18
@router.patch('/v3/order/{order_id}/line/add', response_model=Resp_Body_Base)
async def patch_order_obj_add_line(
order_line_obj: Order_Line_Base,
order_id: str = Path(min_length=11, max_length=22),
# inc_order: bool = False,
inc_order_line_list: bool = True,
return_obj: Optional[bool] = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
order_id_random = order_id # This is used later for the response data
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
# ### SECTION ### Process data
if order_line_id := add_order_obj_line(
order_id = order_id,
order_line_dict_obj = order_line_obj,
): pass
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Something failed while processing the data.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_order_obj_result := load_order_obj(
order_id = order_id,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_order_line_list = inc_order_line_list,
# inc_person = inc_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset):
log.info('Loading successful. Returning result')
log.debug(load_order_obj_result)
return mk_resp(data=load_order_obj_result, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
else:
order_line_id = order_line_add_result
order_line_id_random = get_id_random(record_id=order_line_id, table_name='order_line')
data = {}
data['order_id'] = order_id
data['order_id_random'] = order_id_random
data['order_line_id'] = order_line_id
data['order_line_id_random'] = order_line_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Order Routers ### patch_order_obj_add_line() ###
# ### BEGIN ### API Order Routers ### patch_order_obj_update_line() ###
# Updated 2022-01-18
@router.patch('/v3/order/{order_id}/line/{order_line_id}/update', response_model=Resp_Body_Base)
async def patch_order_obj_update_line(
order_obj: Order_Line_Base,
order_id: str = Path(min_length=11, max_length=22),
order_line_id: str = Path(min_length=11, max_length=22),
# inc_order: bool = False,
inc_order_line_list: bool = True,
return_obj: Optional[bool] = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
order_id_random = order_id # This is used later for the response data
order_line_id_random = order_line_id # This is used later for the response data
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
if order_line_id := redis_lookup_id_random(record_id_random=order_line_id, table_name='order_line'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order line ID was invalid or not found.')
# ### SECTION ### Process data
if update_order_obj_line_result := update_order_obj_line(
order_line_id = order_line_id,
order_line_dict_obj = order_line_obj,
): pass
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Something failed while processing the data.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_order_obj_result := load_order_obj(
order_id = order_id,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_order_line_list = inc_order_line_list,
# inc_person = inc_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset):
log.info('Loading successful. Returning result')
log.debug(order_dict)
return mk_resp(data=order_dict, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
else:
data = {}
data['order_id'] = order_id
data['order_id_random'] = order_id_random
data['order_line_id'] = order_line_id
data['order_line_id_random'] = order_line_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Order Routers ### patch_order_obj_update_line() ###
# ### BEGIN ### API Order Routers ### patch_order_obj_remove_line() ###
# Updated 2022-01-18
@router.patch('/v3/order/{order_id}/line/{order_line_id}/remove', response_model=Resp_Body_Base)
async def patch_order_obj_remove_line(
order_obj: Order_Line_Base,
order_id: str = Path(min_length=11, max_length=22),
order_line_id: str = Path(min_length=11, max_length=22),
# inc_order: bool = False,
inc_order_line_list: bool = True,
return_obj: Optional[bool] = True,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
# ### SECTION ### Secondary data validation
order_id_random = order_id # This is used later for the response data
order_line_id_random = order_line_id # This is used later for the response data
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
if order_line_id := redis_lookup_id_random(record_id_random=order_line_id, table_name='order_line'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order line ID was invalid or not found.')
# ### SECTION ### Process data
if remove_order_obj_line_result := remove_order_obj_line(
order_line_id = order_line_id,
): pass
else:
return mk_resp(data=False, status_code=400, response=commons.response, status_message='Something failed while processing the data.') # Bad Request
# ### SECTION ### Return successful results
if return_obj:
if load_order_obj_result := load_order_obj(
order_id = order_id,
# inc_address = inc_address,
# inc_contact = inc_contact,
inc_order_line_list = inc_order_line_list,
# inc_person = inc_person,
).dict(by_alias=commons.by_alias, exclude_unset=commons.exclude_unset):
log.info('Loading successful. Returning result')
log.debug(order_dict)
return mk_resp(data=order_dict, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
else:
data = {}
data['order_id'] = order_id
data['order_id_random'] = order_id_random
data['order_line_id'] = order_line_id
data['order_line_id_random'] = order_line_id_random
return mk_resp(data=data, response=commons.response)
# ### END ### API Order Routers ### patch_order_obj_remove_line() ###
# ### BEGIN ### API Order Routers ### get_order_obj_li() ###
# Updated 2022-01-18
@router.get('/v3/{for_obj_type}/{for_obj_id}/order/list', response_model=Resp_Body_Base)
async def get_order_obj_li(
for_obj_type: str = Path(min_length=2, max_length=50),
for_obj_id: str = Path(min_length=11, max_length=22),
order_status: str = 'complete',
order_checkout_status: str = 'complete',
from_datetime: datetime.datetime = None,
to_datetime: datetime.datetime = None,
inc_address: bool = False,
inc_contact: bool = False,
inc_order_cfg: bool = False,
inc_order_line_list: bool = False,
inc_person: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if obj_type in ['account', 'person']: pass
else: return mk_resp(data=False, status_code=400, response=response, status_message='The object type passed was invalid or not found. Expecting "account" or "person".') # Bad Request
if obj_type_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=False, status_code=404, response=commons.response) # Not Found
if get_order_rec_list_result := get_order_rec_list(
for_obj_type = for_obj_type,
for_obj_id = for_obj_id,
from_datetime = from_datetime,
to_datetime = to_datetime,
status = order_status,
# checkout_status = order_checkout_status,
enabled = commons.enabled,
limit = commons.limit,
offset = commons.offset,
):
order_obj_list = []
for order_rec in get_order_rec_list_result:
if load_order_obj_result := load_order_obj(
order_id = order_rec.get('order_id'),
inc_address = inc_address,
inc_contact = inc_contact,
inc_order_cfg = inc_order_cfg,
inc_order_line_list = inc_order_line_list,
inc_person = inc_person,
enabled = commons.enabled,
limit = commons.limit,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = model_as_dict,
):
log.debug(load_order_obj_result)
order_obj_list.append(load_order_obj_result)
else:
order_obj_list.append(None)
log.info('Loading successful. Returning result')
log.debug(order_obj_list)
return mk_resp(data=order_obj_list, response=commons.response)
elif isinstance(get_order_rec_list_result, list) or get_order_rec_list_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Order Routers ### get_order_obj_li() ###
# ### BEGIN ### API Order Routes ### get_order_obj() ###
# NOTE 2021-08-09: Use with rework of order_cart
# Updated 2022-12-18
@router.get('/v3/order/{order_id}', response_model=Resp_Body_Base)
async def get_order_obj(
order_id: str = Path(min_length=11, max_length=22),
inc_address: bool = False,
inc_contact: bool = False,
inc_order_cfg: bool = False,
inc_order_line_list: bool = False,
inc_person: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
if load_order_obj_result := load_order_obj(
order_id = order_id,
inc_address = inc_address,
inc_contact = inc_contact,
inc_order_cfg = inc_order_cfg,
inc_order_line_list = inc_order_line_list,
inc_person = inc_person,
limit = commons.limit,
enabled = commons.enabled,
by_alias = commons.by_alias,
exclude_unset = commons.exclude_unset,
# model_as_dict = model_as_dict,
):
log.debug(load_order_obj_result)
order_dict = load_order_obj_result.dict(by_alias=commons.by_alias, exclude_unset=False) # NOTE NOTE NOTE NOTE exclude_unset is forced to False for now. Will return more fields than is ideal. Need to create another Order_Line_Base. Probably Order_Line_OUT_Base
log.info('Loading successful. Returning result')
return mk_resp(data=order_dict, response=commons.response)
elif isinstance(load_order_obj_result, list) or load_order_obj_result is None: # Empty list or None
return mk_resp(data=None, status_code=404, response=commons.response) # Not Found
else:
return mk_resp(data=False, status_code=400, response=commons.response) # Bad Request
# ### END ### API Order Routes ### get_order_obj() ###
# ### BEGIN ### API Order ### get_person_id_order_cart() ###
# NOTE 2021-08-09: Use with rework of order_cart. The most recent (hopefully only one) "open" order for a person.
# Updated 2022-12-18
@router.get('/v3/person/{person_id}/order/cart', response_model=Resp_Body_Base)
async def get_person_id_order_cart(
person_id: str = Path(min_length=11, max_length=22),
enabled: str = 'enabled',
inc_order_line_list: bool = False,
inc_order_cfg: bool = False,
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if person_id := redis_lookup_id_random(record_id_random=person_id, table_name='person'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The person ID was invalid or not found.')
# Query to get the one "open" order status for a person ID
return False
# ### END ### API Order ### get_person_id_order_cart() ###
# ### BEGIN ### API Order Routers ### delete_order_obj() ###
# Updated 2022-01-18
@router.delete('/v3/order/{order_id}', response_model=Resp_Body_Base)
async def delete_order_obj(
order_id: str = Path(min_length=11, max_length=22),
commons: Common_Route_Params = Depends(common_route_params),
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_id := redis_lookup_id_random(record_id_random=order_id, table_name='order'): pass
else: return mk_resp(data=None, status_code=404, response=commons.response, status_message='The order ID was invalid or not found.')
obj_type = 'order'
result = delete_obj_template(
obj_type = obj_type,
obj_id = obj_id,
)
return result
# ### END ### API Order Routers ### delete_order_obj() ###

195
app/routers/archive/post.py Normal file
View File

@@ -0,0 +1,195 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.post_methods import get_post_rec_list, load_post_obj
from app.models.post_models import Post_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/post', response_model=Resp_Body_Base)
async def post_post_obj(
obj: Post_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/post/{obj_id}', response_model=Resp_Body_Base)
async def patch_post_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Post_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/post/list', response_model=Resp_Body_Base)
async def get_post_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
# ### BEGIN ### API Post ### get_account_obj_post_list() ###
# Updated 2021-12-13
@router.get('/account/{account_id}/post/list', response_model=Resp_Body_Base)
async def get_account_obj_post_list(
account_id: str = Path(min_length=11, max_length=22),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
archive_on: datetime.datetime = None,
inc_account_cfg: bool = False,
inc_address: bool = False, # Under contact
inc_contact: bool = False,
inc_person: bool = False,
inc_post_comment_list: bool = False,
inc_user: bool = False,
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else:
return mk_resp(data=None, status_code=404)
response_data = None
# Updated 2021-12-13
if post_rec_list_result := get_post_rec_list(
for_obj_type = 'account',
for_obj_id = account_id,
limit = limit,
enabled = enabled,
archive_on = archive_on,
):
post_result_list = []
for post_rec in post_rec_list_result:
if load_post_result := load_post_obj(
post_id = post_rec.get('post_id'),
limit = limit,
by_alias = by_alias,
exclude_unset = exclude_unset,
enabled = enabled,
inc_person = inc_person,
inc_post_comment_list = inc_post_comment_list,
inc_user = inc_user,
):
post_result_list.append(load_post_result)
else:
post_result_list.append(None)
response_data = post_result_list
elif isinstance(post_rec_list_result, list) or post_rec_list_result is None: # Empty list or None
log.info('No results')
return mk_resp(data=False, status_code=404, response=response) # Not Found
else:
log.warning('Likely bad request')
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
# ### END ### API Post ### get_account_obj_post_list() ###
@router.get('/post/{obj_id}', response_model=Resp_Body_Base)
async def get_post_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.delete('/post/{obj_id}', response_model=Resp_Body_Base)
async def delete_post_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,131 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.models.post_comment_models import Post_Comment_Base
from app.models.response_models import *
router = APIRouter()
@router.post('', response_model=Resp_Body_Base)
async def post_post_comment_obj(
obj: Post_Comment_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post_comment'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/{obj_id}', response_model=Resp_Body_Base)
async def patch_post_comment_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Post_Comment_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post_comment'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/list', response_model=Resp_Body_Base)
async def get_post_comment_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post_comment'
result = get_obj_li_template(
obj_type=obj_type,
for_obj_type=for_obj_type,
for_obj_id=for_obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/{obj_id}', response_model=Resp_Body_Base)
async def get_post_comment_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post_comment'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
)
return result
@router.delete('/{obj_id}', response_model=Resp_Body_Base)
async def delete_post_comment_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'post_comment'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result

View File

@@ -0,0 +1,203 @@
import datetime
#from datetime import datetime, time, timedelta
from fastapi import APIRouter, Body, Depends, Header, HTTPException, Path, Query, Response, status
from pydantic import BaseModel, EmailStr, Field
from typing import Dict, List, Optional, Set, Union
from app.lib_general import *
from ..log import *
from app.config import settings
from app.db_sql import *
from .api_crud import delete_obj_template, get_obj_template, get_obj_li_template, patch_obj_template, post_obj_template
from app.methods.product_methods import get_product_rec_list, load_product_obj
from app.models.product_models import Product_Base
from app.models.response_models import *
router = APIRouter()
@router.post('/product', response_model=Resp_Body_Base)
async def post_product_obj(
obj: Product_Base,
x_account_id: str = Header(...),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'product'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
result = post_obj_template(
obj_type=obj_type,
data=obj_data_dict,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.patch('/product/{obj_id}', response_model=Resp_Body_Base)
async def patch_product_obj(
obj_id: str = Path(min_length=11, max_length=22),
obj: Product_Base = None,
x_account_id: Optional[str] = Header(..., ),
return_obj: Optional[bool] = True,
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'product'
obj_data_dict = obj.dict(by_alias=False, exclude_unset=True)
obj_data_dict['id'] = redis_lookup_id_random(record_id_random=obj_id, table_name=obj_type)
obj_data_dict['id_random'] = obj_id
result = patch_obj_template(
obj_type=obj_type,
data=obj_data_dict,
obj_id=obj_id,
return_obj=True,
by_alias=True,
exclude_unset=True,
)
return result
@router.get('/product/list', response_model=Resp_Body_Base)
async def get_product_obj_li(
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
prod_type: Optional[str] = Query(None, min_length=2, max_length=50),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: return mk_resp(data=None, status_code=404)
# Updated 2021-07-01
if product_rec_list_result := get_product_rec_list(
for_obj_type = for_obj_type,
for_obj_id = for_obj_id,
prod_type = prod_type,
limit = limit,
enabled = enabled,
):
product_result_list = []
for product_rec in product_rec_list_result:
if load_product_result := load_product_obj(
product_id = product_rec.get('product_id', None),
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
product_result_list.append(load_product_result)
else:
product_result_list.append(None)
response_data = product_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
@router.get('/account/{account_id}/product/list', response_model=Resp_Body_Base)
async def get_account_product_obj_li(
account_id: str = Path(min_length=11, max_length=22),
for_obj_type: Optional[str] = Query(None, min_length=2, max_length=50),
for_obj_id: Optional[str] = Query(None, min_length=1, max_length=22),
prod_type: Optional[str] = Query(None, min_length=2, max_length=50),
limit: int = 500, # For now this covers any included objects or object lists
enabled: str = 'enabled', # For now this covers any included objects or object lists
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if account_id := redis_lookup_id_random(record_id_random=account_id, table_name='account'): pass
else: return mk_resp(data=None, status_code=404)
if for_obj_id := redis_lookup_id_random(record_id_random=for_obj_id, table_name=for_obj_type): pass
else: pass
# Updated 2021-07-01
if product_rec_list_result := get_product_rec_list(
account_id = account_id,
for_obj_type = for_obj_type,
for_obj_id = for_obj_id,
prod_type = prod_type,
limit = limit,
enabled = enabled,
):
product_result_list = []
for product_rec in product_rec_list_result:
if load_product_result := load_product_obj(
product_id = product_rec.get('product_id', None),
by_alias = by_alias,
exclude_unset = exclude_unset,
# model_as_dict = model_as_dict,
):
product_result_list.append(load_product_result)
else:
product_result_list.append(None)
response_data = product_result_list
else:
return mk_resp(data=False, status_code=400, response=response) # Bad Request
return mk_resp(data=response_data)
@router.get('/product/{obj_id}', response_model=Resp_Body_Base)
async def get_product_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
by_alias: Optional[bool] = True,
exclude_unset: Optional[bool] = True,
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'product'
result = get_obj_template(
obj_type=obj_type,
obj_id=obj_id,
by_alias=True,
exclude_unset=True,
response=response,
)
return result
@router.delete('/product/{obj_id}', response_model=Resp_Body_Base)
async def delete_product_obj(
obj_id: str = Path(min_length=11, max_length=22),
x_account_id: str = Header(...),
response: Response = Response,
):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
obj_type = 'product'
result = delete_obj_template(
obj_type=obj_type,
obj_id=obj_id,
)
return result