mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-24 04:11:08 -05:00
- Introduced a comprehensive Secret Management Guide detailing best practices, secret classification, development setup, production management, rotation procedures, and emergency protocols. - Implemented a client-side performance monitoring script to track various metrics including page load performance, paint metrics, layout shifts, and memory usage. - Enhanced search accessibility with keyboard navigation support for search results, ensuring compliance with WCAG standards and improving user experience.
139 lines
4.4 KiB
Python
139 lines
4.4 KiB
Python
from django.contrib.postgres.fields import ArrayField
|
|
from django.db import models
|
|
from django.utils.text import slugify
|
|
from apps.core.models import TrackedModel
|
|
from apps.core.choices.fields import RichChoiceField
|
|
import pghistory
|
|
|
|
|
|
@pghistory.track()
|
|
class Company(TrackedModel):
|
|
# Import managers
|
|
from ..managers import CompanyManager
|
|
|
|
objects = CompanyManager()
|
|
|
|
name = models.CharField(max_length=255, help_text="Company name")
|
|
slug = models.SlugField(max_length=255, unique=True, help_text="URL-friendly identifier")
|
|
roles = ArrayField(
|
|
RichChoiceField(choice_group="company_roles", domain="parks", max_length=20),
|
|
default=list,
|
|
blank=True,
|
|
help_text="Company roles (operator, manufacturer, etc.)",
|
|
)
|
|
description = models.TextField(blank=True, help_text="Detailed company description")
|
|
website = models.URLField(blank=True, help_text="Company website URL")
|
|
|
|
# Operator-specific fields
|
|
founded_year = models.PositiveIntegerField(
|
|
blank=True, null=True, help_text="Year the company was founded"
|
|
)
|
|
parks_count = models.IntegerField(
|
|
default=0, help_text="Number of parks operated (auto-calculated)"
|
|
)
|
|
rides_count = models.IntegerField(
|
|
default=0, help_text="Number of rides manufactured (auto-calculated)"
|
|
)
|
|
|
|
def save(self, *args, **kwargs):
|
|
if not self.slug:
|
|
self.slug = slugify(self.name)
|
|
super().save(*args, **kwargs)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class Meta(TrackedModel.Meta):
|
|
app_label = "parks"
|
|
verbose_name = "Company"
|
|
verbose_name_plural = "Companies"
|
|
ordering = ["name"]
|
|
|
|
|
|
@pghistory.track()
|
|
class CompanyHeadquarters(models.Model):
|
|
"""
|
|
Simple address storage for company headquarters without coordinate tracking.
|
|
Focus on human-readable location information for display purposes.
|
|
"""
|
|
|
|
# Relationships
|
|
company = models.OneToOneField(
|
|
"Company",
|
|
on_delete=models.CASCADE,
|
|
related_name="headquarters",
|
|
help_text="Company this headquarters belongs to",
|
|
)
|
|
|
|
# Address Fields (No coordinates needed)
|
|
street_address = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
help_text="Mailing address if publicly available",
|
|
)
|
|
city = models.CharField(
|
|
max_length=100, db_index=True, help_text="Headquarters city"
|
|
)
|
|
state_province = models.CharField(
|
|
max_length=100,
|
|
blank=True,
|
|
db_index=True,
|
|
help_text="State/Province/Region",
|
|
)
|
|
country = models.CharField(
|
|
max_length=100,
|
|
default="USA",
|
|
db_index=True,
|
|
help_text="Country where headquarters is located",
|
|
)
|
|
postal_code = models.CharField(
|
|
max_length=20, blank=True, help_text="ZIP or postal code"
|
|
)
|
|
|
|
# Optional mailing address if different or more complete
|
|
mailing_address = models.TextField(
|
|
blank=True,
|
|
help_text="Complete mailing address if different from basic address",
|
|
)
|
|
|
|
# Metadata
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
@property
|
|
def formatted_location(self):
|
|
"""Returns a formatted address string for display."""
|
|
components = []
|
|
if self.street_address:
|
|
components.append(self.street_address)
|
|
if self.city:
|
|
components.append(self.city)
|
|
if self.state_province:
|
|
components.append(self.state_province)
|
|
if self.postal_code:
|
|
components.append(self.postal_code)
|
|
if self.country and self.country != "USA":
|
|
components.append(self.country)
|
|
return ", ".join(components) if components else f"{self.city}, {self.country}"
|
|
|
|
@property
|
|
def location_display(self):
|
|
"""Simple city, state/country display for compact views."""
|
|
parts = [self.city]
|
|
if self.state_province:
|
|
parts.append(self.state_province)
|
|
elif self.country != "USA":
|
|
parts.append(self.country)
|
|
return ", ".join(parts) if parts else "Unknown Location"
|
|
|
|
def __str__(self):
|
|
return f"{self.company.name} Headquarters - {self.location_display}"
|
|
|
|
class Meta:
|
|
verbose_name = "Company Headquarters"
|
|
verbose_name_plural = "Company Headquarters"
|
|
ordering = ["company__name"]
|
|
indexes = [
|
|
models.Index(fields=["city", "country"]),
|
|
]
|