Files
thrilltrack-explorer/django-backend/apps/timeline/models.py

95 lines
2.9 KiB
Python

"""
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})"