category and tag functionality
This commit is contained in:
parent
175ffda130
commit
bc46ca831c
9 changed files with 177 additions and 10 deletions
|
|
@ -3,8 +3,6 @@ from web.models.category import Category
|
||||||
|
|
||||||
|
|
||||||
class CategorySerializer(serializers.ModelSerializer):
|
class CategorySerializer(serializers.ModelSerializer):
|
||||||
# to_representation(self, instance) if needed
|
|
||||||
# fk = Serializer()
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Category
|
model = Category
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,41 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from django.forms.models import model_to_dict
|
||||||
from web.models.event import Event
|
from web.models.event import Event
|
||||||
|
from web.models.event_category import EventCategory
|
||||||
|
from web.models.event_tag import EventTag
|
||||||
|
|
||||||
|
|
||||||
class EventSerializer(serializers.ModelSerializer):
|
class EventSerializer(serializers.ModelSerializer):
|
||||||
# to_representation(self, instance) if needed
|
|
||||||
# fk = Serializer()
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
representation = super().to_representation(instance)
|
||||||
|
|
||||||
|
event_categories = EventCategory.objects.filter(event=instance).filter(active=True).all()
|
||||||
|
event_tags = EventTag.objects.filter(event=instance).filter(active=True).all()
|
||||||
|
|
||||||
|
categories = []
|
||||||
|
if event_categories.exists():
|
||||||
|
for event_category in event_categories:
|
||||||
|
categories.append({
|
||||||
|
'id': event_category.category.id,
|
||||||
|
'name': event_category.category.name,
|
||||||
|
'description': event_category.category.description,
|
||||||
|
'_meta': model_to_dict(event_category)
|
||||||
|
})
|
||||||
|
|
||||||
|
tags = []
|
||||||
|
if event_tags.exists():
|
||||||
|
for event_tag in event_tags:
|
||||||
|
tags.append({
|
||||||
|
'id': event_tag.tag.id,
|
||||||
|
'name': event_tag.tag.name,
|
||||||
|
'_meta': model_to_dict(event_tag)
|
||||||
|
})
|
||||||
|
|
||||||
|
representation['categories'] = categories
|
||||||
|
representation['tags'] = tags
|
||||||
|
return representation
|
||||||
|
|
|
||||||
10
api/serializers/event_category.py
Normal file
10
api/serializers/event_category.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from web.models.event_category import EventCategory
|
||||||
|
|
||||||
|
|
||||||
|
class EventCategorySerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = EventCategory
|
||||||
|
fields = "all"
|
||||||
10
api/serializers/event_tag.py
Normal file
10
api/serializers/event_tag.py
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from web.models.event_tag import EventTag
|
||||||
|
|
||||||
|
|
||||||
|
class EventTagSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = EventTag
|
||||||
|
fields = "all"
|
||||||
|
|
@ -15,7 +15,7 @@ class BaseView(APIView):
|
||||||
def _build_multi_response(self, data):
|
def _build_multi_response(self, data):
|
||||||
serialized_data = []
|
serialized_data = []
|
||||||
for d in data:
|
for d in data:
|
||||||
serializer = self.SERIALIZER(data)
|
serializer = self.SERIALIZER(d)
|
||||||
serialized_data.append(serializer.data)
|
serialized_data.append(serializer.data)
|
||||||
|
|
||||||
response = Response()
|
response = Response()
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,25 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from django.db import transaction
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
from api.serializers.event import EventSerializer
|
from api.serializers.event import EventSerializer
|
||||||
from api.views.base import BaseView
|
from api.views.base import BaseView
|
||||||
|
from web.models.category import Category
|
||||||
|
from web.models.event_category import EventCategory
|
||||||
from web.models.event import Event
|
from web.models.event import Event
|
||||||
|
from web.models.tag import Tag
|
||||||
|
from web.models.event_tag import EventTag
|
||||||
|
|
||||||
|
|
||||||
class EventView(BaseView):
|
class EventView(BaseView):
|
||||||
SERIALIZER = EventSerializer
|
SERIALIZER = EventSerializer
|
||||||
|
|
||||||
def get(self, request, event_id):
|
def get(self, request, event_id):
|
||||||
event = get_object_or_404(Event, pk=event_id)
|
event = get_object_or_404(Event, pk=event_id, active=True)
|
||||||
return self._build_response(event)
|
return self._build_response(event)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
data = json.loads(request.body)
|
data = json.loads(request.body)
|
||||||
event = Event(
|
event = Event(
|
||||||
|
|
@ -32,8 +38,41 @@ class EventView(BaseView):
|
||||||
)
|
)
|
||||||
|
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
|
categories = data.get('categories', [])
|
||||||
|
self._create_event_categories(categories, event)
|
||||||
|
|
||||||
|
tag_names = data.get('tags', [])
|
||||||
|
self._create_event_tags(tag_names, event)
|
||||||
|
|
||||||
return self._build_response(event)
|
return self._build_response(event)
|
||||||
|
|
||||||
|
def _create_event_categories(self, categories, event):
|
||||||
|
event_categories = []
|
||||||
|
for category_id in categories:
|
||||||
|
category = get_object_or_404(Category, pk=category_id)
|
||||||
|
event_category = EventCategory(
|
||||||
|
event=event,
|
||||||
|
category=category
|
||||||
|
)
|
||||||
|
|
||||||
|
event_categories.append(event_category)
|
||||||
|
EventCategory.objects.bulk_create(event_categories)
|
||||||
|
|
||||||
|
def _create_event_tags(self, tag_names, event):
|
||||||
|
event_tags = []
|
||||||
|
for tag_name in tag_names:
|
||||||
|
tag, created = Tag.objects.get_or_create(name=tag_name)
|
||||||
|
|
||||||
|
event_tag = EventTag(
|
||||||
|
tag=tag,
|
||||||
|
event=event
|
||||||
|
)
|
||||||
|
|
||||||
|
event_tags.append(event_tag)
|
||||||
|
EventTag.objects.bulk_create(event_tags)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
def put(self, request, event_id):
|
def put(self, request, event_id):
|
||||||
data = json.loads(request.body)
|
data = json.loads(request.body)
|
||||||
|
|
||||||
|
|
@ -52,9 +91,64 @@ class EventView(BaseView):
|
||||||
event.email = data.get('email', event.email)
|
event.email = data.get('email', event.email)
|
||||||
event.phone_number = data.get('phone_number', event.phone_number)
|
event.phone_number = data.get('phone_number', event.phone_number)
|
||||||
|
|
||||||
|
categories = data.get('categories', [])
|
||||||
|
self._update_event_categories(categories, event)
|
||||||
|
|
||||||
|
tag_names = data.get('tags', [])
|
||||||
|
self._update_event_tags(tag_names, event)
|
||||||
|
|
||||||
event.save()
|
event.save()
|
||||||
self._build_response(event)
|
self._build_response(event)
|
||||||
|
|
||||||
|
def _update_event_categories(self, categories, event):
|
||||||
|
if categories:
|
||||||
|
current_event_categories = EventCategory.objects.filter(event=event).filter(active=True).all()
|
||||||
|
current_event_category_map = {ec.category.id: ec for ec in current_event_categories}
|
||||||
|
|
||||||
|
for current_event_category in current_event_categories:
|
||||||
|
if current_event_category.category.id not in categories:
|
||||||
|
current_event_category.active = False
|
||||||
|
current_event_category.save()
|
||||||
|
|
||||||
|
new_event_categories = []
|
||||||
|
for category_id in categories:
|
||||||
|
category = get_object_or_404(Category, pk=category_id)
|
||||||
|
if category not in current_event_category_map:
|
||||||
|
event_category = EventCategory(
|
||||||
|
category=category,
|
||||||
|
event=event
|
||||||
|
)
|
||||||
|
|
||||||
|
new_event_categories.append(event_category)
|
||||||
|
|
||||||
|
if new_event_categories:
|
||||||
|
EventCategory.objects.bulk_create(new_event_categories)
|
||||||
|
|
||||||
|
def _update_event_tags(self, tag_names, event):
|
||||||
|
if tag_names:
|
||||||
|
current_event_tags = EventTag.objects.filter(event=event).filter(active=True).all()
|
||||||
|
current_event_tag_names = [x.name for x in current_event_tags]
|
||||||
|
|
||||||
|
for current_event_tag in current_event_tags:
|
||||||
|
if current_event_tag.tag.name not in tag_names:
|
||||||
|
current_event_tag.active = False
|
||||||
|
current_event_tag.save()
|
||||||
|
|
||||||
|
new_event_tags = []
|
||||||
|
for tag_name in tag_names:
|
||||||
|
if tag_name not in current_event_tag_names:
|
||||||
|
tag, created = Tag.objects.get_or_create(name=tag_name)
|
||||||
|
|
||||||
|
event_tag = EventTag(
|
||||||
|
tag=tag,
|
||||||
|
event=event
|
||||||
|
)
|
||||||
|
|
||||||
|
new_event_tags.append(event_tag)
|
||||||
|
|
||||||
|
if new_event_tags:
|
||||||
|
EventTag.objects.bulk_create(new_event_tags)
|
||||||
|
|
||||||
def delete(self, request, event_id):
|
def delete(self, request, event_id):
|
||||||
event = get_object_or_404(Event, pk=event_id)
|
event = get_object_or_404(Event, pk=event_id)
|
||||||
event.active = False
|
event.active = False
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import requests
|
||||||
url = "http://127.0.0.1:8000/api/event"
|
url = "http://127.0.0.1:8000/api/event"
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"name": "Test Event 2",
|
"name": "Test Event 3",
|
||||||
"description": "this is a test",
|
"description": "this is a test",
|
||||||
"url": "https://www.domdit.com",
|
"url": "https://www.domdit.com",
|
||||||
"address": "31 Fleetwood Dr Hazlet Nj",
|
"address": "31 Fleetwood Dr Hazlet Nj",
|
||||||
|
|
@ -14,8 +14,11 @@ data = {
|
||||||
"end_time": "2026-08-14T01:34:38Z",
|
"end_time": "2026-08-14T01:34:38Z",
|
||||||
"rain_date": "2026-06-15T01:34:42Z",
|
"rain_date": "2026-06-15T01:34:42Z",
|
||||||
"email": "me@domdit.com",
|
"email": "me@domdit.com",
|
||||||
"phone_number": ""
|
"phone_number": "",
|
||||||
|
"categories": [1],
|
||||||
|
"tags": ["tag1", "tag2", "tag4"]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resp = requests.post(url, data=data)
|
resp = requests.post(url, json=data)
|
||||||
print(resp.status_code)
|
print(resp.status_code)
|
||||||
|
|
|
||||||
23
web/migrations/0002_alter_eventcategory_category.py
Normal file
23
web/migrations/0002_alter_eventcategory_category.py
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 6.0.6 on 2026-06-21 00:12
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("web", "0001_initial"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="eventcategory",
|
||||||
|
name="category",
|
||||||
|
field=models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name="category",
|
||||||
|
to="web.category",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -7,7 +7,7 @@ from web.models.category import Category
|
||||||
|
|
||||||
class EventCategory(BaseModel):
|
class EventCategory(BaseModel):
|
||||||
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
||||||
category = models.ForeignKey(Category, on_delete=models.CASCADE)
|
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="category")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'event_categories'
|
db_table = 'event_categories'
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue