Files
eventify_backend/events/models.py
Sicherhaven 9aa7c01efe feat(favorites): add EventLike model, favorites API, and notifications module
- EventLike model (user × event unique constraint, indexed)
- contributed_by field on Event (EVT ID or email of community contributor)
- Favorites API endpoints: toggle-like, my-likes, my-liked-events
- Notifications app wired into main urls.py at /api/notifications/
- accounts migration 0014_merge_0013 (resolves split 0013 branches)
- requirements.txt updated
2026-04-07 12:56:25 +05:30

102 lines
3.5 KiB
Python

from random import choices
from django.db import models
from master_data.models import EventType
from partner.models import Partner
class Event(models.Model):
created_date = models.DateField(auto_now_add=True, db_index=True)
name = models.CharField(max_length=200)
description = models.TextField()
start_date = models.DateField(blank=True, null=True, db_index=True)
end_date = models.DateField(blank=True, null=True)
start_time = models.TimeField(blank=True, null=True)
end_time = models.TimeField(blank=True, null=True)
all_year_event = models.BooleanField(default=False)
latitude = models.DecimalField(max_digits=9, decimal_places=6)
longitude = models.DecimalField(max_digits=9, decimal_places=6)
pincode = models.CharField(max_length=10)
district = models.CharField(max_length=100)
state = models.CharField(max_length=100)
place = models.CharField(max_length=200)
is_bookable = models.BooleanField(default=False)
include_gst = models.BooleanField(default=False)
gst_percentage_1 = models.IntegerField(default=0)
gst_percentage_2 = models.IntegerField(default=0)
is_eventify_event = models.BooleanField(default=True)
outside_event_url = models.URLField(default='NA')
is_partner_event = models.BooleanField(default=False)
partner = models.ForeignKey(Partner, on_delete=models.CASCADE, blank=True, null=True)
event_type = models.ForeignKey(EventType, on_delete=models.CASCADE)
event_status = models.CharField(max_length=250, choices=[
('created', 'Created'),
('cancelled', 'Cancelled'),
('pending', 'Pending'),
('completed', 'Completed'),
('postponed', 'Postponed'),
('published', 'Published'),
('live', 'Live'),
('flagged', 'Flagged'),
], default='pending', db_index=True)
cancelled_reason = models.TextField(default='NA')
title = models.CharField(max_length=250, blank=True)
important_information = models.TextField(blank=True)
venue_name = models.CharField(max_length=250, blank=True)
source = models.CharField(max_length=50, default='eventify', choices=[
('eventify', 'Added by Eventify'),
('community', 'Community Contribution'),
('partner', 'Partner Event'),
])
is_featured = models.BooleanField(default=False, help_text='Show this event in the featured section')
is_top_event = models.BooleanField(default=False, help_text='Show this event in the Top Events section')
contributed_by = models.CharField(
max_length=100, blank=True, null=True,
help_text='Eventify ID (EVT-XXXXXXXX) or email of the community contributor',
)
def __str__(self):
return f"{self.name} ({self.start_date})"
class EventImages(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
is_primary = models.BooleanField(default=False)
event_image = models.ImageField(upload_to='event_images')
def __str__(self):
return f"{self.event_image}"
class EventLike(models.Model):
user = models.ForeignKey(
'accounts.User',
on_delete=models.CASCADE,
related_name='event_likes'
)
event = models.ForeignKey(
Event,
on_delete=models.CASCADE,
related_name='likes'
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'event')
indexes = [
models.Index(fields=['user', '-created_at']),
]
def __str__(self):
return f"{self.user.email} likes {self.event.name}"