diff --git a/sigl/database/orm.py b/sigl/database/orm.py index e4e5c0e..927c6ea 100644 --- a/sigl/database/orm.py +++ b/sigl/database/orm.py @@ -46,6 +46,10 @@ def init_orm(): # # List Entries db.mapper(ListEntry, list_entries, properties={ + 'product': db.relationship( + Product, + back_populates='entries' + ), 'shoppingList': db.relationship( ShoppingList, back_populates='entries', @@ -54,6 +58,11 @@ def init_orm(): # Products db.mapper(Product, products, properties={ + 'entries': db.relationship( + ListEntry, + back_populates='product', + cascade='all, delete-orphan', + ), 'locations': db.relationship( ProductLocation, back_populates='product', diff --git a/sigl/domain/models/accessKey.py b/sigl/domain/models/accessKey.py index 0b5fcc0..90a8cce 100644 --- a/sigl/domain/models/accessKey.py +++ b/sigl/domain/models/accessKey.py @@ -4,8 +4,9 @@ Simple Grocery List (Sigl) | sigl.app Copyright (c) 2022 Asymworks, LLC. All Rights Reserved. """ -from dataclasses import dataclass +from dataclasses import dataclass, field from datetime import datetime +from typing import List __all__ = ('AccessKey', 'AccessToken') @@ -24,6 +25,8 @@ class AccessKey: may also be used for throttling. """ key: str = None + + # Client Information clientId: str = None clientIP: str = None userAgent: str = None @@ -38,8 +41,8 @@ class AccessKey: revokedAt: datetime = None restoredAt: datetime = None - # Populated by ORM - # tokens: List['AccessToken'] = None + # Relationship Fields + tokens: List['AccessToken'] = field(default_factory=list) @dataclass @@ -56,7 +59,11 @@ class AccessToken: User Agent string are logged for future auditing purposes. """ token: str = None + + # Relationship Fields accessKey: 'AccessKey' = None + + # Client Information clientIP: str = None userAgent: str = None diff --git a/sigl/domain/models/list.py b/sigl/domain/models/list.py index e796016..f07a0d6 100644 --- a/sigl/domain/models/list.py +++ b/sigl/domain/models/list.py @@ -4,8 +4,10 @@ Simple Grocery List (Sigl) | sigl.app Copyright (c) 2022 Asymworks, LLC. All Rights Reserved. """ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import List +from .accessKey import AccessKey from .mixins import NotesMixin, TimestampMixin from .product import Product @@ -25,8 +27,8 @@ class ListEntry(NotesMixin, TimestampMixin): deleted: bool = False # Relationship Fields - shoppingList: 'ShoppingList' = None product: Product = None + shoppingList: 'ShoppingList' = None @dataclass @@ -36,8 +38,8 @@ class ShoppingList(NotesMixin, TimestampMixin): Contains a collection of `ListEntry` items which are intended to be purchased. """ - accessKey: str = None + accessKey: AccessKey = None name: str = None - # Populated by ORM - # entries: List[ListEntry] = None + # Relationship Fields + entries: List[ListEntry] = field(default_factory=list) diff --git a/sigl/domain/models/product.py b/sigl/domain/models/product.py index 8c050fe..2d0cc67 100644 --- a/sigl/domain/models/product.py +++ b/sigl/domain/models/product.py @@ -4,10 +4,15 @@ Simple Grocery List (Sigl) | sigl.app Copyright (c) 2022 Asymworks, LLC. All Rights Reserved. """ -from dataclasses import dataclass +from dataclasses import dataclass, field +from typing import List, TYPE_CHECKING +from .accessKey import AccessKey from .mixins import NotesMixin, TimestampMixin +if TYPE_CHECKING: + from .list import ListEntry + __all__ = ('Product', 'ProductLocation') @@ -23,11 +28,11 @@ class Product(NotesMixin, TimestampMixin): category: str = None # Access Control - accessKey: str = None + accessKey: AccessKey = None - # Populated by ORM - # locations: List['ProductLocation'] = [] - # shoppingLists: List['ShoppingList'] = [] + # Relationship Fields + entries: List['ListEntry'] = field(default_factory=list) + locations: List['ProductLocation'] = field(default_factory=list) @dataclass