You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.8 KiB
175 lines
4.8 KiB
from dataclasses import dataclass, field |
|
from marshmallow import Schema, fields |
|
from datetime import datetime |
|
|
|
@dataclass |
|
class User: |
|
id: int |
|
username: str |
|
email: str |
|
otp: str |
|
fullname: str |
|
|
|
class UserSchema(Schema): |
|
id = fields.Int(required=False) |
|
username = fields.String() |
|
email = fields.String() |
|
otp = fields.String(load_only=True, required=False) |
|
fullname = fields.String() |
|
|
|
@staticmethod |
|
def new_user(username: str, email: str, fullname: str) -> 'User': |
|
return User( |
|
id=-1, |
|
username=username, |
|
email=email, |
|
otp='', |
|
fullname=fullname, |
|
) |
|
|
|
def to_json(self, include_otp=False, include_id=False): |
|
result = { |
|
'username': self.username, |
|
'email': self.email, |
|
'fullname': self.fullname, |
|
} |
|
if include_id: |
|
result['id'] = self.id |
|
if include_otp: |
|
result['otp'] = self.otp |
|
return result |
|
|
|
@classmethod |
|
def from_query(cls, query_result): |
|
return cls(*query_result) |
|
|
|
|
|
@dataclass |
|
class Account: |
|
id: int |
|
iban: str |
|
currency: str |
|
account_type: str |
|
custom_name: str |
|
balance: int = field(default=0) |
|
|
|
class AccountSchema(Schema): |
|
id = fields.Int(required=False) |
|
iban = fields.Str() |
|
currency = fields.Str() |
|
account_type = fields.Str(data_key='accountType') |
|
custom_name = fields.Str(data_key='customName') |
|
balance = fields.Int() |
|
|
|
@staticmethod |
|
def new_account(currency: str, account_type: str, custom_name: str = '') -> 'Account': |
|
return Account( |
|
id=-1, |
|
iban='', |
|
currency=currency, |
|
account_type=account_type, |
|
custom_name=custom_name, |
|
) |
|
|
|
def to_json(self, include_id=True): |
|
result = { |
|
'iban': self.iban, |
|
'currency': self.currency, |
|
'accountType': self.account_type, |
|
'customName': self.custom_name, |
|
'balance': self.balance, |
|
} |
|
if include_id: |
|
result['id'] = self.id |
|
return result |
|
|
|
@classmethod |
|
def from_query(cls, query_result): |
|
return cls(*query_result) |
|
|
|
|
|
@dataclass |
|
class Transaction: |
|
id: int |
|
date_time: datetime |
|
other_party: str |
|
status: str |
|
transaction_type: str |
|
extra: str |
|
|
|
class TransactionSchema(Schema): |
|
id = fields.Int(required=False) |
|
date_time = fields.DateTime(data_key='datetime') |
|
other_party = fields.Dict(keys=fields.Str(), values=fields.Raw(), data_key='otherParty') |
|
status = fields.Str() |
|
transaction_type = fields.Str(data_key='transactionType') |
|
extra = fields.Dict(keys=fields.Str(), values=fields.Raw()) |
|
|
|
@staticmethod |
|
def new_transaction(date_time: datetime, other_party: str, status: str, transaction_type: str, extra: str = '') -> 'Transaction': |
|
return Transaction( |
|
id=-1, |
|
date_time=date_time, |
|
other_party=other_party, |
|
status=status, |
|
transaction_type=transaction_type, |
|
extra=extra, |
|
) |
|
|
|
def to_json(self, include_id=True): |
|
result = { |
|
'datetime': self.date_time.isoformat(), |
|
'otherParty': self.other_party, |
|
'status': self.status, |
|
'transactionType': self.transaction_type, |
|
'extra': self.extra, |
|
} |
|
if include_id: |
|
result['id'] = self.id |
|
return result |
|
|
|
@classmethod |
|
def from_query(cls, query_result): |
|
import json |
|
|
|
query_result = list(query_result) |
|
if type(query_result[1]) is str: |
|
query_result[1] = datetime.fromisoformat(query_result[1]) |
|
if type(query_result[2]) is str: |
|
query_result[2] = json.loads(query_result[2]) |
|
if type(query_result[5]) is str: |
|
query_result[5] = json.loads(query_result[5]) |
|
|
|
return cls(*query_result) |
|
|
|
@dataclass |
|
class Notification: |
|
id: int |
|
body: str |
|
date_time: datetime |
|
read: bool |
|
|
|
class NotificationSchema(Schema): |
|
id = fields.Int(required=False) |
|
body = fields.Str() |
|
date_time = fields.DateTime(data_key='datetime') |
|
read = fields.Bool() |
|
|
|
@staticmethod |
|
def new_notification(body: str, date_time: datetime, read: bool = False) -> 'Notification': |
|
return Notification( |
|
id=-1, |
|
body=body, |
|
date_time=date_time, |
|
read=read, |
|
) |
|
|
|
@classmethod |
|
def from_query(cls, query_result): |
|
query_result = list(query_result) |
|
if type(query_result[2]) is str: |
|
query_result[2] = datetime.fromisoformat(query_result[2]) |
|
if type(query_result[3]) is not bool: |
|
query_result[3] = bool(query_result[3]) |
|
|
|
return cls(*query_result)
|
|
|