""" Timeline models for tracking entity lifecycle events. """ import uuid import pghistory from django.db import models @pghistory.track() class EntityTimelineEvent(models.Model): """ Tracks significant events in entity lifecycles (opening, closing, relocation, etc.) """ id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) entity_id = models.UUIDField(db_index=True) entity_type = models.CharField(max_length=50, db_index=True) event_type = models.CharField(max_length=100, help_text="Type of event: opening, closing, relocation, etc.") event_date = models.DateField() event_date_precision = models.CharField( max_length=20, null=True, blank=True, choices=[ ('day', 'Day'), ('month', 'Month'), ('year', 'Year'), ('decade', 'Decade'), ] ) title = models.CharField(max_length=255) description = models.TextField(null=True, blank=True) # Event details - for relocations, transfers, etc. from_entity_id = models.UUIDField(null=True, blank=True) to_entity_id = models.UUIDField(null=True, blank=True) from_location = models.ForeignKey( 'entities.Park', null=True, blank=True, on_delete=models.SET_NULL, related_name='timeline_from_events' ) to_location = models.ForeignKey( 'entities.Park', null=True, blank=True, on_delete=models.SET_NULL, related_name='timeline_to_events' ) from_value = models.TextField(null=True, blank=True) to_value = models.TextField(null=True, blank=True) # Moderation is_public = models.BooleanField(default=True) display_order = models.IntegerField(null=True, blank=True) # Tracking created_by = models.ForeignKey( 'users.User', null=True, blank=True, on_delete=models.SET_NULL, related_name='timeline_events_created' ) approved_by = models.ForeignKey( 'users.User', null=True, blank=True, on_delete=models.SET_NULL, related_name='timeline_events_approved' ) submission = models.ForeignKey( 'moderation.ContentSubmission', null=True, blank=True, on_delete=models.SET_NULL, related_name='timeline_events' ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = 'Timeline Event' verbose_name_plural = 'Timeline Events' ordering = ['-event_date', '-created_at'] indexes = [ models.Index(fields=['entity_type', 'entity_id', '-event_date']), models.Index(fields=['event_type', '-event_date']), models.Index(fields=['is_public', '-event_date']), ] def __str__(self): return f"{self.entity_type} {self.entity_id}: {self.title} ({self.event_date})"