This commit is contained in:
20
backend/models/base.py
Normal file
20
backend/models/base.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# python
|
||||
from dataclasses import dataclass, field
|
||||
import uuid
|
||||
import time
|
||||
|
||||
@dataclass(kw_only=True)
|
||||
class BaseModel:
|
||||
id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
||||
created_at: float = field(default_factory=time.time)
|
||||
updated_at: float = field(default_factory=time.time)
|
||||
|
||||
def touch(self):
|
||||
self.updated_at = time.time()
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'created_at': self.created_at,
|
||||
'updated_at': self.updated_at
|
||||
}
|
||||
38
backend/models/child.py
Normal file
38
backend/models/child.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from dataclasses import dataclass, field
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class Child(BaseModel):
|
||||
name: str
|
||||
age: int | None = None
|
||||
tasks: list[str] = field(default_factory=list)
|
||||
rewards: list[str] = field(default_factory=list)
|
||||
points: int = 0
|
||||
image_id: str | None = None
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
return cls(
|
||||
name=d.get('name'),
|
||||
age=d.get('age'),
|
||||
tasks=d.get('tasks', []),
|
||||
rewards=d.get('rewards', []),
|
||||
points=d.get('points', 0),
|
||||
image_id=d.get('image_id'),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at')
|
||||
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'name': self.name,
|
||||
'age': self.age,
|
||||
'tasks': self.tasks,
|
||||
'rewards': self.rewards,
|
||||
'points': self.points,
|
||||
'image_id': self.image_id
|
||||
})
|
||||
return base
|
||||
33
backend/models/image.py
Normal file
33
backend/models/image.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# python
|
||||
from dataclasses import dataclass
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class Image(BaseModel):
|
||||
type: int
|
||||
extension: str
|
||||
permanent: bool = False
|
||||
user: str | None = None
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
# Supports overriding base fields (id, created_at, updated_at) if present
|
||||
return cls(
|
||||
type=d.get('type'),
|
||||
extension=d.get('extension'),
|
||||
permanent=d.get('permanent', False),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at'),
|
||||
user=d.get('user')
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'type': self.type,
|
||||
'permanent': self.permanent,
|
||||
'extension': self.extension,
|
||||
'user': self.user
|
||||
})
|
||||
return base
|
||||
28
backend/models/pending_reward.py
Normal file
28
backend/models/pending_reward.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from dataclasses import dataclass
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class PendingReward(BaseModel):
|
||||
child_id: str
|
||||
reward_id: str
|
||||
status: str = "pending" # pending, approved, rejected
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
return cls(
|
||||
child_id=d.get('child_id'),
|
||||
reward_id=d.get('reward_id'),
|
||||
status=d.get('status', 'pending'),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at')
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'child_id': self.child_id,
|
||||
'reward_id': self.reward_id,
|
||||
'status': self.status
|
||||
})
|
||||
return base
|
||||
33
backend/models/reward.py
Normal file
33
backend/models/reward.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# python
|
||||
from dataclasses import dataclass
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class Reward(BaseModel):
|
||||
name: str
|
||||
description: str
|
||||
cost: int
|
||||
image_id: str | None = None
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
# Base fields are keyword-only; can be overridden if provided
|
||||
return cls(
|
||||
name=d.get('name'),
|
||||
description=d.get('description'),
|
||||
cost=d.get('cost', 0),
|
||||
image_id=d.get('image_id'),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at')
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'name': self.name,
|
||||
'description': self.description,
|
||||
'cost': self.cost,
|
||||
'image_id': self.image_id
|
||||
})
|
||||
return base
|
||||
31
backend/models/task.py
Normal file
31
backend/models/task.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from dataclasses import dataclass
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class Task(BaseModel):
|
||||
name: str
|
||||
points: int
|
||||
is_good: bool
|
||||
image_id: str | None = None
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
return cls(
|
||||
name=d.get('name'),
|
||||
points=d.get('points', 0),
|
||||
is_good=d.get('is_good', True),
|
||||
image_id=d.get('image_id'),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at')
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'name': self.name,
|
||||
'points': self.points,
|
||||
'is_good': self.is_good,
|
||||
'image_id': self.image_id
|
||||
})
|
||||
return base
|
||||
50
backend/models/user.py
Normal file
50
backend/models/user.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from dataclasses import dataclass, field
|
||||
from models.base import BaseModel
|
||||
|
||||
@dataclass
|
||||
class User(BaseModel):
|
||||
first_name: str
|
||||
last_name: str
|
||||
email: str
|
||||
password: str # In production, this should be hashed
|
||||
verified: bool = False
|
||||
verify_token: str | None = None
|
||||
verify_token_created: str | None = None
|
||||
reset_token: str | None = None
|
||||
reset_token_created: str | None = None
|
||||
image_id: str | None = None
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, d: dict):
|
||||
return cls(
|
||||
first_name=d.get('first_name'),
|
||||
last_name=d.get('last_name'),
|
||||
email=d.get('email'),
|
||||
password=d.get('password'),
|
||||
verified=d.get('verified', False),
|
||||
verify_token=d.get('verify_token'),
|
||||
verify_token_created=d.get('verify_token_created'),
|
||||
reset_token=d.get('reset_token'),
|
||||
reset_token_created=d.get('reset_token_created'),
|
||||
image_id=d.get('image_id'),
|
||||
id=d.get('id'),
|
||||
created_at=d.get('created_at'),
|
||||
updated_at=d.get('updated_at')
|
||||
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
base = super().to_dict()
|
||||
base.update({
|
||||
'first_name': self.first_name,
|
||||
'last_name': self.last_name,
|
||||
'email': self.email,
|
||||
'password': self.password,
|
||||
'verified': self.verified,
|
||||
'verify_token': self.verify_token,
|
||||
'verify_token_created': self.verify_token_created,
|
||||
'reset_token': self.reset_token,
|
||||
'reset_token_created': self.reset_token_created,
|
||||
'image_id': self.image_id
|
||||
})
|
||||
return base
|
||||
Reference in New Issue
Block a user