diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..7116392 --- /dev/null +++ b/app/models.py @@ -0,0 +1,67 @@ +from tortoise import Model, fields + + +class User(Model): + id = fields.UUIDField(pk=True) + sub = fields.CharField(max_length=255, unique=True) + email = fields.CharField(max_length=255, null=True) + name = fields.CharField(max_length=255, null=True) + created_at = fields.DatetimeField(auto_now_add=True) + + class Meta: + table = "users" + + +class ExpenseReport(Model): + id = fields.UUIDField(pk=True) + title = fields.CharField(max_length=512) + creator: fields.ForeignKeyRelation["User"] = fields.ForeignKeyField( + "models.User", related_name="created_reports" + ) + participants: fields.ReverseRelation["ExpenseParticipant"] + items: fields.ReverseRelation["ExpenseItem"] + created_at = fields.DatetimeField(auto_now_add=True) + + class Meta: + table = "expense_reports" + + +class ExpenseParticipant(Model): + id = fields.UUIDField(pk=True) + report: fields.ForeignKeyRelation["ExpenseReport"] = fields.ForeignKeyField( + "models.ExpenseReport", related_name="participants" + ) + user: fields.ForeignKeyRelation["User"] = fields.ForeignKeyField( + "models.User", related_name="report_participations" + ) + + class Meta: + table = "expense_participants" + unique_together = (("report", "user"),) + + +class ExpenseItem(Model): + id = fields.UUIDField(pk=True) + report: fields.ForeignKeyRelation["ExpenseReport"] = fields.ForeignKeyField( + "models.ExpenseReport", related_name="items" + ) + description = fields.CharField(max_length=1024) + amount = fields.DecimalField(max_digits=12, decimal_places=2) + shares: fields.ReverseRelation["ExpenseShare"] + + class Meta: + table = "expense_items" + + +class ExpenseShare(Model): + id = fields.UUIDField(pk=True) + item: fields.ForeignKeyRelation["ExpenseItem"] = fields.ForeignKeyField( + "models.ExpenseItem", related_name="shares" + ) + user: fields.ForeignKeyRelation["User"] = fields.ForeignKeyField( + "models.User", related_name="expense_shares" + ) + percentage = fields.FloatField() + + class Meta: + table = "expense_shares"