Skip to content

Commit b6f3c28

Browse files
committed
Return user locale in assignments endpoint
1 parent 4702291 commit b6f3c28

File tree

2 files changed

+80
-66
lines changed

2 files changed

+80
-66
lines changed

api/serializers.py

Lines changed: 77 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
User = get_user_model()
5050

5151

52-
class SimpleUserSerializer(serializers.ModelSerializer):
52+
class SimpleRegularUserSerializer(serializers.ModelSerializer):
5353

5454
full_name = serializers.SerializerMethodField()
5555

@@ -122,6 +122,73 @@ class Meta:
122122
"received_at": {"source": "server_upload_time"},
123123
}
124124

125+
class UserSerializer(serializers.ModelSerializer):
126+
class UserScoreSerializer(serializers.ModelSerializer):
127+
value = serializers.IntegerField(source="score_v2", min_value=0, read_only=True)
128+
updated_at = serializers.DateTimeField(source="last_score_update", read_only=True, allow_null=True)
129+
130+
class Meta:
131+
model = TigaUser
132+
fields = ("value", "updated_at")
133+
134+
uuid = serializers.UUIDField(source="user_UUID", read_only=True)
135+
language_iso = serializers.SerializerMethodField(help_text='ISO 639-1 code', default='en')
136+
username = serializers.SerializerMethodField()
137+
is_guest = serializers.SerializerMethodField()
138+
score = UserScoreSerializer(source='*', read_only=True)
139+
140+
def get_is_guest(self, obj) -> bool:
141+
return True
142+
143+
def get_username(self, obj) -> str:
144+
return obj.get_username()
145+
146+
def get_language_iso(self, obj) -> str:
147+
return obj.language_iso2
148+
149+
def to_representation(self, instance):
150+
if isinstance(instance, User):
151+
# NOTE: this must be the same structure as defined.
152+
data = {}
153+
data['uuid'] = uuid.UUID(int=instance.pk)
154+
data['username'] = instance.get_username()
155+
data['registration_time'] = instance.date_joined
156+
data['locale'] = 'en'
157+
data['language_iso'] = 'en'
158+
data['is_guest'] = False
159+
data['score'] = {
160+
'value': 0,
161+
'updated_at': None
162+
}
163+
return data
164+
165+
return super().to_representation(instance)
166+
167+
class Meta:
168+
model = TigaUser
169+
fields = (
170+
"uuid",
171+
"username",
172+
"registration_time",
173+
"locale",
174+
"language_iso",
175+
"is_guest",
176+
"score",
177+
)
178+
read_only_fields = (
179+
"registration_time",
180+
"score",
181+
)
182+
extra_kwargs = {
183+
"locale": {"default": "en"},
184+
}
185+
186+
class SimpleUserSerializer(UserSerializer):
187+
class Meta(UserSerializer.Meta):
188+
fields = (
189+
"uuid",
190+
"locale"
191+
)
125192

126193
#### START NOTIFICATION SERIALIZERS ####
127194
class NotificationSerializer(serializers.ModelSerializer):
@@ -639,7 +706,7 @@ class SimplifiedObservationWithPhotosSerializer(BaseSimplifiedReportSerializerWi
639706
class Meta(BaseSimplifiedReportSerializerWithPhoto.Meta):
640707
pass
641708

642-
class SimpleAnnotatorUserSerializer(SimpleUserSerializer):
709+
class SimpleAnnotatorUserSerializer(SimpleRegularUserSerializer):
643710
def to_representation(self, instance):
644711
# Get the request user
645712
user = self.context.get('request').user
@@ -835,7 +902,14 @@ class Meta:
835902
fields = ('annotation_type',)
836903

837904
class AssignmentSerializer(BaseAssignmentSerializer):
838-
observation = SimplifiedObservationWithPhotosSerializer(source='report', read_only=True)
905+
class SimplifiedObservation(SimplifiedObservationWithPhotosSerializer):
906+
user = SimpleUserSerializer(read_only=True)
907+
class Meta(SimplifiedObservationWithPhotosSerializer.Meta):
908+
fields = tuple(
909+
fname for fname in SimplifiedObservationWithPhotosSerializer.Meta.fields if fname != 'user_uuid'
910+
) + ("user",)
911+
912+
observation = SimplifiedObservation(source='report', read_only=True)
839913
class Meta(BaseAssignmentSerializer.Meta):
840914
fields = ('observation', ) + BaseAssignmentSerializer.Meta.fields
841915

@@ -1099,68 +1173,6 @@ class Meta(BaseReportWithPhotosSerializer.Meta):
10991173
#### END REPORT SERIALIZERS ####
11001174

11011175

1102-
class UserSerializer(serializers.ModelSerializer):
1103-
class UserScoreSerializer(serializers.ModelSerializer):
1104-
value = serializers.IntegerField(source="score_v2", min_value=0, read_only=True)
1105-
updated_at = serializers.DateTimeField(source="last_score_update", read_only=True, allow_null=True)
1106-
1107-
class Meta:
1108-
model = TigaUser
1109-
fields = ("value", "updated_at")
1110-
1111-
uuid = serializers.UUIDField(source="user_UUID", read_only=True)
1112-
language_iso = serializers.SerializerMethodField(help_text='ISO 639-1 code', default='en')
1113-
username = serializers.SerializerMethodField()
1114-
is_guest = serializers.SerializerMethodField()
1115-
score = UserScoreSerializer(source='*', read_only=True)
1116-
1117-
def get_is_guest(self, obj) -> bool:
1118-
return True
1119-
1120-
def get_username(self, obj) -> str:
1121-
return obj.get_username()
1122-
1123-
def get_language_iso(self, obj) -> str:
1124-
return obj.language_iso2
1125-
1126-
def to_representation(self, instance):
1127-
if isinstance(instance, User):
1128-
# NOTE: this must be the same structure as defined.
1129-
data = {}
1130-
data['uuid'] = uuid.UUID(int=instance.pk)
1131-
data['username'] = instance.get_username()
1132-
data['registration_time'] = instance.date_joined
1133-
data['locale'] = 'en'
1134-
data['language_iso'] = 'en'
1135-
data['is_guest'] = False
1136-
data['score'] = {
1137-
'value': 0,
1138-
'updated_at': None
1139-
}
1140-
return data
1141-
1142-
return super().to_representation(instance)
1143-
1144-
class Meta:
1145-
model = TigaUser
1146-
fields = (
1147-
"uuid",
1148-
"username",
1149-
"registration_time",
1150-
"locale",
1151-
"language_iso",
1152-
"is_guest",
1153-
"score",
1154-
)
1155-
read_only_fields = (
1156-
"registration_time",
1157-
"score",
1158-
)
1159-
extra_kwargs = {
1160-
"locale": {"default": "en"},
1161-
}
1162-
1163-
11641176
class PhotoSerializer(serializers.ModelSerializer):
11651177

11661178
image_path = serializers.SerializerMethodField(help_text="Internal server path of the image.")

api/tests/integration/identification_tasks/assignments/schema.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ variables:
88
response_data_validation: &retrieve_validation
99
observation:
1010
uuid: !re_fullmatch "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
11-
user_uuid: !re_fullmatch "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
11+
user:
12+
uuid: !re_fullmatch "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
13+
locale: !anystr
1214
created_at: !re_fullmatch \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{6}Z
1315
created_at_local: !re_fullmatch \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{6}([+-]\d{2}:\d{2}|Z)
1416
received_at: !re_fullmatch \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{6}Z

0 commit comments

Comments
 (0)