feat(01-02): add Peewee models, database init, and driver storage

- imptune/db/database.py: deferred SqliteDatabase with WAL + foreign_keys pragmas and init_db()
- imptune/db/models.py: full schema (Client, Driver, Printer, Icon) for phases 1-5
- imptune/storage/driver_store.py: SHA256 content-addressed DriverStore with dedup
- tests/test_db.py: 7 TDD tests covering all db and storage behaviors
This commit is contained in:
2026-04-10 11:31:39 +02:00
parent f614a3e480
commit dea41483b5
6 changed files with 284 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
"""Peewee ORM models — full schema for phases 1-5."""
from datetime import datetime
from peewee import (
BooleanField,
CharField,
DateTimeField,
ForeignKeyField,
IntegerField,
Model,
)
from imptune.db.database import db
class BaseModel(Model):
"""Base model that binds all models to the shared db instance."""
class Meta:
database = db
class Client(BaseModel):
"""Represents a deployment target (AD client / OU)."""
name = CharField(unique=True)
created_at = DateTimeField(default=datetime.utcnow)
class Meta:
table_name = "client"
class Driver(BaseModel):
"""Uploaded printer driver package (content-addressed by SHA256)."""
sha256 = CharField(unique=True, index=True)
original_filename = CharField()
size_bytes = IntegerField()
uploaded_at = DateTimeField(default=datetime.utcnow)
driver_desc = CharField(null=True)
inf_filename = CharField(null=True)
architecture = CharField(null=True)
has_cat_file = BooleanField(default=False)
class Meta:
table_name = "driver"
class Printer(BaseModel):
"""Printer configuration record."""
name = CharField()
ip_address = CharField()
port_name = CharField()
client = ForeignKeyField(Client, null=True, backref="printers")
driver = ForeignKeyField(Driver, null=True, backref="printers")
duplex_mode = CharField(default="OneSided")
color_mode = BooleanField(default=True)
paper_size = CharField(default="A4")
collate = BooleanField(default=True)
created_at = DateTimeField(default=datetime.utcnow)
updated_at = DateTimeField(default=datetime.utcnow)
class Meta:
table_name = "printer"
class Icon(BaseModel):
"""Printer icon image (one per printer)."""
printer = ForeignKeyField(Printer, unique=True, backref="icons")
sha256 = CharField()
original_filename = CharField()
size_bytes = IntegerField()
uploaded_at = DateTimeField(default=datetime.utcnow)
class Meta:
table_name = "icon"