diff --git a/README.md b/README.md index 58328df..3eb8c7e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,24 @@ Data will eventuall be stored in a SQLite database. uv run pytest tests.py ``` +## Observing the app's console + +You will need two terminals: one for showing the console, the other to run the app. + +Since we use uv the incantation is bit different from the official documenation: + +In one terminal: + +```shell +textual console +``` + +And in the other: + +```shell +uv run textual run --dev src/teilchensammler_cli/__init__.py +``` + ## Creating a new release * make code changes diff --git a/src/teilchensammler_cli/main.py b/src/teilchensammler_cli/main.py index d8494bd..256c497 100644 --- a/src/teilchensammler_cli/main.py +++ b/src/teilchensammler_cli/main.py @@ -16,8 +16,7 @@ from textual.widgets import ( Input, Static, ) -from tortoise import Tortoise, fields -from tortoise.models import Model +from tortoise import Tortoise @final @@ -101,7 +100,8 @@ class AddInventoryScreen(Screen[None]): class SammlerApp(App[None]): async def on_mount(self) -> None: await Tortoise.init( - db_url="sqlite://db.sqlite3", modules={"models": ["teilchensammler_cli"]} + db_url="sqlite://db.sqlite3", + modules={"models": ["teilchensammler_cli.models"]}, ) await Tortoise.generate_schemas() _ = self.push_screen(AddInventoryScreen()) diff --git a/src/teilchensammler_cli/models.py b/src/teilchensammler_cli/models.py new file mode 100644 index 0000000..19839da --- /dev/null +++ b/src/teilchensammler_cli/models.py @@ -0,0 +1,38 @@ +from typing import final + +from tortoise import Model, fields + + +@final +class Teilchen(Model): + name = fields.TextField() + description = fields.TextField() + number = fields.IntField() # validate values >= 0 + + created_at = fields.DatetimeField(auto_now_add=True) + modified_at = fields.DatetimeField(auto_now=True) + + tags = fields.ManyToManyField( + "models.Tag", + through="models.TeilchenTag", + related_name="teilchen", + forward_key="tag_id", + backward_key="teilchen_id", + ) + + +@final +class Tag(Model): + name = fields.CharField(max_length=20) + + created_at = fields.DatetimeField(auto_now_add=True) + modified_at = fields.DatetimeField(auto_now=True) + + +@final +class TeilchenTag(Model): + teilchen: fields.ForeignKeyRelation[Teilchen] = fields.ForeignKeyField( + "models.Teilchen" + ) + tag: fields.ForeignKeyRelation[Tag] = fields.ForeignKeyField("models.Tag") + weight = fields.IntField()