Skip to content

Commit f42c8e3

Browse files
committed
Add 4 new Molnix API endpoints
1 parent e30d37c commit f42c8e3

6 files changed

Lines changed: 259 additions & 37 deletions

File tree

api/management/commands/sync_molnix_appraisals.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -568,30 +568,41 @@ def handle(self, *args, **options):
568568
org_lookup,
569569
country_lookup,
570570
)
571-
appraisal_data = normalize_appraisal(appraisal_payload, sending_org_id, receiving_org_id)
572-
if appraisal_data:
573-
appraisal_id = appraisal_data.get("molnix_id")
574-
if appraisal_id is not None:
575-
if appraisal_id in appraisal_ids:
576-
appraisal_duplicate_count += 1
577-
appraisal_ids.add(appraisal_id)
578-
appraised_person_id = appraisal_data.get("appraised_person_id")
579-
if appraised_person_id is None:
580-
appraised_person_null_count += 1
571+
appraisal_data = normalize_appraisal(appraisal_payload, sending_org_id, receiving_org_id)
572+
if appraisal_data:
573+
appraisal_id = appraisal_data.get("molnix_id")
574+
if appraisal_id is not None:
575+
if appraisal_id in appraisal_ids:
576+
appraisal_duplicate_count += 1
577+
appraisal_ids.add(appraisal_id)
578+
appraised_person_id = appraisal_data.get("appraised_person_id")
579+
if appraised_person_id is None:
580+
appraised_person_null_count += 1
581+
else:
582+
appraised_person_ids.add(appraised_person_id)
583+
output_record(self.stdout, {"record_type": "molnix_appraisal", "data": appraisal_data})
584+
if write_record("molnix_appraisal", appraisal_data):
585+
db_write_counts["molnix_appraisal"] += 1
586+
appraisals_stream_count += 1
587+
if appraisal_data.get("appraised_person_id") is not None:
588+
person_ids.append(appraisal_data.get("appraised_person_id"))
589+
appraiser_payloads = []
590+
if isinstance(appraisal_payload, dict) and isinstance(appraisal_payload.get("appraisers"), list):
591+
appraiser_payloads = appraisal_payload.get("appraisers")
592+
if appraiser_payloads:
593+
for appraiser_payload in appraiser_payloads:
594+
appraiser_data = normalize_appraiser(appraiser_payload, appraisal_data.get("molnix_id"))
595+
if appraiser_data:
596+
appraiser_parent_id = appraiser_data.get("appraisal_molnix_id")
597+
if appraiser_parent_id is not None:
598+
appraiser_parent_ids.add(appraiser_parent_id)
599+
output_record(self.stdout, {"record_type": "molnix_appraiser", "data": appraiser_data})
600+
if write_record("molnix_appraiser", appraiser_data):
601+
db_write_counts["molnix_appraiser"] += 1
602+
appraisers_stream_count += 1
603+
collect_person_ids([appraiser_data], person_ids)
581604
else:
582-
appraised_person_ids.add(appraised_person_id)
583-
output_record(self.stdout, {"record_type": "molnix_appraisal", "data": appraisal_data})
584-
if write_record("molnix_appraisal", appraisal_data):
585-
db_write_counts["molnix_appraisal"] += 1
586-
appraisals_stream_count += 1
587-
if appraisal_data.get("appraised_person_id") is not None:
588-
person_ids.append(appraisal_data.get("appraised_person_id"))
589-
appraiser_payloads = []
590-
if isinstance(appraisal_payload, dict) and isinstance(appraisal_payload.get("appraisers"), list):
591-
appraiser_payloads = appraisal_payload.get("appraisers")
592-
if appraiser_payloads:
593-
for appraiser_payload in appraiser_payloads:
594-
appraiser_data = normalize_appraiser(appraiser_payload, appraisal_data.get("molnix_id"))
605+
appraiser_data = normalize_appraiser(appraisal, appraisal_data.get("molnix_id"))
595606
if appraiser_data:
596607
appraiser_parent_id = appraiser_data.get("appraisal_molnix_id")
597608
if appraiser_parent_id is not None:
@@ -601,17 +612,6 @@ def handle(self, *args, **options):
601612
db_write_counts["molnix_appraiser"] += 1
602613
appraisers_stream_count += 1
603614
collect_person_ids([appraiser_data], person_ids)
604-
else:
605-
appraiser_data = normalize_appraiser(appraisal, appraisal_data.get("molnix_id"))
606-
if appraiser_data:
607-
appraiser_parent_id = appraiser_data.get("appraisal_molnix_id")
608-
if appraiser_parent_id is not None:
609-
appraiser_parent_ids.add(appraiser_parent_id)
610-
output_record(self.stdout, {"record_type": "molnix_appraiser", "data": appraiser_data})
611-
if write_record("molnix_appraiser", appraiser_data):
612-
db_write_counts["molnix_appraiser"] += 1
613-
appraisers_stream_count += 1
614-
collect_person_ids([appraiser_data], person_ids)
615615
total += 1
616616
if not should_continue(data, appraisals):
617617
log_debug(1, "Pagination indicates no more pages")

assets

deployments/drf_views.py

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from drf_spectacular.utils import extend_schema
1616
from openpyxl import Workbook
1717
from rest_framework import viewsets
18-
from rest_framework.authentication import TokenAuthentication
18+
from rest_framework.authentication import SessionAuthentication, TokenAuthentication
1919
from rest_framework.decorators import action
2020
from rest_framework.permissions import IsAuthenticated
2121
from rest_framework.response import Response
@@ -31,7 +31,15 @@
3131
from main.serializers import CsvListMixin
3232
from main.utils import is_tableau
3333

34-
from .filters import EmergencyProjectFilter, ERUOwnerFilter, ProjectFilter
34+
from .filters import (
35+
EmergencyProjectFilter,
36+
ERUOwnerFilter,
37+
MolnixAppraisalFilter,
38+
MolnixAppraiserFilter,
39+
ProjectFilter,
40+
RrmsEventParticipationFilter,
41+
RrmsPersonSnapshotFilter,
42+
)
3543
from .models import (
3644
ERU,
3745
EmergencyProject,
@@ -41,13 +49,17 @@
4149
ERUReadiness,
4250
ERUReadinessType,
4351
ERUType,
52+
MolnixAppraisal,
53+
MolnixAppraiser,
4454
OperationTypes,
4555
PartnerSocietyDeployment,
4656
Personnel,
4757
PersonnelDeployment,
4858
ProgrammeTypes,
4959
Project,
5060
RegionalProject,
61+
RrmsEventParticipation,
62+
RrmsPersonSnapshot,
5163
Sector,
5264
Statuses,
5365
)
@@ -65,6 +77,8 @@
6577
GlobalProjectNSOngoingProjectsStatsSerializer,
6678
GlobalProjectOverviewSerializer,
6779
MiniERUReadinessTypeSerializer,
80+
MolnixAppraisalSerializer,
81+
MolnixAppraiserSerializer,
6882
PartnerDeploymentSerializer,
6983
PartnerDeploymentTableauSerializer,
7084
PersonnelCsvSerializer,
@@ -77,6 +91,8 @@
7791
ProjectRegionOverviewSerializer,
7892
ProjectSerializer,
7993
RegionalProjectSerializer,
94+
RrmsEventParticipationSerializer,
95+
RrmsPersonSnapshotSerializer,
8096
)
8197
from .utils import get_previous_months
8298

@@ -410,6 +426,56 @@ def get_renderer_context(self):
410426
return context
411427

412428

429+
@extend_schema(
430+
request=None,
431+
responses=MolnixAppraisalSerializer(many=True),
432+
)
433+
class MolnixAppraisalViewset(viewsets.ReadOnlyModelViewSet):
434+
authentication_classes = (SessionAuthentication, TokenAuthentication)
435+
permission_classes = (IsAuthenticated, DenyGuestUserPermission)
436+
queryset = MolnixAppraisal.objects.all()
437+
serializer_class = MolnixAppraisalSerializer
438+
filterset_class = MolnixAppraisalFilter
439+
ordering_fields = ("updated_at", "created_at", "molnix_id", "appraised_person_id")
440+
441+
442+
@extend_schema(
443+
request=None,
444+
responses=MolnixAppraiserSerializer(many=True),
445+
)
446+
class MolnixAppraiserViewset(viewsets.ReadOnlyModelViewSet):
447+
authentication_classes = (SessionAuthentication, TokenAuthentication)
448+
permission_classes = (IsAuthenticated, DenyGuestUserPermission)
449+
queryset = MolnixAppraiser.objects.all()
450+
serializer_class = MolnixAppraiserSerializer
451+
filterset_class = MolnixAppraiserFilter
452+
ordering_fields = ("updated_at", "created_at", "molnix_id", "appraisal_molnix_id")
453+
454+
455+
@extend_schema(
456+
request=None,
457+
responses=RrmsPersonSnapshotSerializer(many=True),
458+
)
459+
class RrmsPersonSnapshotViewset(viewsets.ReadOnlyModelViewSet):
460+
authentication_classes = (SessionAuthentication, TokenAuthentication)
461+
permission_classes = (IsAuthenticated, DenyGuestUserPermission)
462+
queryset = RrmsPersonSnapshot.objects.all()
463+
serializer_class = RrmsPersonSnapshotSerializer
464+
filterset_class = RrmsPersonSnapshotFilter
465+
ordering_fields = ("source_updated_at", "person_id")
466+
467+
468+
@extend_schema(
469+
request=None,
470+
responses=RrmsEventParticipationSerializer(many=True),
471+
)
472+
class RrmsEventParticipationViewset(viewsets.ReadOnlyModelViewSet):
473+
queryset = RrmsEventParticipation.objects.all()
474+
serializer_class = RrmsEventParticipationSerializer
475+
filterset_class = RrmsEventParticipationFilter
476+
ordering_fields = ("event_from", "event_to", "event_id", "person_id")
477+
478+
413479
class AggregateDeployments(APIView):
414480
"""
415481
Get aggregated data for personnel deployments

deployments/filters.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010
EmergencyProjectActivitySector,
1111
ERUOwner,
1212
ERUType,
13+
MolnixAppraisal,
14+
MolnixAppraiser,
1315
OperationTypes,
1416
ProgrammeTypes,
1517
Project,
18+
RrmsEventParticipation,
19+
RrmsPersonSnapshot,
1620
Sector,
1721
SectorTag,
1822
Statuses,
@@ -161,3 +165,56 @@ def qs(self):
161165
if available is not None:
162166
eru_qs = eru_qs.filter(available=available)
163167
return qs.filter(eru__in=eru_qs).distinct()
168+
169+
170+
class MolnixAppraisalFilter(filters.FilterSet):
171+
appraised_person_id = filters.NumberFilter(field_name="appraised_person_id", lookup_expr="exact")
172+
molnix_id = filters.NumberFilter(field_name="molnix_id", lookup_expr="exact")
173+
deployment_molnix_id = filters.NumberFilter(field_name="deployment_molnix_id", lookup_expr="exact")
174+
stage = filters.CharFilter(field_name="stage", lookup_expr="exact")
175+
176+
class Meta:
177+
model = MolnixAppraisal
178+
fields = {
179+
"updated_at": ("exact", "gt", "gte", "lt", "lte"),
180+
"created_at": ("exact", "gt", "gte", "lt", "lte"),
181+
}
182+
183+
184+
class MolnixAppraiserFilter(filters.FilterSet):
185+
appraisal_molnix_id = filters.NumberFilter(field_name="appraisal_molnix_id", lookup_expr="exact")
186+
person_id = filters.NumberFilter(field_name="person_id", lookup_expr="exact")
187+
appraiser_type = filters.CharFilter(field_name="appraiser_type", lookup_expr="exact")
188+
189+
class Meta:
190+
model = MolnixAppraiser
191+
fields = {
192+
"updated_at": ("exact", "gt", "gte", "lt", "lte"),
193+
"created_at": ("exact", "gt", "gte", "lt", "lte"),
194+
}
195+
196+
197+
class RrmsPersonSnapshotFilter(filters.FilterSet):
198+
person_id = filters.NumberFilter(field_name="person_id", lookup_expr="exact")
199+
organization_id = filters.NumberFilter(field_name="organization_id", lookup_expr="exact")
200+
person_status = filters.CharFilter(field_name="person_status", lookup_expr="exact")
201+
202+
class Meta:
203+
model = RrmsPersonSnapshot
204+
fields = {
205+
"source_updated_at": ("exact", "gt", "gte", "lt", "lte"),
206+
}
207+
208+
209+
class RrmsEventParticipationFilter(filters.FilterSet):
210+
event_id = filters.NumberFilter(field_name="event_id", lookup_expr="exact")
211+
person_id = filters.NumberFilter(field_name="person_id", lookup_expr="exact")
212+
event_person_role = filters.CharFilter(field_name="event_person_role", lookup_expr="exact")
213+
event_type = filters.CharFilter(field_name="event_type", lookup_expr="exact")
214+
215+
class Meta:
216+
model = RrmsEventParticipation
217+
fields = {
218+
"event_from": ("exact", "gt", "gte", "lt", "lte"),
219+
"event_to": ("exact", "gt", "gte", "lt", "lte"),
220+
}

deployments/serializers.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
ERUReadiness,
3838
ERUReadinessType,
3939
Event,
40+
MolnixAppraisal,
41+
MolnixAppraiser,
4042
MolnixTag,
4143
OperationTypes,
4244
PartnerSocietyActivities,
@@ -47,6 +49,8 @@
4749
Project,
4850
Region,
4951
RegionalProject,
52+
RrmsEventParticipation,
53+
RrmsPersonSnapshot,
5054
)
5155

5256

@@ -291,6 +295,93 @@ class Meta:
291295
)
292296

293297

298+
class MolnixAppraisalSerializer(ModelSerializer):
299+
class Meta:
300+
model = MolnixAppraisal
301+
fields = (
302+
"id",
303+
"molnix_id",
304+
"target_id",
305+
"appraised_person_id",
306+
"deployment_molnix_id",
307+
"stage",
308+
"appraisers_count",
309+
"score",
310+
"deployment_country_id",
311+
"deployment_start",
312+
"deployment_end",
313+
"deployment_title",
314+
"sending_organization_id",
315+
"receiving_organization_id",
316+
"deployment_tags_json",
317+
"competencies_json",
318+
"personnel",
319+
"created_at",
320+
"updated_at",
321+
)
322+
323+
324+
class MolnixAppraiserSerializer(ModelSerializer):
325+
class Meta:
326+
model = MolnixAppraiser
327+
fields = (
328+
"id",
329+
"molnix_id",
330+
"appraisal_molnix_id",
331+
"appraisal",
332+
"appraiser_type",
333+
"person_id",
334+
"personnel",
335+
"required",
336+
"notified_at",
337+
"completed_at",
338+
"created_at",
339+
"updated_at",
340+
)
341+
342+
343+
class RrmsPersonSnapshotSerializer(ModelSerializer):
344+
class Meta:
345+
model = RrmsPersonSnapshot
346+
fields = (
347+
"person_id",
348+
"person_status",
349+
"sex",
350+
"current_availability",
351+
"outofscope",
352+
"organization_id",
353+
"organization_name",
354+
"roles_json",
355+
"languages_json",
356+
"tags_json",
357+
"personnel",
358+
"source_updated_at",
359+
)
360+
361+
362+
class RrmsEventParticipationSerializer(ModelSerializer):
363+
class Meta:
364+
model = RrmsEventParticipation
365+
fields = (
366+
"id",
367+
"event_id",
368+
"event_name",
369+
"person_id",
370+
"event_person_role",
371+
"event_type",
372+
"event_scale_type",
373+
"event_from",
374+
"event_to",
375+
"participant_start",
376+
"participant_end",
377+
"requested",
378+
"event_organization_id",
379+
"event_organization_name",
380+
"venue",
381+
"tags_json",
382+
)
383+
384+
294385
class PersonnelSerializerSuper(ModelSerializer):
295386
# Superusers can see molnix_status
296387
country_from = MiniCountrySerializer(allow_null=True)

0 commit comments

Comments
 (0)