Files
goodtimes/manage_events/models.py
rizwanisready 97255b2a60 transactions
2024-03-10 23:27:22 +05:30

164 lines
5.0 KiB
Python

from django.db import models
from accounts.models import BaseModel, IAmPrincipal
from django.db import transaction
# from django.contrib.gis.db import models as gis_models
# Create your models here.
class EventCategory(BaseModel):
title = models.CharField(max_length=255)
image = models.ImageField(upload_to="event_category", null=True, blank=True)
description = models.TextField(null=True, blank=True)
video_url = models.URLField(max_length=200, blank=True, null=True)
def __str__(self):
return self.title
class Venue(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True)
address = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to="venue", null=True, blank=True)
url = models.URLField(max_length=200, blank=True, null=True)
latitude = models.DecimalField(max_digits=14, decimal_places=8)
longitude = models.DecimalField(max_digits=14, decimal_places=8)
def __str__(self):
return self.title
class EventStatus(models.TextChoices):
UPCOMING = "upcoming", "Upcoming"
LIVE = "live", "Live"
POST = "post", "Post"
ARCHIVE = "archive", "Archive"
class EventMaster(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
event_category = models.ForeignKey(EventCategory, on_delete=models.CASCADE)
image = models.ImageField(upload_to="brand", null=True, blank=True)
def __str__(self):
return self.title
class Meta:
db_table = "brand"
class Event(BaseModel):
title = models.CharField(max_length=255)
category = models.ForeignKey(EventCategory, on_delete=models.CASCADE)
event_master = models.ForeignKey(
EventMaster, on_delete=models.SET_NULL, null=True, blank=True
)
description = models.TextField(blank=True, null=True)
image = models.ImageField(upload_to="event", null=True, blank=True)
status = models.CharField(
max_length=10, choices=EventStatus.choices, blank=True, null=True
)
start_date = models.DateField()
end_date = models.DateField()
from_time = models.TimeField()
to_time = models.TimeField()
venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
venue_capacity = models.IntegerField()
video_url = models.URLField(max_length=200, blank=True, null=True)
entry_type = models.CharField(
max_length=100
) # Assuming entry type is a string (e.g., Free, Ticketed)
entry_fee = models.DecimalField(
max_digits=14, decimal_places=2, default=0.00
) # Assuming it's an integer. Use DecimalField if you need to handle cents.
key_guest = models.TextField(blank=True, null=True)
age_group = models.CharField(max_length=100, blank=True, null=True)
draft = models.BooleanField(default=False)
def __str__(self):
return self.title
class Meta:
db_table = "event" # Optional: Specify custom table name
class EventInteractionType(models.TextChoices):
GOING = "going", "Going"
INTERESTED = "interested", "Interested"
class EventImage(models.Model):
event = models.ForeignKey(
Event, related_name="event_images", on_delete=models.CASCADE
)
image = models.ImageField(upload_to="event_images/")
def __str__(self):
return f"Image for event: {self.event.title}"
class EventPrincipalInteraction(models.Model):
principal = models.ForeignKey(IAmPrincipal, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
status = models.CharField(
max_length=10,
choices=EventInteractionType.choices,
)
class Meta:
unique_together = ("principal", "event")
class PrincipalPreference(BaseModel):
principal = models.OneToOneField(IAmPrincipal, on_delete=models.CASCADE)
preferred_categories = models.ManyToManyField(
EventCategory, related_name="preferred_by_users"
)
def __str__(self):
return str(self.preferred_categories)
class Meta:
db_table = "user_preference"
class Favorites(BaseModel):
principal = models.ForeignKey(
IAmPrincipal, on_delete=models.CASCADE, related_name="favorited_by"
)
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="favorites")
class Meta:
unique_together = ("principal", "event")
def __str__(self):
return f"{self.principal}'s favorite: {self.event.title}"
class EventReview(BaseModel):
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="reviews")
principal = models.ForeignKey(
IAmPrincipal, on_delete=models.CASCADE, related_name="event_reviews"
)
review_text = models.TextField()
rating = models.PositiveSmallIntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
]
)
class Meta:
# sort reviews, to show latest first by default:
ordering = ["-created_on"]
def __str__(self):
return f"Review by {self.principal} on {self.event}"