WIP Activity serializer
This commit is contained in:
parent
771fdf878e
commit
26a62ea30b
4 changed files with 78 additions and 5 deletions
|
@ -1,6 +1,12 @@
|
|||
from django.contrib.auth import get_user_model
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from rest_framework import serializers
|
||||
from event.models import Event, ActivityTag, Place, ActivityTemplate
|
||||
|
||||
from event.models import Event, ActivityTag, Place, ActivityTemplate, Activity
|
||||
from api.users.serializers import UserSerializer
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
# Classes utilitaires
|
||||
|
@ -91,5 +97,36 @@ class ActivityTemplateSerializer(serializers.ModelSerializer):
|
|||
return activity_template
|
||||
|
||||
|
||||
# TODO rajouter des permissions
|
||||
class ActivitySerializer(serializers.ModelSerializer):
|
||||
pass
|
||||
event = EventSerializer(read_only=True)
|
||||
parent = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
|
||||
en_perm = UserSerializer(read_only=True)
|
||||
tags = ActivityTagSerializer(many=True)
|
||||
|
||||
class Meta:
|
||||
model = ActivityTemplate
|
||||
fields = ('id', 'title', 'event', 'parent', 'is_public', 'has_perm',
|
||||
'min_perm', 'max_perm', 'description', 'remarks', 'tags',)
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
tags_data = validated_data.pop('tags')
|
||||
validated_data.pop('event_pk')
|
||||
event = instance.event
|
||||
[setattr(instance, key, value)
|
||||
for key, value in validated_data.items()]
|
||||
instance.save()
|
||||
tags = [ActivityTag.objects.get_or_create(event=event, **tag_data)[0]
|
||||
for tag_data in tags_data]
|
||||
instance.tags = tags
|
||||
return instance
|
||||
|
||||
def create(self, validated_data):
|
||||
tags_data = validated_data.pop('tags')
|
||||
event_pk = validated_data.pop('event_pk')
|
||||
event = event_pk and get_object_or_404(Event, id=event_pk) or None
|
||||
activity = Activity.objects.create(event=event, **validated_data)
|
||||
tags = [ActivityTag.objects.get_or_create(event=event, **tag_data)[0]
|
||||
for tag_data in tags_data]
|
||||
activity.tags = tags
|
||||
return activity
|
||||
|
|
|
@ -44,6 +44,28 @@ class ActivityTemplateTest(EventBasedModelMixin, APITestCase):
|
|||
self.assertEqual(instance.tags.count(), 2)
|
||||
|
||||
|
||||
class ActivityTest(EventBasedModelMixin, APITestCase):
|
||||
model = ActivityTemplate
|
||||
base_name = 'event-activity'
|
||||
initial_count = 1
|
||||
# Creation
|
||||
data_creation = 'act1_data'
|
||||
# Update/Delete
|
||||
instance_name = 'act1'
|
||||
field_tested = 'title'
|
||||
serializer = ActivityTemplateSerializer
|
||||
|
||||
def test_create_extra(self):
|
||||
self.assertEqual(self.model.objects.get(id=1).tags.count(), 1)
|
||||
|
||||
def pre_update_extra(self, data):
|
||||
data['tags'].append(self.tag2_data)
|
||||
return data
|
||||
|
||||
def post_update_extra(self, instance):
|
||||
self.assertEqual(instance.tags.count(), 2)
|
||||
|
||||
|
||||
class EventSpecficTagTest(EventSpecificMixin, APITestCase):
|
||||
model = ActivityTag
|
||||
root_base_name = 'activitytag'
|
||||
|
|
|
@ -7,7 +7,7 @@ from django.urls import reverse
|
|||
from rest_framework.test import APIRequestFactory
|
||||
from rest_framework import status
|
||||
|
||||
from event.models import Event, Place, ActivityTag, ActivityTemplate
|
||||
from event.models import Event, Place, ActivityTag, ActivityTemplate, Activity
|
||||
|
||||
|
||||
User = get_user_model()
|
||||
|
@ -41,6 +41,8 @@ class DataBaseMixin(object):
|
|||
self.tag1 = ActivityTag.objects.create(**self.tag1_data)
|
||||
|
||||
self.act_temp1_data = {'title': "act temp1", 'is_public': True,
|
||||
'beginning': timezone.now(),
|
||||
'ending': timezone.now()+timedelta(hours=2),
|
||||
'remarks': "test remark", 'event': self.event1}
|
||||
self.act_temp2_data = {'title': "act temp2", 'is_public': False,
|
||||
'remarks': "test remark",
|
||||
|
@ -48,6 +50,16 @@ class DataBaseMixin(object):
|
|||
self.act_temp1 = ActivityTemplate.objects.create(**self.act_temp1_data)
|
||||
self.act_temp1.tags.add(self.tag1)
|
||||
|
||||
# Actitvity
|
||||
self.act1_data = {'title': "act1", 'is_public': True,
|
||||
'remarks': "test remark", 'event': self.event1}
|
||||
self.act2_data = {'title': "act2", 'is_public': False,
|
||||
"beginning": "2017-07-18T18:05:00Z",
|
||||
"ending": "2017-07-19T18:05:00Z",
|
||||
'remarks': "test remark", 'tags': [self.tag2_data, ]}
|
||||
self.act1 = Activity.objects.create(**self.act1_data)
|
||||
self.act1.tags.add(self.tag1)
|
||||
|
||||
|
||||
class EventBasedModelMixin(DataBaseMixin):
|
||||
"""
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url, include
|
||||
from rest_framework_nested.routers import SimpleRouter, NestedSimpleRouter
|
||||
from api.event.views import EventViewSet, PlaceViewSet, ActivityTagViewSet,\
|
||||
ActivityTemplateViewSet
|
||||
ActivityTemplateViewSet, ActivityViewSet
|
||||
|
||||
# Create a router and register our viewsets with it.
|
||||
router = SimpleRouter()
|
||||
|
@ -12,9 +12,11 @@ router.register(r'activitytag', ActivityTagViewSet, 'activitytag')
|
|||
# Register nested router and register someviewsets vith it
|
||||
event_router = NestedSimpleRouter(router, r'event', lookup='event')
|
||||
event_router.register(r'place', PlaceViewSet, base_name='event-place')
|
||||
event_router.register(r'tag', ActivityTagViewSet, base_name='event-activitytag')
|
||||
event_router.register(r'tag', ActivityTagViewSet,
|
||||
base_name='event-activitytag')
|
||||
event_router.register(r'activitytemplate', ActivityTemplateViewSet,
|
||||
base_name='event-activitytemplate')
|
||||
event_router.register(r'activity', ActivityViewSet, base_name='event-activity')
|
||||
|
||||
|
||||
# The API URLs are now determined automatically by the router.
|
||||
|
|
Loading…
Add table
Reference in a new issue