from peewee import ( BlobField, BooleanField, CharField, CompositeKey, DateTimeField, FloatField, ForeignKeyField, IntegerField, Model, TextField, ) from playhouse.sqlite_ext import JSONField class Event(Model): id = CharField(null=False, primary_key=True, max_length=30) label = CharField(index=True, max_length=20) sub_label = CharField(max_length=100, null=True) camera = CharField(index=True, max_length=20) start_time = DateTimeField() end_time = DateTimeField() top_score = ( FloatField() ) # TODO remove when columns can be dropped without rebuilding table score = ( FloatField() ) # TODO remove when columns can be dropped without rebuilding table false_positive = BooleanField() zones = JSONField() thumbnail = TextField() has_clip = BooleanField(default=True) has_snapshot = BooleanField(default=True) region = ( JSONField() ) # TODO remove when columns can be dropped without rebuilding table box = ( JSONField() ) # TODO remove when columns can be dropped without rebuilding table area = ( IntegerField() ) # TODO remove when columns can be dropped without rebuilding table retain_indefinitely = BooleanField(default=False) ratio = FloatField( default=1.0 ) # TODO remove when columns can be dropped without rebuilding table plus_id = CharField(max_length=30) model_hash = CharField(max_length=32) detector_type = CharField(max_length=32) model_type = CharField(max_length=32) data = JSONField() # ex: tracked object box, region, etc. class Timeline(Model): timestamp = DateTimeField() camera = CharField(index=True, max_length=20) source = CharField(index=True, max_length=20) # ex: tracked object, audio, external source_id = CharField(index=True, max_length=30) class_type = CharField(max_length=50) # ex: entered_zone, audio_heard data = JSONField() # ex: tracked object id, region, box, etc. class Regions(Model): camera = CharField(null=False, primary_key=True, max_length=20) grid = JSONField() # json blob of grid last_update = DateTimeField() class Recordings(Model): id = CharField(null=False, primary_key=True, max_length=30) camera = CharField(index=True, max_length=20) path = CharField(unique=True) start_time = DateTimeField() end_time = DateTimeField() duration = FloatField() motion = IntegerField(null=True) objects = IntegerField(null=True) dBFS = IntegerField(null=True) segment_size = FloatField(default=0) # this should be stored as MB regions = IntegerField(null=True) class Export(Model): id = CharField(null=False, primary_key=True, max_length=30) camera = CharField(index=True, max_length=20) name = CharField(index=True, max_length=100) date = DateTimeField() video_path = CharField(unique=True) thumb_path = CharField(unique=True) in_progress = BooleanField() class ReviewSegment(Model): id = CharField(null=False, primary_key=True, max_length=30) camera = CharField(index=True, max_length=20) start_time = DateTimeField() end_time = DateTimeField() severity = CharField(max_length=30) # alert, detection thumb_path = CharField(unique=True) data = JSONField() # additional data about detection like list of labels, zone, areas of significant motion class UserReviewStatus(Model): user_id = CharField(max_length=30) review_segment = ForeignKeyField(ReviewSegment, backref="user_reviews") has_been_reviewed = BooleanField(default=False) class Meta: indexes = ((("user_id", "review_segment"), True),) class Previews(Model): id = CharField(null=False, primary_key=True, max_length=30) camera = CharField(index=True, max_length=20) path = CharField(unique=True) start_time = DateTimeField() end_time = DateTimeField() duration = FloatField() # Used for temporary table in record/cleanup.py class RecordingsToDelete(Model): id = CharField(null=False, primary_key=False, max_length=30) class Meta: temporary = True class User(Model): username = CharField(null=False, primary_key=True, max_length=30) role = CharField( max_length=20, default="admin", ) password_hash = CharField(null=False, max_length=120) notification_tokens = JSONField() class Trigger(Model): camera = CharField(max_length=20) name = CharField() type = CharField(max_length=10) data = TextField() threshold = FloatField() model = CharField(max_length=30) embedding = BlobField() triggering_event_id = CharField(max_length=30) last_triggered = DateTimeField() class Meta: primary_key = CompositeKey("camera", "name")