Moved things around
Some checks failed
Gitea Actions Demo / build-and-push (push) Failing after 6s

This commit is contained in:
2026-01-21 17:18:58 -05:00
parent a47df7171c
commit a0a059472b
160 changed files with 100 additions and 17 deletions

20
backend/models/base.py Normal file
View 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
View 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
View 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

View 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
View 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
View 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
View 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