class TPMActionPointSerializer(PermissionsBasedSerializerMixin, ActionPointBaseSerializer): reference_number = serializers.ReadOnlyField(label=_('Reference No.')) partner = MinimalPartnerOrganizationListSerializer( read_only=True, label=_('Related Partner')) intervention = SeparatedReadWriteField( read_field=BaseInterventionListSerializer(), required=False, label=_('Related PD/SSFA')) cp_output = SeparatedReadWriteField(read_field=ResultSerializer(), required=False, label=_('Related CP Output')) location = SeparatedReadWriteField(read_field=LocationLightSerializer(), required=False, label=_('Related Location')) section = SeparatedReadWriteField(read_field=SectionSerializer(), required=True, label=_('Section of Assignee')) office = SeparatedReadWriteField(read_field=OfficeSerializer(), required=True, label=_('Office of Assignee')) is_responsible = serializers.SerializerMethodField() history = HistorySerializer(many=True, label=_('History'), read_only=True, source='get_meaningful_history') url = serializers.ReadOnlyField(label=_('Link'), source='get_object_url') class Meta(ActionPointBaseSerializer.Meta): model = TPMActionPoint fields = ActionPointBaseSerializer.Meta.fields + [ 'partner', 'intervention', 'cp_output', 'location', 'tpm_activity', 'section', 'office', 'history', 'is_responsible', 'url' ] fields.remove('category') extra_kwargs = copy(ActionPointBaseSerializer.Meta.extra_kwargs) extra_kwargs.update({ 'tpm_activity': { 'label': _('Related Task') }, 'high_priority': { 'label': _('Priority') }, }) def get_is_responsible(self, obj): return self.get_user() == obj.assigned_to def create(self, validated_data): activity = validated_data['tpm_activity'] validated_data.update({ 'partner_id': activity.partner_id, }) return super(TPMActionPointSerializer, self).create(validated_data)
class InterventionLocationSectionNestedSerializer(serializers.ModelSerializer): locations = LocationLightSerializer(many=True) sector = SectionSerializer() class Meta: model = InterventionSectorLocationLink fields = ('id', 'sector', 'locations')
class ActionPointListSerializer(PermissionsBasedSerializerMixin, ActionPointBaseSerializer): related_module = serializers.ChoiceField( label=_('Related App'), choices=ActionPoint.MODULE_CHOICES, read_only=True) partner = SeparatedReadWriteField( read_field=MinimalPartnerOrganizationListSerializer( read_only=True, label=_('Partner')), ) intervention = SeparatedReadWriteField( read_field=BaseInterventionListSerializer(read_only=True, label=_('PD/SSFA')), required=False, ) cp_output = SeparatedReadWriteField( read_field=ResultSerializer(read_only=True, label=_('CP Output')), required=False, ) location = SeparatedReadWriteField(read_field=LocationLightSerializer( read_only=True, label=_('Location')), ) section = SeparatedReadWriteField( read_field=SectionSerializer(read_only=True, label=_('Section of Assignee')), required=True, ) office = SeparatedReadWriteField(read_field=OfficeSerializer( read_only=True, label=_('Office of Assignee')), required=True) class Meta(ActionPointBaseSerializer.Meta): fields = ActionPointBaseSerializer.Meta.fields + [ 'related_module', 'cp_output', 'partner', 'intervention', 'location', 'engagement', 'tpm_activity', 'travel_activity', ]
def get_locations(self, obj): return LocationLightSerializer(set( itertools.chain( *map(lambda a: a.locations.all(), obj.tpm_activities.all()))), many=True).data
class TPMActivitySerializer(PermissionsBasedSerializerMixin, WritableNestedSerializerMixin, ActivitySerializer): partner = SeparatedReadWriteField( read_field=MinimalPartnerOrganizationListSerializer( read_only=True, label=_('Implementing Partner')), ) intervention = SeparatedReadWriteField( read_field=InterventionCreateUpdateSerializer(read_only=True, label=_('PD/SSFA')), required=False, ) cp_output = SeparatedReadWriteField( read_field=ResultSerializer(read_only=True, label=_('CP Output')), required=False, ) locations = SeparatedReadWriteField(read_field=LocationLightSerializer( many=True, read_only=True, label=_('Locations')), ) section = SeparatedReadWriteField( read_field=SectionSerializer(read_only=True, label=_('Section')), required=True, ) unicef_focal_points = SeparatedReadWriteField( read_field=MinimalUserSerializer(read_only=True, many=True, label=_('UNICEF Focal Points')), required=True, ) offices = SeparatedReadWriteField( read_field=OfficeSerializer( read_only=True, many=True, label=_('Office(s) of UNICEF Focal Point(s)')), required=True, ) pv_applicable = serializers.BooleanField(read_only=True) def _validate_partner_intervention(self, validated_data, instance=None): if 'partner' in validated_data and 'intervention' not in validated_data: validated_data['intervention'] = None partner = validated_data.get('partner', instance.partner if instance else None) intervention = validated_data.get( 'intervention', instance.intervention if instance else None) if partner and partner.partner_type not in [PartnerType.GOVERNMENT, PartnerType.BILATERAL_MULTILATERAL] \ and not intervention: raise ValidationError( {'intervention': _('This field is required.')}) return instance def create(self, validated_data): self._validate_partner_intervention(validated_data) return super(TPMActivitySerializer, self).create(validated_data) def update(self, instance, validated_data): self._validate_partner_intervention(validated_data, instance=instance) return super(TPMActivitySerializer, self).update(instance, validated_data) class Meta(WritableNestedSerializerMixin.Meta): model = TPMActivity fields = [ 'id', 'partner', 'intervention', 'cp_output', 'section', 'unicef_focal_points', 'date', 'locations', 'additional_information', 'pv_applicable', 'offices', ] extra_kwargs = { 'id': { 'label': _('Task ID') }, 'date': { 'required': True }, 'partner': { 'required': True }, }
def test_LocationLightSerializer(location): ser = LocationLightSerializer(instance=location) assert ser.data