-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserializers.py
More file actions
151 lines (109 loc) · 4.46 KB
/
Copy pathserializers.py
File metadata and controls
151 lines (109 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
140
141
142
143
144
145
146
147
148
149
150
151
from django.contrib.auth import get_user_model
from django.utils import timezone
from rest_framework import serializers
from gsr_booking.models import GSR, Group, GroupMembership, GSRBooking, GSRShareCode
User = get_user_model()
class GroupRoomBookingRequestSerializer(serializers.Serializer):
lid = serializers.IntegerField()
room = serializers.IntegerField()
start = serializers.DateTimeField()
end = serializers.DateTimeField()
is_wharton = serializers.SerializerMethodField()
def get_is_wharton(self, obj):
return obj["lid"] == 1
class GroupMembershipSerializer(serializers.ModelSerializer):
group = serializers.SlugRelatedField(slug_field="name", queryset=Group.objects.all())
color = serializers.SlugRelatedField(slug_field="color", read_only=True, source="group")
class Meta:
model = GroupMembership
fields = [
"group",
"type",
"pennkey_allow",
"notifications",
"id",
"color",
]
class GroupSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(
slug_field="username", queryset=User.objects.all(), required=False
)
memberships = GroupMembershipSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = ["owner", "memberships", "name", "color", "id"]
def create(self, validated_data):
request = self.context.get("request", None)
if request is None:
return super().create(validated_data)
if request.user.is_authenticated:
validated_data["owner"] = request.user
return super().create(validated_data)
class GroupField(serializers.RelatedField):
def to_representation(self, value):
return {"name": value.name, "id": value.id, "color": value.color}
def to_internal_value(self, data):
# TODO: If you want to update based on BookingField, implement this.
return None
class GSRSerializer(serializers.ModelSerializer):
class Meta:
model = GSR
exclude = ["in_use"]
class GSRBookingSerializer(serializers.ModelSerializer):
gsr = GSRSerializer(read_only=False, required=False)
class Meta:
model = GSRBooking
fields = ("booking_id", "gsr", "room_id", "room_name", "start", "end")
class GSRShareCodeSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
expires_at = serializers.SerializerMethodField()
booking_id = serializers.SlugRelatedField(
slug_field="booking_id",
source="booking",
queryset=GSRBooking.objects.all(),
write_only=True,
)
class Meta:
model = GSRShareCode
fields = ["code", "created_at", "expires_at", "status", "booking_id"]
read_only_fields = ["code", "created_at", "expires_at", "status"]
def get_status(self, obj):
if obj.booking.end and obj.booking.end <= timezone.now():
return "expired"
return "active"
def get_expires_at(self, obj):
return obj.booking.end
def create(self, validated_data):
booking = validated_data["booking"]
# Check if share code already exists for this booking
try:
existing_code = booking.share_code
if existing_code.is_valid():
return existing_code
# Delete invalid code
existing_code.delete()
except GSRShareCode.DoesNotExist:
# No existing share code so create a new one
pass
# Create new share code
validated_data["owner"] = self.context["request"].user
validated_data["code"] = GSRShareCode.generate_code()
return super().create(validated_data)
class SharedGSRBookingSerializer(serializers.ModelSerializer):
building = serializers.CharField(source="gsr.name")
is_valid = serializers.SerializerMethodField()
owner_name = serializers.SerializerMethodField()
class Meta:
model = GSRBooking
fields = ["room_name", "building", "start", "end", "is_valid", "owner_name"]
read_only_fields = fields
def get_owner_name(self, obj):
user = obj.reservation.creator if obj.reservation else obj.user
if not user:
return "Unknown"
full_name = f"{user.first_name} {user.last_name}".strip()
if full_name:
return full_name
return user.username
def get_is_valid(self, obj):
return obj.end and obj.end > timezone.now()