Refactors type hints for clarity
Updates type hints in `crud.py`, `helpers.py`, and `models.py` for improved readability and maintainability. Replaces `Merchant | None` with `Optional[Merchant]` and `list[X]` with `List[X]` for consistency with standard Python typing practices.
This commit is contained in:
parent
429522adba
commit
e8ddc4b697
5 changed files with 122 additions and 115 deletions
116
models.py
116
models.py
|
|
@ -2,7 +2,7 @@ import json
|
|||
import time
|
||||
from abc import abstractmethod
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
from typing import Any, List, Optional, Tuple
|
||||
|
||||
from lnbits.utils.exchange_rates import btc_price, fiat_amount_as_satoshis
|
||||
from pydantic import BaseModel
|
||||
|
|
@ -32,17 +32,17 @@ class Nostrable:
|
|||
|
||||
|
||||
class MerchantProfile(BaseModel):
|
||||
name: str | None = None
|
||||
about: str | None = None
|
||||
picture: str | None = None
|
||||
name: Optional[str] = None
|
||||
about: Optional[str] = None
|
||||
picture: Optional[str] = None
|
||||
|
||||
|
||||
class MerchantConfig(MerchantProfile):
|
||||
event_id: str | None = None
|
||||
sync_from_nostr: bool = False
|
||||
event_id: Optional[str] = None
|
||||
sync_from_nostr = False
|
||||
# TODO: switched to True for AIO demo; determine if we leave this as True
|
||||
active: bool = True
|
||||
restore_in_progress: bool | None = False
|
||||
restore_in_progress: Optional[bool] = False
|
||||
|
||||
|
||||
class CreateMerchantRequest(BaseModel):
|
||||
|
|
@ -57,7 +57,7 @@ class PartialMerchant(BaseModel):
|
|||
|
||||
class Merchant(PartialMerchant, Nostrable):
|
||||
id: str
|
||||
time: int | None = 0
|
||||
time: Optional[int] = 0
|
||||
|
||||
def sign_hash(self, hash_: bytes) -> str:
|
||||
return sign_message_hash(self.private_key, hash_)
|
||||
|
|
@ -127,11 +127,11 @@ class Merchant(PartialMerchant, Nostrable):
|
|||
|
||||
######################################## ZONES ########################################
|
||||
class Zone(BaseModel):
|
||||
id: str | None = None
|
||||
name: str | None = None
|
||||
id: Optional[str] = None
|
||||
name: Optional[str] = None
|
||||
currency: str
|
||||
cost: float
|
||||
countries: list[str] = []
|
||||
countries: List[str] = []
|
||||
|
||||
@classmethod
|
||||
def from_row(cls, row: dict) -> "Zone":
|
||||
|
|
@ -144,22 +144,22 @@ class Zone(BaseModel):
|
|||
|
||||
|
||||
class StallConfig(BaseModel):
|
||||
image_url: str | None = None
|
||||
description: str | None = None
|
||||
image_url: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
|
||||
|
||||
class Stall(BaseModel, Nostrable):
|
||||
id: str | None = None
|
||||
id: Optional[str] = None
|
||||
wallet: str
|
||||
name: str
|
||||
currency: str = "sat"
|
||||
shipping_zones: list[Zone] = []
|
||||
shipping_zones: List[Zone] = []
|
||||
config: StallConfig = StallConfig()
|
||||
pending: bool = False
|
||||
|
||||
"""Last published nostr event for this Stall"""
|
||||
event_id: str | None = None
|
||||
event_created_at: int | None = None
|
||||
event_id: Optional[str] = None
|
||||
event_created_at: Optional[int] = None
|
||||
|
||||
def validate_stall(self):
|
||||
for z in self.shipping_zones:
|
||||
|
|
@ -217,19 +217,19 @@ class ProductShippingCost(BaseModel):
|
|||
|
||||
|
||||
class ProductConfig(BaseModel):
|
||||
description: str | None = None
|
||||
currency: str | None = None
|
||||
use_autoreply: bool | None = False
|
||||
autoreply_message: str | None = None
|
||||
shipping: list[ProductShippingCost] = []
|
||||
description: Optional[str] = None
|
||||
currency: Optional[str] = None
|
||||
use_autoreply: Optional[bool] = False
|
||||
autoreply_message: Optional[str] = None
|
||||
shipping: List[ProductShippingCost] = []
|
||||
|
||||
|
||||
class Product(BaseModel, Nostrable):
|
||||
id: str | None = None
|
||||
id: Optional[str] = None
|
||||
stall_id: str
|
||||
name: str
|
||||
categories: list[str] = []
|
||||
images: list[str] = []
|
||||
categories: List[str] = []
|
||||
images: List[str] = []
|
||||
price: float
|
||||
quantity: int
|
||||
active: bool = True
|
||||
|
|
@ -237,8 +237,8 @@ class Product(BaseModel, Nostrable):
|
|||
config: ProductConfig = ProductConfig()
|
||||
|
||||
"""Last published nostr event for this Product"""
|
||||
event_id: str | None = None
|
||||
event_created_at: int | None = None
|
||||
event_id: Optional[str] = None
|
||||
event_created_at: Optional[int] = None
|
||||
|
||||
def to_nostr_event(self, pubkey: str) -> NostrEvent:
|
||||
content = {
|
||||
|
|
@ -295,7 +295,7 @@ class ProductOverview(BaseModel):
|
|||
id: str
|
||||
name: str
|
||||
price: float
|
||||
product_shipping_cost: float | None = None
|
||||
product_shipping_cost: Optional[float] = None
|
||||
|
||||
@classmethod
|
||||
def from_product(cls, p: Product) -> "ProductOverview":
|
||||
|
|
@ -312,21 +312,21 @@ class OrderItem(BaseModel):
|
|||
|
||||
|
||||
class OrderContact(BaseModel):
|
||||
nostr: str | None = None
|
||||
phone: str | None = None
|
||||
email: str | None = None
|
||||
nostr: Optional[str] = None
|
||||
phone: Optional[str] = None
|
||||
email: Optional[str] = None
|
||||
|
||||
|
||||
class OrderExtra(BaseModel):
|
||||
products: list[ProductOverview]
|
||||
products: List[ProductOverview]
|
||||
currency: str
|
||||
btc_price: str
|
||||
shipping_cost: float = 0
|
||||
shipping_cost_sat: float = 0
|
||||
fail_message: str | None = None
|
||||
fail_message: Optional[str] = None
|
||||
|
||||
@classmethod
|
||||
async def from_products(cls, products: list[Product]):
|
||||
async def from_products(cls, products: List[Product]):
|
||||
currency = products[0].config.currency if len(products) else "sat"
|
||||
exchange_rate = (
|
||||
await btc_price(currency) if currency and currency != "sat" else 1
|
||||
|
|
@ -342,19 +342,19 @@ class OrderExtra(BaseModel):
|
|||
|
||||
class PartialOrder(BaseModel):
|
||||
id: str
|
||||
event_id: str | None = None
|
||||
event_created_at: int | None = None
|
||||
event_id: Optional[str] = None
|
||||
event_created_at: Optional[int] = None
|
||||
public_key: str
|
||||
merchant_public_key: str
|
||||
shipping_id: str
|
||||
items: list[OrderItem]
|
||||
contact: OrderContact | None = None
|
||||
address: str | None = None
|
||||
items: List[OrderItem]
|
||||
contact: Optional[OrderContact] = None
|
||||
address: Optional[str] = None
|
||||
|
||||
def validate_order(self):
|
||||
assert len(self.items) != 0, f"Order has no items. Order: '{self.id}'"
|
||||
|
||||
def validate_order_items(self, product_list: list[Product]):
|
||||
def validate_order_items(self, product_list: List[Product]):
|
||||
assert len(self.items) != 0, f"Order has no items. Order: '{self.id}'"
|
||||
assert (
|
||||
len(product_list) != 0
|
||||
|
|
@ -375,8 +375,8 @@ class PartialOrder(BaseModel):
|
|||
)
|
||||
|
||||
async def costs_in_sats(
|
||||
self, products: list[Product], shipping_id: str, stall_shipping_cost: float
|
||||
) -> tuple[float, float]:
|
||||
self, products: List[Product], shipping_id: str, stall_shipping_cost: float
|
||||
) -> Tuple[float, float]:
|
||||
product_prices = {}
|
||||
for p in products:
|
||||
product_shipping_cost = next(
|
||||
|
|
@ -405,7 +405,7 @@ class PartialOrder(BaseModel):
|
|||
return product_cost, stall_shipping_cost
|
||||
|
||||
def receipt(
|
||||
self, products: list[Product], shipping_id: str, stall_shipping_cost: float
|
||||
self, products: List[Product], shipping_id: str, stall_shipping_cost: float
|
||||
) -> str:
|
||||
if len(products) == 0:
|
||||
return "[No Products]"
|
||||
|
|
@ -454,7 +454,7 @@ class Order(PartialOrder):
|
|||
total: float
|
||||
paid: bool = False
|
||||
shipped: bool = False
|
||||
time: int | None = None
|
||||
time: Optional[int] = None
|
||||
extra: OrderExtra
|
||||
|
||||
@classmethod
|
||||
|
|
@ -468,14 +468,14 @@ class Order(PartialOrder):
|
|||
|
||||
class OrderStatusUpdate(BaseModel):
|
||||
id: str
|
||||
message: str | None = None
|
||||
paid: bool | None = False
|
||||
shipped: bool | None = None
|
||||
message: Optional[str] = None
|
||||
paid: Optional[bool] = False
|
||||
shipped: Optional[bool] = None
|
||||
|
||||
|
||||
class OrderReissue(BaseModel):
|
||||
id: str
|
||||
shipping_id: str | None = None
|
||||
shipping_id: Optional[str] = None
|
||||
|
||||
|
||||
class PaymentOption(BaseModel):
|
||||
|
|
@ -485,8 +485,8 @@ class PaymentOption(BaseModel):
|
|||
|
||||
class PaymentRequest(BaseModel):
|
||||
id: str
|
||||
message: str | None = None
|
||||
payment_options: list[PaymentOption]
|
||||
message: Optional[str] = None
|
||||
payment_options: List[PaymentOption]
|
||||
|
||||
|
||||
######################################## MESSAGE #######################################
|
||||
|
|
@ -502,16 +502,16 @@ class DirectMessageType(Enum):
|
|||
|
||||
|
||||
class PartialDirectMessage(BaseModel):
|
||||
event_id: str | None = None
|
||||
event_created_at: int | None = None
|
||||
event_id: Optional[str] = None
|
||||
event_created_at: Optional[int] = None
|
||||
message: str
|
||||
public_key: str
|
||||
type: int = DirectMessageType.PLAIN_TEXT.value
|
||||
incoming: bool = False
|
||||
time: int | None = None
|
||||
time: Optional[int] = None
|
||||
|
||||
@classmethod
|
||||
def parse_message(cls, msg) -> tuple[DirectMessageType, Any | None]:
|
||||
def parse_message(cls, msg) -> Tuple[DirectMessageType, Optional[Any]]:
|
||||
try:
|
||||
msg_json = json.loads(msg)
|
||||
if "type" in msg_json:
|
||||
|
|
@ -534,15 +534,15 @@ class DirectMessage(PartialDirectMessage):
|
|||
|
||||
|
||||
class CustomerProfile(BaseModel):
|
||||
name: str | None = None
|
||||
about: str | None = None
|
||||
name: Optional[str] = None
|
||||
about: Optional[str] = None
|
||||
|
||||
|
||||
class Customer(BaseModel):
|
||||
merchant_id: str
|
||||
public_key: str
|
||||
event_created_at: int | None = None
|
||||
profile: CustomerProfile | None = None
|
||||
event_created_at: Optional[int] = None
|
||||
profile: Optional[CustomerProfile] = None
|
||||
unread_messages: int = 0
|
||||
|
||||
@classmethod
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue