serializers.py 6.1 KB
Newer Older
1
from django.urls import reverse
2
from django.utils import timezone
3
from django.utils.html import strip_tags
4
5
from rest_framework import serializers

6
from events.models import Event, Registration
7
from thaliawebsite.settings import settings
8
9
10
11
12
13
14


class CalenderJSSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'start', 'end', 'all_day', 'is_birthday',
            'url', 'title', 'description',
15
16
            'backgroundColor', 'textColor', 'blank',
            'registered'
17
18
19
20
21
22
23
24
25
        )

    start = serializers.SerializerMethodField('_start')
    end = serializers.SerializerMethodField('_end')
    all_day = serializers.SerializerMethodField('_all_day')
    is_birthday = serializers.SerializerMethodField('_is_birthday')
    url = serializers.SerializerMethodField('_url')
    title = serializers.SerializerMethodField('_title')
    description = serializers.SerializerMethodField('_description')
26
27
28
    backgroundColor = serializers.SerializerMethodField('_background_color')
    textColor = serializers.SerializerMethodField('_text_color')
    blank = serializers.SerializerMethodField('_target_blank')
29
    registered = serializers.SerializerMethodField('_registered')
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

    def _start(self, instance):
        return timezone.localtime(instance.start)

    def _end(self, instance):
        return timezone.localtime(instance.end)

    def _all_day(self, instance):
        return False

    def _is_birthday(self, instance):
        return False

    def _url(self, instance):
        raise NotImplementedError

    def _title(self, instance):
        return instance.title

    def _description(self, instance):
50
        return strip_tags(instance.description)
51
52
53
54
55
56
57
58
59
60

    def _background_color(self, instance):
        pass

    def _text_color(self, instance):
        pass

    def _target_blank(self, instance):
        return False

61
62
63
    def _registered(self, instance):
        return None

64

65
class EventCalenderJSSerializer(CalenderJSSerializer):
66
67
68
69
    class Meta(CalenderJSSerializer.Meta):
        model = Event

    def _url(self, instance):
70
        return reverse('events:event', kwargs={'event_id': instance.id})
71
72
73

    def _registered(self, instance):
        try:
74
75
76
            return instance.is_member_registered(self.context['user'].member)
        except AttributeError:
            return None
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91


class UnpublishedEventSerializer(CalenderJSSerializer):
    class Meta(CalenderJSSerializer.Meta):
        model = Event

    def _background_color(self, instance):
        return "#888888"

    def _text_color(self, instance):
        return "white"

    def _url(self, instance):
        return reverse('events:admin-details', kwargs={
            'event_id': instance.id})
Gijs Hendriksen's avatar
Gijs Hendriksen committed
92
93


94
class EventRetrieveSerializer(serializers.ModelSerializer):
Gijs Hendriksen's avatar
Gijs Hendriksen committed
95
96
    class Meta:
        model = Event
97
98
99
100
101
102
        fields = ('pk', 'title', 'description', 'start', 'end', 'organiser',
                  'category', 'registration_start', 'registration_end',
                  'cancel_deadline', 'location', 'map_location', 'price',
                  'fine', 'max_participants', 'num_participants', 'status',
                  'user_registration', 'registration_allowed',
                  'no_registration_message', 'has_fields')
AuckeBos's avatar
AuckeBos committed
103

104
    description = serializers.SerializerMethodField('_description')
105
106
107
108
109
    user_registration = serializers.SerializerMethodField('_user_registration')
    num_participants = serializers.SerializerMethodField('_num_participants')
    registration_allowed = serializers.SerializerMethodField(
        '_registration_allowed')
    has_fields = serializers.SerializerMethodField('_has_fields')
AuckeBos's avatar
AuckeBos committed
110

111
112
    def _description(self, instance):
        return strip_tags(instance.description)
113

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    def _num_participants(self, instance):
        return instance.num_participants()

    def _user_registration(self, instance):
        try:
            reg = instance.registration_set.get(
                member=self.context['request'].user.member)
            return {
                'registered_on': reg.date,
                'queue_position': reg.queue_position()
                if reg.queue_position() > 0 else None,
                'is_cancelled': reg.date_cancelled is not None,
                'is_late_cancellation': reg.is_late_cancellation(),
            }
        except Registration.DoesNotExist:
            return None

    def _registration_allowed(self, instance):
        member = self.context['request'].user.member
        return (member is not None and
                member.current_membership is not None and
                member.can_attend_events)

    def _has_fields(self, instance):
        return instance.has_fields()

140

141
class EventListSerializer(serializers.ModelSerializer):
AuckeBos's avatar
AuckeBos committed
142
143
    class Meta:
        model = Event
144
145
        fields = ('pk', 'title', 'description', 'start', 'end',
                  'location', 'price', 'registered')
146
147

    description = serializers.SerializerMethodField('_description')
148
    registered = serializers.SerializerMethodField('_registered')
149
150
151

    def _description(self, instance):
        return strip_tags(instance.description)
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181

    def _registered(self, instance):
        try:
            return instance.is_member_registered(
                self.context['request'].user.member)
        except AttributeError:
            return None


class EventRegistrationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Registration
        fields = ('pk', 'member', 'name', 'photo')

    name = serializers.SerializerMethodField('_name')
    photo = serializers.SerializerMethodField('_photo')
    member = serializers.SerializerMethodField('_member')

    def _member(self, instance):
        if instance.member:
            return instance.member.pk
        return None

    def _name(self, instance):
        if instance.member:
            return instance.member.display_name()
        return instance.name

    def _photo(self, instance):
        if instance.member and instance.member.photo:
182
183
            return self.context['request'].build_absolute_uri(
                '%s%s' % (settings.MEDIA_URL, instance.member.photo))
184
        else:
185
186
            return self.context['request'].build_absolute_uri(
                'members/images/default-avatar.jpg')