General clean up of models and methods.

This commit is contained in:
Scott Idem
2021-05-28 01:30:56 -04:00
parent 29692ac78e
commit e46032a00b
27 changed files with 161 additions and 101 deletions

View File

@@ -0,0 +1,58 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select
from ..models.address_models import Address_Base
# ### BEGIN ### API Address Methods ### create_address_obj() ###
def create_address_obj(address_obj_new:Address_Base):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if not address_obj_new:
return False
address_obj_data = address_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'created_on', 'updated_on'})
if address_obj_in_result := sql_insert(data=address_obj_data, table_name='address', rm_id_random=True, id_random_length=8): pass
else:
return False
log.debug(address_obj_in_result)
address_id = address_obj_in_result
log.debug(f'Returning the new address_id: {address_id}')
return address_id
# ### END ### API Address Methods ### create_address_obj() ###
# ### BEGIN ### API Address Methods ### load_address_obj() ###
def load_address_obj(address_id:int|str) -> Address_Base|bool:
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 False
if address_rec := sql_select(table_name='v_address', record_id=address_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(address_rec)
else:
return False
try:
address_obj = Address_Base(**address_rec)
log.debug(address_obj)
except ValidationError as e:
log.error(e.json())
return False
return address_obj
# ### END ### API Address Methods ### load_address_obj() ###

View File

@@ -0,0 +1,85 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
from ..methods.address_methods import create_address_obj
from ..models.contact_models import Contact_Base
# ### BEGIN ### API Contact Methods ### create_contact_obj() ###
def create_contact_obj(contact_obj_new:Contact_Base):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if not contact_obj_new:
return False
contact_obj_data = contact_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'address', 'created_on', 'updated_on'})
if contact_obj_in_result := sql_insert(data=contact_obj_data, table_name='contact', rm_id_random=True, id_random_length=8): pass
else:
return False
log.debug(contact_obj_in_result)
contact_id = contact_obj_in_result
if contact_obj_new.address:
address_obj_new = contact_obj_new.address
address_obj_new.for_type = 'contact'
address_obj_new.for_id = contact_id
create_address_obj_result = create_address_obj(address_obj_new=address_obj_new)
if isinstance(create_address_obj_result, int):
address_id = create_address_obj_result
# Need to update the contact with the new address_id
contact_obj_up = {}
contact_obj_up['id'] = contact_id
contact_obj_up['address_id'] = address_id
if contact_obj_up_result := sql_update(data=contact_obj_up, table_name='contact'): pass
else:
return False
log.debug(contact_obj_up_result)
else:
log.debug(f'No address_id was returned when tyring to create_address_obj(): {create_address_obj_result}')
address_id = None
log.debug(f'Returning the new contact_id: {contact_id}')
return contact_id
# ### END ### API Contact Methods ### create_contact_obj() ###
# ### BEGIN ### API Contact Methods ### load_contact_obj() ###
def load_contact_obj(contact_id:int|str, inc_address:bool=False) -> Contact_Base|bool:
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if contact_id := redis_lookup_id_random(record_id_random=contact_id, table_name='contact'): pass
else: return False
if contact_rec := sql_select(table_name='v_contact', record_id=contact_id):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(contact_rec)
if inc_address:
if address_rec := sql_select(table_name='v_address', field_name='address_id', field_value=contact_rec.get('address_id', None)):
contact_rec['address'] = address_rec
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(address_rec)
else:
return False
try:
contact_obj = Contact_Base(**contact_rec)
log.debug(contact_obj)
except ValidationError as e:
log.error(e.json())
return False
return contact_obj
# ### END ### API Contact Methods ### load_contact_obj() ###

View File

@@ -7,8 +7,9 @@ from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, v
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
from ..models.person_methods import load_person_obj
from ..models.user_methods import load_user_obj
from ..methods.person_methods import load_person_obj
from ..methods.user_methods import load_user_obj
from ..models.event_person_models import Event_Person_New_Base, Event_Person_Base

View File

@@ -0,0 +1,275 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert_or_update, sql_insert, sql_update, sql_select
from ..models.order_cart_model import Order_Cart_Base
def update_order_cart_obj(order_cart_obj:Order_Cart_Base, repl_order_cart_line_li:bool=False):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_cart_obj.account_id_random and (order_cart_obj.person_id_random or order_cart_obj.user_id_random):
log.info(f'An account.id_random {order_cart_obj.account_id_random} was passed. And either a person.id_random {order_cart_obj.person_id_random} or user.id_random {order_cart_obj.user_id_random} was passed. We can update the order cart.')
elif order_cart_obj.account_id_random and not (order_cart_obj.person_id_random or order_cart_obj.user_id_random):
log.info(f'An account.id_random {order_cart_obj.account_id_random} was passed. A person.id_random {order_cart_obj.person_id_random} or user.id_random {order_cart_obj.user_id_random} was not passed. We can update the order cart without one of those.')
else:
log.error('An account ID. A person ID or user ID is not required until starting to process an order.')
return False
#if order_cart_id := redis_lookup_id_random(record_id_random=order_cart_id_random, table_name='order_cart'): pass
#else: return False
order_cart_id_random = order_cart_obj.id_random # id_random because can't ref the alias
log.setLevel(logging.DEBUG)
log.debug(order_cart_obj.id)
log.debug(order_cart_id_random)
if order_cart_id := redis_lookup_id_random(record_id_random=order_cart_id_random, table_name='order_cart'): pass
else: return False
log.setLevel(logging.DEBUG)
log.info('Loop through lines to update and calculate totals')
# Calculate totals
order_cart_total_amount:int = 0
order_cart_total_quantity:int = 0
for order_cart_line_obj in order_cart_obj.order_cart_line_li:
log.debug(order_cart_line_obj)
order_cart_line_obj.order_cart_id = order_cart_id
order_cart_line_obj.order_cart_id_random = order_cart_id_random
order_cart_line_obj_data = order_cart_line_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'product_type_id', 'product_type', 'created_on', 'updated_on'})
log.setLevel(logging.DEBUG)
log.debug(order_cart_line_obj_data)
data = {}
data['order_cart_id_random'] = order_cart_id_random
data['product_id_random'] = order_cart_line_obj.product_id_random
sql_select_result = sql_select(table_name='order_cart_line', data=data, rm_id_random=True)
log.setLevel(logging.DEBUG)
log.debug(sql_select_result)
if sql_select_result:
log.info('A matching order cart line was found. Update...')
if order_cart_line_obj_up_result := sql_update(data=order_cart_line_obj_data, table_name='order_cart_line', record_id=sql_select_result.get('id'), rm_id_random=True, id_random_length=8): pass
else:
log.error('Something went wrong while trying to update an order cart line record.')
return False
else:
log.info('A matching order cart line was not found. Insert...')
if order_cart_line_obj_in_result := sql_insert(data=order_cart_line_obj_data, table_name='order_cart_line', rm_id_random=True, id_random_length=8): pass
else:
log.error('Something went wrong while trying to insert an order cart line record.')
return False
order_cart_total_amount += order_cart_line_obj.quantity * order_cart_line_obj.amount
order_cart_total_quantity += order_cart_line_obj.quantity
order_cart_obj_new = {}
order_cart_obj_new['id_random'] = order_cart_id_random
order_cart_obj_new['account_id_random'] = order_cart_obj.account_id_random
order_cart_obj_new['person_id_random'] = order_cart_obj.person_id_random
order_cart_obj_new['user_id_random'] = order_cart_obj.person_id_random
order_cart_obj_new['order_id_random'] = order_cart_obj.order_id_random
order_cart_obj_new['total_amount'] = order_cart_total_amount
order_cart_obj_new['total_quantity'] = order_cart_total_quantity
order_cart_obj_new['notes'] = order_cart_obj.notes
if order_cart_obj_resp := sql_update(data=order_cart_obj_new, table_name='order_cart', rm_id_random=True): pass
else:
log.error('Something went wrong while trying to update an order cart record.')
return False
return False
# ### BEGIN ### API Order Cart Methods ### load_order_cart_obj() ###
def load_order_cart_obj(order_cart_id:int|str, inc_order_cart_line_li:bool=False, inc_order_cart_cfg:bool=False) -> Order_Cart_Base:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_cart_id := redis_lookup_id_random(record_id_random=order_cart_id, table_name='order_cart'): pass
else: return False
if order_cart_rec := sql_select(table_name='v_order_cart', record_id=order_cart_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cart_rec)
if inc_order_cart_line_li:
order_cart_line_data = {}
order_cart_line_data['order_cart_id'] = order_cart_id
if order_cart_line_rec_li := sql_select(table_name='v_order_cart_line', data=order_cart_line_data, as_list=True):
order_cart_rec['order_cart_line_li'] = order_cart_line_rec_li
if inc_order_cart_cfg:
if order_cart_cfg_rec := sql_select(table_name='v_account_cfg_detail', field_name='account_id', field_value=order_cart_rec.get('account_id', None)):
order_cart_rec['cfg'] = order_cart_cfg_rec
log.debug(order_cart_rec)
else:
return False
try:
order_cart_obj = Order_Cart_Base(**order_cart_rec)
log.debug(order_cart_obj)
except ValidationError as e:
log.error(e.json())
return False
return order_cart_obj
# ### END ### API Order Cart Methods ### load_order_cart_obj() ###
# IS THIS STILL NEEDED?
# ### BEGIN ### API Order Cart Model ### save_order_cart_obj() ###
def old_save_order_cart_obj(order_cart_obj_new=None):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if not order_cart_obj_new:
return False
#log.debug(order_cart_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True))
# Get the current order_cart_line li to compare with what was sent
data = {}
data['order_cart_id_random'] = order_cart_obj_new.id_random
if order_cart_line_rec_li_curr := sql_select(table_name='v_order_cart_line', data=data, rm_id_random=True, as_list=True):
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
#log.debug(order_cart_line_rec_li_curr)
order_cart_line_obj_li_curr = []
for order_cart_line_rec in order_cart_line_rec_li_curr:
try:
order_cart_line_obj = Order_Cart_Line_Base(**order_cart_line_rec)
log.debug(order_cart_line_obj)
except ValidationError as e:
log.error(e.json())
order_cart_line_obj_li_curr.append(order_cart_line_obj)
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cart_line_obj_li_curr)
else:
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cart_line_rec_li_curr)
order_cart_line_obj_li_curr = []
# Loop through the line list that was sent and compare with what was pulled from the DB
# Only insert if a product ID does not match
# Only update if a product ID does match
for order_cart_line_obj_new in order_cart_obj_new.order_cart_line_li:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
if not any(order_cart_line_obj_curr.product_id_random == order_cart_line_obj_new.product_id_random for order_cart_line_obj_curr in order_cart_line_obj_li_curr):
# Need to append to current list
log.info('Need to append to current list')
order_cart_line_obj_li_curr.append(order_cart_line_obj_new)
else:
# Need to update a current list item ... loop through to find
log.info('Need to update a current list item ... loop through to find')
for index, order_cart_line_obj_curr in enumerate(order_cart_line_obj_li_curr):
log.info(index)
if order_cart_line_obj_new.product_id_random == order_cart_line_obj_curr.product_id_random:
log.info(f'Match: {order_cart_line_obj_curr.product_id_random}')
order_cart_line_obj_new.id_random = order_cart_line_obj_curr.id_random
order_cart_line_obj_li_curr[index] = order_cart_line_obj_new
else:
log.info(f'Not a match: {order_cart_line_obj_curr.product_id_random}')
# Save merged current and new list to the new order cart object
order_cart_obj_new.order_cart_line_li = order_cart_line_obj_li_curr
log.debug(order_cart_obj_new)
# Final loop through to get the new order totals
# Calculate totals
order_cart_total_amount = 0
order_cart_total_quantity = 0
for order_cart_line_obj_curr in order_cart_line_obj_li_curr:
order_cart_total_amount += order_cart_line_obj_curr.quantity * order_cart_line_obj_curr.amount
order_cart_total_quantity += order_cart_line_obj_curr.quantity
order_cart_obj_new.total_amount = order_cart_total_amount
order_cart_obj_new.total_quantity = order_cart_total_quantity
log.debug(order_cart_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'order_cart_id_random', 'order_cart_line_li', 'cfg', 'created_on', 'updated_on'}))
order_cart_obj_data = order_cart_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'order_cart_id_random', 'order_cart_line_li', 'cfg', 'created_on', 'updated_on'})
# SQL INSERT or UPDATE the order_cart record
log.info('SQL INSERT or UPDATE the order_cart record')
if order_cart_obj_resp := sql_insert_or_update(sql=None, data=order_cart_obj_data, table_name='order_cart', rm_id_random=True, id_random_length=8): pass
else: return False
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cart_obj_resp)
if isinstance(order_cart_obj_resp, bool) and order_cart_obj_resp:
if order_cart_id := order_cart_obj_new.id: pass
elif order_cart_id := order_cart_obj_new.id_random: pass
elif isinstance(order_cart_obj_resp, int):
order_cart_id = order_cart_obj_resp
else:
return False
# Loop through the order_cart_line list to SQL INSERT or UPDATE the records
log.info('Loop through the order_cart_line list to SQL INSERT or UPDATE the records')
for order_cart_line_obj in order_cart_obj_new.order_cart_line_li:
log.debug(f"--- {order_cart_line_obj}")
log.debug(order_cart_line_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=False, exclude={}))
order_cart_line_obj_data = order_cart_line_obj.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'product_type_id', 'product_type', 'product_name', 'product_description', 'product_unit_price', 'product_max_quantity', 'order_cart_line_id_random', 'created_on', 'updated_on'})
order_cart_line_obj_data['order_cart_id'] = order_cart_id
if order_cart_line_obj_resp := sql_insert_or_update(sql=None, data=order_cart_line_obj_data, table_name='order_cart_line', rm_id_random=True, id_random_length=8): pass
else: return False
log.debug(order_cart_line_obj_resp)
return order_cart_id
# ### END ### API Order Cart Model ### save_order_cart_obj() ###
# IS THIS STILL NEEDED?
# ### BEGIN ### API Order Cart Model ### get_order_cart_obj() ###
def old_get_order_cart_obj(order_cart_id=None, inc_order_cart_line_li=None, inc_order_cart_cfg=None):
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if order_cart_id := redis_lookup_id_random(record_id_random=order_cart_id, table_name='order_cart'): pass
else:
return False
if order_cart_rec := sql_select(table_name='v_order_cart', record_id=order_cart_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cart_rec)
if inc_order_cart_line_li:
order_cart_line_data = {}
order_cart_line_data['order_cart_id'] = order_cart_id
if order_cart_line_rec_li := sql_select(table_name='v_order_cart_line', data=order_cart_line_data, as_list=True):
order_cart_rec['order_cart_line_li'] = order_cart_line_rec_li
if inc_order_cart_cfg:
if order_cart_cfg_rec := sql_select(table_name='v_account_cfg_detail', field_name='account_id', field_value=order_cart_rec.get('account_id', None)):
order_cart_rec['cfg'] = order_cart_cfg_rec
log.debug(order_cart_rec)
else:
return False
try:
order_cart_obj = Order_Cart_Base(**order_cart_rec)
log.debug(order_cart_obj)
except ValidationError as e:
log.error(e.json())
return order_cart_obj
# ### END ### API Order Cart Model ### get_order_cart_obj() ###

View File

@@ -0,0 +1,204 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_select
from ..models.order_model import Order_Base
#from ..models.person_models import Person_Base
#from ..models.user_models import User_Base
# ### BEGIN ### API Order Methods ### save_order_obj() ###
def save_order_obj(order_obj_new:Order_Base, repl_order_line_li:bool=False):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
log.debug(order_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True))
order_line_obj_li_curr = [] # Initialize to store order_line list
if order_obj_new.id_random:
log.info(f'An order.id {order_obj_new.id} or order.id_random {order_obj_new.id_random} was included. We can update an existing order.')
log.info(f'Get the current order_line list to compare with what was sent...')
data = {}
data['order_id_random'] = order_obj_new.id_random
if order_line_rec_li_curr := sql_select(table_name='v_order_line', data=data, rm_id_random=True, as_list=True):
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_line_rec_li_curr)
for order_line_rec in order_line_rec_li_curr:
try:
order_line_obj = Order_Line_Base(**order_line_rec)
log.debug(order_line_obj)
except ValidationError as e:
log.error(e.json())
order_line_obj_li_curr.append(order_line_obj)
else:
log.info(f'No order_line records were found')
elif order_obj_new.account_id_random and (order_obj_new.person_id_random or order_obj_new.user_id_random):
log.info(f'An account.id_random {order_obj_new.account_id_random} was passed. And either a person.id_random {order_obj_new.person_id_random} or user.id_random {order_obj_new.user_id_random} was passed. We can create a new order.')
# Because there was not an order ID, assume there are no order lines yet. So no look up.
else:
log.info('Either an order ID is required to update an order or an account ID along with a person ID or user ID is required to create an order.')
return False
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_line_obj_li_curr)
if repl_order_line_li: # This will remove any order line list items not sent with the new order information.
log.info('Removing any order line list items not sent with the new order information...')
for index, order_line_obj_curr in enumerate(order_line_obj_li_curr):
log.info(f'Current: order line ID={order_line_obj_curr.id_random} and product ID= {order_line_obj_curr.product_id_random}')
matched_product_id = False
for order_line_obj_new in order_obj_new.order_line_li:
log.debug(f'Checking new: product ID={order_line_obj_new.product_id_random}')
if order_line_obj_curr.product_id_random == order_line_obj_new.product_id_random:
matched_product_id = True
log.debug(f'Matched: product ID={order_line_obj_new.product_id_random}')
break
else:
log.debug(f'No match: product ID={order_line_obj_new.product_id_random}')
if not matched_product_id: # Was not found in the new order line list sent
log.info(f'Current order line product ID did not match any of the new list. DELETE order line ID {order_line_obj_curr.id_random} with product ID {order_line_obj_curr.product_id_random}')
if order_line_del_result := sql_delete(table_name='order_line', record_id_random=order_line_obj_curr.id_random):
log.info(f'Deleted record and now pop the current list item {index}...')
order_line_obj_li_curr.pop(index)
else:
log.info(f'Current order line product ID matched. Keeping order line ID {order_line_obj_curr.id_random} with product ID {order_line_obj_curr.product_id_random}')
# NOTE: That this current order line item will be updated below.
log.debug(order_line_obj_li_curr)
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.info('Loop through the line list that was sent and compare with what was pulled from the DB')
# Loop through the new line list that was sent and compare with the current line list that was pulled from the DB
# Only insert if a product ID does not match
# Only update if a product ID does match
for order_line_obj_new in order_obj_new.order_line_li:
log.info(f'New: order line ID={order_line_obj_new.id_random} and product ID= {order_line_obj_new.product_id_random}')
matched_product_id = False
for index, order_line_obj_curr in enumerate(order_line_obj_li_curr):
log.debug(f'Checking current: product ID={order_line_obj_curr.product_id_random}')
if order_line_obj_new.product_id_random == order_line_obj_curr.product_id_random:
matched_product_id = True
log.debug(f'Matched: product ID={order_line_obj_curr.product_id_random}')
log.info(f'Updating the current line item with the new line item.')
order_line_obj_new.id_random = order_line_obj_curr.id_random
order_line_obj_new.id = order_line_obj_curr.id
order_line_obj_li_curr[index] = order_line_obj_new
break
else:
log.debug(f'No match: product ID={order_line_obj_curr.product_id_random}')
if not matched_product_id: # Was not found in the current order line list that was pulled from the DB
log.info(f'New order line product ID did not match any of the current list. Append order line ID {order_line_obj_new.id_random} with product ID {order_line_obj_new.product_id_random}')
log.info('Append to current list...')
order_line_obj_li_curr.append(order_line_obj_new) # These will be inserted/updated below
# Save merged current and new list to the new order object
order_obj_new.order_line_li = order_line_obj_li_curr
log.debug(order_obj_new)
# Final loop through to get the new order totals
# Calculate totals
order_total_amount:int = 0
order_total_quantity:int = 0
for order_line_obj_new in order_obj_new.order_line_li:
order_total_amount += order_line_obj_new.quantity * order_line_obj_new.amount
order_total_quantity += order_line_obj_new.quantity
order_obj_new.total_bill = order_total_amount # "amount" is used by order_cart and Stripe
order_obj_new.total_quantity = order_total_quantity
order_obj_new.balance = order_total_amount - order_obj_new.total_paid
log.debug(order_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'order_line_li', 'cfg', 'created_on', 'updated_on'}))
order_obj_data = order_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'order_line_li', 'cfg', 'created_on', 'updated_on'})
# SQL INSERT or UPDATE the order record
log.info('SQL INSERT or UPDATE the order record')
if order_obj_resp := sql_insert_or_update(data=order_obj_data, table_name='order', rm_id_random=True, id_random_length=8): pass
else: return False
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_obj_resp)
if isinstance(order_obj_resp, bool) and order_obj_resp:
if order_id := order_obj_new.id: pass
elif order_id := order_obj_new.id_random: pass
elif isinstance(order_obj_resp, int):
order_id = order_obj_resp
else:
return False
log.debug(f'Order ID={order_id}')
# Loop through the order_line list to SQL INSERT or UPDATE the records
log.info('Loop through the order_line list to SQL INSERT or UPDATE the records')
for order_line_obj_new in order_obj_new.order_line_li:
log.info(f"New order_line: order_line_id_random={order_line_obj_new.id_random}; product_id_random={order_line_obj_new.product_id_random}")
log.debug(order_line_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=False, exclude={'order_line_id_random', 'product_type_id', 'product_type', 'created_on', 'updated_on'}))
order_line_obj_data = order_line_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'order_line_id_random', 'product_type_id', 'product_type', 'created_on', 'updated_on'})
order_line_obj_data['order_id'] = order_id
if order_line_obj_resp := sql_insert_or_update(sql=None, data=order_line_obj_data, table_name='order_line', rm_id_random=True, id_random_length=8): pass
else: return False
log.debug(order_line_obj_resp)
return order_id
# ### END ### API Order Methods ### save_order_obj() ###
# ### BEGIN ### API Order Methods ### load_order_obj() ###
def load_order_obj(order_id:int|str, inc_order_line_li:bool=False, inc_order_cfg:bool=False, inc_person_obj:bool=False, inc_user_obj:bool=False):
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 False
if order_rec := sql_select(table_name='v_order', record_id=order_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_rec)
if inc_order_line_li:
order_line_data = {}
order_line_data['order_id'] = order_id
if order_line_rec_li := sql_select(table_name='v_order_line', data=order_line_data, as_list=True):#, field_name='order_id', field_value=order_id):
log.debug(order_line_rec_li)
order_rec['order_line_li'] = order_line_rec_li
if inc_order_cfg:
if order_cfg_rec := sql_select(table_name='v_account_cfg_detail', field_name='account_id', field_value=order_rec.get('account_id', None)):
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(order_cfg_rec)
order_rec['cfg'] = order_cfg_rec
if inc_person_obj:
if person_rec := sql_select(table_name='v_person', field_name='person_id', field_value=order_rec.get('person_id', None)):
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(person_rec)
order_rec['person'] = person_rec
log.debug(order_rec)
else:
return False
try:
order_obj = Order_Base(**order_rec)
log.debug(order_obj)
except ValidationError as e:
log.error(e.json())
return order_obj
# ### END ### API Order Methods ### load_order_obj() ###

View File

@@ -0,0 +1,35 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select
from ..models.organization_models import Organization_Base
# ### BEGIN ### API Organization Methods ### load_organization_obj() ###
def load_organization_obj(organization_id:int|str) -> Organization_Base|bool:
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if organization_id := redis_lookup_id_random(record_id_random=organization_id, table_name='organization'): pass
else: return False
if organization_rec := sql_select(table_name='v_organization', record_id=organization_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(organization_rec)
else:
return False
try:
organization_obj = Organization_Base(**organization_rec)
log.debug(organization_obj)
except ValidationError as e:
log.error(e.json())
return False
return organization_obj
# ### END ### API Organization Methods ### load_organization_obj() ###

View File

@@ -0,0 +1,119 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
from ..methods.address_methods import load_address_obj
from ..methods.contact_methods import create_contact_obj, load_contact_obj
from ..methods.organization_methods import load_organization_obj
from ..methods.user_methods import load_user_obj
from ..models.person_models import Person_Base
# ### BEGIN ### API Person Methods ### create_person_obj() ###
def create_person_obj(person_obj_new:Person_Base):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if not person_obj_new:
return False
person_obj_data = person_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'contact', 'organization', 'created_on', 'updated_on'})
if person_obj_in_result := sql_insert(data=person_obj_data, table_name='person', rm_id_random=True, id_random_length=8): pass
else:
return False
log.setLevel(logging.DEBUG)
log.debug(person_obj_in_result)
person_id = person_obj_in_result
if person_obj_new.contact:
contact_obj_new = person_obj_new.contact
contact_obj_new.for_type = 'person'
contact_obj_new.for_id = person_id
create_contact_obj_result = create_contact_obj(contact_obj_new=contact_obj_new)
if isinstance(create_contact_obj_result, int):
contact_id = create_contact_obj_result
log.debug(f'Update person with new contact_id: {contact_id}')
# Need to update the person with the new contact_id
person_obj_up = {}
person_obj_up['id'] = person_id
person_obj_up['contact_id'] = contact_id
if person_obj_up_result := sql_update(data=person_obj_up, table_name='person'): pass
else:
return False
log.debug(person_obj_up_result)
else:
log.debug(f'No contact_id was returned when tyring to create_contact_obj(): {create_contact_obj_result}')
contact_id = None
log.debug(f'Returning the new person_id: {person_id}')
return person_id
# ### END ### API Person Methods ### create_person_obj() ###
# ### BEGIN ### API Person Methods ### load_person_obj() ###
def load_person_obj(person_id:int|str, inc_contact:bool=False, inc_address:bool=False, inc_organization:bool=False, inc_user:bool=False) -> Person_Base|bool:
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 False
if person_rec := sql_select(table_name='v_person', record_id=person_id):
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(person_rec)
if inc_contact:
contact_id = person_rec.get('contact_id', None)
if contact_obj_result := load_contact_obj(contact_id=contact_id):
contact_obj = contact_obj_result
person_rec['contact'] = contact_obj
log.debug(person_rec)
#else: person_rec['contact'] = None
if inc_address:
address_id = contact_obj.address_id
if address_obj_result := load_address_obj(address_id=address_id):
address_obj = address_obj_result
person_rec['contact'].address = address_obj
log.debug(person_rec)
#else: person_rec['contact'].address = None
if inc_organization:
organization_id = person_rec.get('organization_id', None)
if organization_obj_result := load_organization_obj(organization_id=organization_id):
organization_obj = organization_obj_result
person_rec['organization'] = organization_obj
log.debug(person_rec)
#else: person_rec['organization'] = None
if inc_user:
user_id = person_rec.get('user_id', None)
if user_obj_result := load_user_obj(user_id=user_id):
user_obj = user_obj_result
person_rec['user'] = user_obj
log.debug(person_rec)
#else: person_rec['user'] = None
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(person_rec)
else:
return False
try:
person_obj = Person_Base(**person_rec)
log.debug(person_obj)
except ValidationError as e:
log.error(e.json())
return False
return person_obj
# ### END ### API Person Methods ### load_person_obj() ###

127
app/methods/user_methods.py Normal file
View File

@@ -0,0 +1,127 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from ..lib_general import *
from ..db_sql import redis_lookup_id_random, sql_insert, sql_select, sql_update
from ..methods.contact_methods import load_contact_obj
from ..methods.organization_methods import load_organization_obj
#from ..methods.person_methods import load_person_obj
from ..models.user_models import User_Base, User_New_Base, User_Out_Base
from ..models.user_role_model import User_Role_Base
# ### BEGIN ### API User Methods ### create_user_obj() ###
def create_user_obj(user_obj_new:User_New_Base) -> int|bool:
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if not user_obj_new:
return False
# user_obj_data = user_obj_new.dict(by_alias=False, exclude_defaults=False, include={'password'}, exclude={'new_password'})
# log.debug(user_obj_data)
user_obj_data = user_obj_new.dict(by_alias=False, exclude_defaults=False, exclude_unset=True, exclude={'new_password'})
log.debug(user_obj_data)
user_obj_data['password'] = user_obj_new.password # There has to be a better way to do this??? It thinks "password" is unset and so is excluded?
log.debug(user_obj_data)
log.info('Checking if the username is already in use for the account...')
sql_select_user = f"""
SELECT user.id, user.id_random, user.name, user.email
FROM `user` AS user
WHERE user.account_id = :account_id and user.username = :username
"""
if sql_select_result := sql_select(sql=sql_select_user, data=user_obj_data, rm_id_random=True):
if isinstance(sql_select_result, list):
log.exception(f"Multiple user accounts already exists with this username ({user_obj_data['username']}). The database needs to be checked.")
return False
log.info('A user account already exists with this username. Updating instead of inserting.')
user_id = sql_select_result.get('id', None)
user_obj_data['id'] = user_id
if user_obj_up_result := sql_update(data=user_obj_data, table_name='user', rm_id_random=True): pass
else:
return False
log.setLevel(logging.DEBUG)
log.debug(user_obj_up_result)
log.debug(f'Returning the existing user_id: {user_id}')
else:
if user_obj_in_result := sql_insert(data=user_obj_data, table_name='user', rm_id_random=True, id_random_length=8): pass
else:
return False
log.setLevel(logging.DEBUG)
log.debug(user_obj_in_result)
user_id = user_obj_in_result
log.debug(f'Returning the new user_id: {user_id}')
return user_id
# ### END ### API User Methods ### create_user_obj() ###
# ### BEGIN ### API User Methods ### load_user_obj() ###
def load_user_obj(user_id:int|str, inc_roles:bool=False, inc_contact:bool=False, inc_organization:bool=False, inc_person:bool=False) -> User_Out_Base|bool:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if user_id := redis_lookup_id_random(record_id_random=user_id, table_name='user'): pass
else: return False
if user_rec := sql_select(table_name='v_user', record_id=user_id):
#log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(user_rec)
if inc_roles:
if role_rec_li := sql_select(table_name='v_user_role_detail', field_name='user_id', field_value=user_id, as_list=True):
user_rec['role_list'] = role_rec_li
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(role_rec_li)
if inc_contact:
contact_id = user_rec.get('contact_id', None)
if contact_obj_result := load_contact_obj(contact_id=contact_id):
contact_obj = contact_obj_result
user_rec['contact'] = contact_obj
log.debug(user_rec)
#else: user_rec['contact'] = None
if inc_organization:
organization_id = user_rec.get('organization_id', None)
if organization_obj_result := load_organization_obj(organization_id=organization_id):
organization_obj = organization_obj_result
user_rec['organization'] = organization_obj
log.debug(user_rec)
#else: user_rec['organization'] = None
# if inc_person:
# person_id = user_rec.get('person_id', None)
# if person_obj_result := load_person_obj(person_id=person_id):
# person_obj = person_obj_result
# user_rec['person'] = person_obj
# log.debug(user_rec)
# #else: user_rec['person'] = None
#log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(user_rec)
else:
return False
try:
user_obj = User_Out_Base(**user_rec)
log.debug(user_obj)
except ValidationError as e:
log.error(e.json())
return False
return user_obj
# ### END ### API User Methods ### load_user_obj() ###