class LocationSerializer(DynamicFieldsModelSerializer): class LocationIdSerializer(serializers.Serializer): vocabulary = VocabularySerializer(source='location_id_vocabulary') code = serializers.CharField(source='location_id_code') class PointSerializer(serializers.Serializer): pos = PointField(source='point_pos') srsName = serializers.CharField(source="point_srs_name") class AdministrativeSerializer(serializers.ModelSerializer): code = serializers.CharField() vocabulary = VocabularySerializer() class Meta: model = iati_models.LocationAdministrative fields = ( 'code', 'vocabulary', 'level', ) url = serializers.HyperlinkedIdentityField( view_name='locations:location-detail') activity = ActivitySerializer(read_only=True, fields=('id', 'url', 'title')) location_reach = CodelistSerializer() location_id = LocationIdSerializer(source='*') name = NarrativeContainerSerializer(many=True, source="locationname_set") description = NarrativeContainerSerializer( many=True, source="locationdescription_set") activity_description = NarrativeContainerSerializer( many=True, source="locationactivitydescription_set") administrative = AdministrativeSerializer( many=True, source="locationadministrative_set") point = PointSerializer(source="*") exactness = CodelistSerializer() location_class = CodelistSerializer() feature_designation = CodelistCategorySerializer() class Meta: model = iati_models.Location fields = ( 'id', 'url', 'activity', 'ref', 'location_reach', 'location_id', 'name', 'description', 'activity_description', 'administrative', 'point', 'exactness', 'location_class', 'feature_designation', )
class HumanitarianScopeSerializer(DynamicFieldsModelSerializer): type = CodelistSerializer() vocabulary = VocabularySerializer() vocabulary_uri = serializers.URLField() code = CodelistSerializer() class Meta: model = iati_models.HumanitarianScope fields = ( 'type', 'vocabulary', 'vocabulary_uri', 'code', )
class ActivityPolicyMarkerSerializer(serializers.ModelSerializer): code = CodelistSerializer() vocabulary = VocabularySerializer() vocabulary_uri = serializers.URLField() significance = CodelistSerializer() narratives = NarrativeSerializer(many=True) class Meta: model = iati_models.ActivityPolicyMarker fields = ( 'narratives', 'vocabulary', 'vocabulary_uri', 'significance', 'code', )
class ActivityDateSerializer(serializers.Serializer): type = CodelistSerializer() iso_date = serializers.DateTimeField() class Meta: model = iati_models.ActivityDate fields = ('iso_date', 'type')
class BudgetSerializer(serializers.ModelSerializer): value = ValueSerializer(source='*') type = CodelistSerializer() status = CodelistSerializer() class Meta: model = iati_models.Budget # filter_class = BudgetFilter fields = ( 'type', 'status', 'period_start', 'period_end', 'value', )
class ParticipatingOrganisationSerializer(serializers.ModelSerializer): # TODO: Link to organisation standard (hyperlinked) ref = serializers.CharField(source='normalized_ref') type = CodelistSerializer() role = CodelistSerializer() activity_id = serializers.CharField(source='org_activity_id') narratives = NarrativeSerializer(many=True) class Meta: model = iati_models.ActivityParticipatingOrganisation fields = ( 'ref', 'type', 'role', 'activity_id', 'narratives', )
class DescriptionSerializer(serializers.ModelSerializer): type = CodelistSerializer() narratives = NarrativeSerializer(many=True) class Meta: model = iati_models.Description fields = ( 'type', 'narratives' )
class TransactionProviderSerializer(serializers.ModelSerializer): ref = serializers.CharField() type = CodelistSerializer() narratives = NarrativeSerializer(many=True) provider_activity_id = serializers.CharField( source="provider_activity_ref", required=False) class Meta: model = models.TransactionProvider fields = ('ref', 'type', 'provider_activity_id', 'narratives')
class TransactionReceiverSerializer(serializers.ModelSerializer): ref = serializers.CharField() type = CodelistSerializer() narratives = NarrativeSerializer(many=True) receiver_activity_id = serializers.CharField( source="receiver_activity_ref") class Meta: model = models.TransactionReceiver fields = ('ref', 'type', 'receiver_activity', 'receiver_activity_id', 'narratives')
class OrganisationDocumentLinkRecipientCountrySerializer( ModelSerializerNoValidation): recipient_country = CodelistSerializer() document_link = serializers.CharField(write_only=True) budget_lines = RecipientCountryBudgetLineSerializer( many=True, source="recipientcountrybudgetline_set", required=False) class Meta: model = org_models.DocumentLinkRecipientCountry fields = ( 'document_link', 'id', 'recipient_country', 'budget_lines', ) def validate(self, data): document_link = get_or_raise(org_models.OrganisationDocumentLink, data, 'document_link') validated = validators.document_link_recipient_country( document_link, data.get('recipient_country', {}).get('code'), ) return handle_errors(validated) def create(self, validated_data): document_link = validated_data.get('document_link') instance = org_models.DocumentLinkRecipientCountry.objects.create( **validated_data) document_link.organisation.modified = True document_link.organisation.save() return instance def update(self, instance, validated_data): document_link = validated_data.get('document_link') update_instance = org_models.DocumentLinkRecipientCountry( **validated_data) update_instance.id = instance.id update_instance.save() document_link.organisation.modified = True document_link.organisation.save() return update_instance
class PlannedDisbursementSerializer(serializers.ModelSerializer): value = ValueSerializer(source='*') type = CodelistSerializer() class Meta: model = iati_models.PlannedDisbursement fields = ( 'type', 'period_start', 'period_end', 'value', )
class TransactionReceiverSerializer(serializers.ModelSerializer): ref = serializers.CharField() type = CodelistSerializer() narratives = NarrativeSerializer(many=True) receiver_activity = serializers.HyperlinkedRelatedField( read_only=True, view_name='activities:activity-detail') receiver_activity_id = serializers.CharField( source="receiver_activity_ref") class Meta: model = models.TransactionReceiver fields = ('ref', 'type', 'receiver_activity', 'receiver_activity_id', 'narratives')
class ValueSerializer(SerializerNoValidation): currency = CodelistSerializer() date = serializers.CharField(source='value_date') value = serializers.DecimalField( max_digits=15, decimal_places=2, coerce_to_string=False, ) class Meta: fields = ( 'value', 'date', 'currency', )
class ResultSerializer(serializers.ModelSerializer): type = CodelistSerializer() title = NarrativeContainerSerializer(source="resulttitle") description = NarrativeContainerSerializer(source="resultdescription") indicator = ResultIndicatorSerializer(source='resultindicator_set', many=True) class Meta: model = iati_models.Result fields = ( 'title', 'description', 'indicator', 'type', 'aggregation_status', )
class OrganisationDocumentLinkLanguageSerializer(ModelSerializerNoValidation): id = serializers.HiddenField(default=None) language = CodelistSerializer() document_link = serializers.CharField(write_only=True) class Meta: model = org_models.OrganisationDocumentLinkLanguage fields = ( 'document_link', 'id', 'language', ) def validate(self, data): document_link = get_or_raise(org_models.OrganisationDocumentLink, data, 'document_link') validated = validators.document_link_language( document_link, data.get('language', {}).get('code'), ) return handle_errors(validated) def create(self, validated_data): document_link = validated_data.get('document_link') instance = org_models.OrganisationDocumentLinkLanguage.objects.create( **validated_data) document_link.organisation.modified = True document_link.organisation.save() return instance def update(self, instance, validated_data): document_link = validated_data.get('document_link') update_instance = org_models.OrganisationDocumentLinkLanguage( **validated_data) update_instance.id = instance.id update_instance.save() document_link.organisation.modified = True document_link.organisation.save() return update_instance
class OrganisationReportingOrganisationSerializer(ModelSerializerNoValidation): xml_meta = {'attributes': ('ref', 'type', 'secondary_reporter')} ref = serializers.CharField(source="reporting_org_identifier") type = CodelistSerializer(source="org_type") secondary_reporter = BoolToNumField() narratives = OrganisationNarrativeSerializer(many=True) class Meta: model = org_models.OrganisationReportingOrganisation fields = ( 'ref', 'type', 'secondary_reporter', 'narratives', )
class DocumentLinkSerializer(serializers.ModelSerializer): class DocumentDateSerializer(serializers.Serializer): iso_date = serializers.DateField() format = CodelistSerializer(source='file_format') categories = DocumentCategorySerializer(many=True) title = NarrativeContainerSerializer(source="documentlinktitle") document_date = DocumentDateSerializer(source="*") class Meta: model = iati_models.DocumentLink fields = ( 'url', 'format', 'categories', 'title', 'document_date', )
class ReportingOrganisationSerializer(DynamicFieldsModelSerializer): # TODO: Link to organisation standard (hyperlinked) ref = serializers.CharField(source="normalized_ref") type = CodelistSerializer() secondary_reporter = serializers.BooleanField() narratives = NarrativeSerializer(many=True) # organisation = OrganisationSerializer() organisation = serializers.HyperlinkedRelatedField(view_name='organisations:organisation-detail', read_only=True) class Meta: model = iati_models.ActivityReportingOrganisation fields = ( 'ref', 'organisation', 'type', 'secondary_reporter', 'narratives', )
class ResultIndicatorSerializer(serializers.ModelSerializer): title = NarrativeContainerSerializer(source="resultindicatortitle") description = NarrativeContainerSerializer(source="resultindicatordescription") # TODO 2.02 reference = ? baseline = ResultIndicatorBaselineSerializer(source="*") period = ResultIndicatorPeriodSerializer(source='resultindicatorperiod_set', many=True) measure = CodelistSerializer() class Meta: model = iati_models.ResultIndicator fields = ( 'title', 'description', 'baseline', 'period', 'measure', 'ascending' )
class TransactionProviderSerializer(serializers.ModelSerializer): ref = serializers.CharField() type = CodelistSerializer() narrative = NarrativeSerializer(many=True, source='narratives') provider_activity = serializers.HyperlinkedRelatedField( read_only=True, view_name='activities:activity-detail') provider_activity_id = serializers.CharField( source="provider_activity_ref", required=False) class Meta: model = models.TransactionProvider fields = ( 'ref', 'type', 'provider_activity', 'provider_activity_id', 'narrative' )
class ContactInfoSerializer(serializers.ModelSerializer): type = CodelistSerializer() organisation = NarrativeContainerSerializer() department = NarrativeContainerSerializer() person_name = NarrativeContainerSerializer() job_title = NarrativeContainerSerializer() mailing_address = NarrativeContainerSerializer() class Meta: model = iati_models.ContactInfo fields = ( 'type', 'organisation', 'department', 'person_name', 'job_title', 'telephone', 'email', 'website', 'mailing_address', )
class TransactionSerializer(DynamicFieldsModelSerializer): """ Transaction serializer class """ url = serializers.HyperlinkedIdentityField( view_name='transactions:transaction-detail', lookup_field='pk') activity = ActivitySerializer(read_only=True, fields=('id', 'url')) aid_type = CodelistSerializer() finance_type = CodelistSerializer() flow_type = CodelistSerializer() provider_organisation = TransactionProviderSerializer() receiver_organisation = TransactionReceiverSerializer() tied_status = CodelistSerializer() transaction_type = CodelistSerializer() currency = CodelistSerializer() description = TransactionDescriptionSerializer() humanitarian = serializers.BooleanField() class Meta: model = models.Transaction fields = ( 'ref', 'humanitarian', 'url', 'activity', 'aid_type', 'description', 'disbursement_channel', 'finance_type', 'flow_type', 'provider_organisation', 'receiver_organisation', 'tied_status', 'transaction_date', 'transaction_type', 'value_date', 'value', 'currency', )
class OrganisationTotalBudgetSerializer(ModelSerializerNoValidation): organisation = serializers.CharField(write_only=True) organisation_identifier = serializers.CharField( source='organisation.organisation_identifier', required=False) value = ValueSerializer(source='*') status = CodelistSerializer() # because we want to validate in the validator instead period_start = serializers.CharField() period_end = serializers.CharField() budget_lines = TotalBudgetBudgetLineSerializer( many=True, source="totalbudgetline_set", required=False) class Meta: model = org_models.TotalBudget # filter_class = BudgetFilter fields = ( 'organisation', 'organisation_identifier', 'id', 'status', 'period_start', 'period_end', 'value', 'budget_lines', ) def validate(self, data): organisation = get_or_raise( org_models.Organisation, data, 'organisation') validated = validators.organisation_total_budget( organisation, data.get('status', {}).get('code'), data.get('period_start'), data.get('period_end'), data.get('value'), data.get('currency').get('code'), data.get('value_date'), ) return handle_errors(validated) def create(self, validated_data): organisation = validated_data.get('organisation') instance = org_models.TotalBudget.objects.create(**validated_data) organisation.modified = True organisation.save() return instance def update(self, instance, validated_data): organisation = validated_data.get('organisation') update_instance = org_models.TotalBudget(**validated_data) update_instance.id = instance.id update_instance.save() organisation.modified = True organisation.save() return update_instance
class OrganisationRecipientOrgBudgetSerializer(ModelSerializerNoValidation): class RecipientOrganisationSerializer(SerializerNoValidation): ref = serializers.CharField(source="recipient_org_identifier") narrative = OrganisationNarrativeSerializer(many=True, read_only=True, source='narratives') class Meta: fields = ( 'ref', 'narrative', ) id = serializers.HiddenField(default=None) organisation = serializers.CharField(write_only=True) organisation_identifier = serializers.CharField( source="organisation.organisation_identifier") value = ValueSerializer(source='*') status = CodelistSerializer() # because we want to validate in the validator instead period_start = serializers.CharField() period_end = serializers.CharField() recipient_org = RecipientOrganisationSerializer(source="*") budget_lines = RecipientOrgBudgetLineSerializer( many=True, source="recipientorgbudgetline_set", required=False) class Meta: model = org_models.RecipientOrgBudget fields = ( 'organisation', 'organisation_identifier', 'id', 'status', 'recipient_org', 'period_start', 'period_end', 'value', 'budget_lines', ) def validate(self, data): organisation = get_or_raise(org_models.Organisation, data, 'organisation') validated = validators.organisation_recipient_org_budget( organisation, data.get('status', {}).get('code'), data.get('recipient_org_identifier'), data.get('period_start'), data.get('period_end'), data.get('value'), data.get('currency').get('code'), data.get('value_date'), ) return handle_errors(validated) def create(self, validated_data): organisation = validated_data.get('organisation') instance = org_models.RecipientOrgBudget.objects.create( **validated_data) organisation.modified = True organisation.save() return instance def update(self, instance, validated_data): organisation = validated_data.get('organisation') update_instance = org_models.RecipientOrgBudget(**validated_data) update_instance.id = instance.id update_instance.save() organisation.modified = True organisation.save() return update_instance
class TransactionSerializer(DynamicFieldsModelSerializer): """ Transaction serializer class """ url = serializers.HyperlinkedIdentityField( view_name='transactions:transaction-detail', lookup_field='pk', read_only=True ) transaction_date = serializers.CharField() value_date = serializers.CharField() aid_type = CodelistSerializer() disbursement_channel = CodelistSerializer() finance_type = CodelistSerializer() flow_type = CodelistSerializer() provider_organisation = TransactionProviderSerializer(required=False) receiver_organisation = TransactionReceiverSerializer(required=False) disbursement_channel = CodelistSerializer() sector = TransactionSectorSerializer(required=False, source="transaction_sector") recipient_country = TransactionRecipientCountrySerializer( required=False, source="transaction_recipient_country") recipient_region = TransactionRecipientRegionSerializer( required=False, source="transaction_recipient_region") tied_status = CodelistSerializer() transaction_type = CodelistSerializer() currency = CodelistSerializer() description = TransactionDescriptionSerializer() humanitarian = serializers.BooleanField() activity = ActivitySerializer(read_only=True, fields=('id', 'iati_identifier', 'url', 'title')) activity_id = serializers.CharField(write_only=True) class Meta: model = models.Transaction fields = ( 'id', 'activity', 'activity_id', 'url', 'ref', 'humanitarian', 'transaction_type', 'transaction_date', 'value', 'value_date', 'currency', 'description', 'provider_organisation', 'receiver_organisation', 'disbursement_channel', 'sector', 'recipient_country', 'recipient_region', 'flow_type', 'finance_type', 'aid_type', 'tied_status', ) def validate(self, data): activity = get_or_raise(iati_models.Activity, data, 'activity_id') validated = validators.activity_transaction( activity, data.get('ref'), data.get('humanitarian'), data.get('transaction_type', {}).get('code'), data.get('transaction_date'), data.get('value'), data.get('value_date'), data.get('currency', {}).get('code'), data.get('description', {}).get('narratives'), data.get('provider_organisation', {}).get('ref'), data.get('provider_organisation', {}).get('provider_activity_ref'), data.get('provider_organisation', {}).get('type', {}).get('code'), data.get('provider_organisation', {}).get('narratives'), data.get('receiver_organisation', {}).get('ref'), data.get('receiver_organisation', {}).get('receiver_activity_ref'), data.get('receiver_organisation', {}).get('type', {}).get('code'), data.get('receiver_organisation', {}).get('narratives'), data.get('disbursement_channel', {}).get('code'), data.get('transaction_sector', {}).get('sector', {}).get('code', {}), data.get('transaction_sector', {}).get('vocabulary', {}).get('code', {}), data.get('transaction_sector', {}).get('vocabulary_uri', {}), data.get('transaction_recipient_country', {}).get('country', {}).get('code', {}), data.get('transaction_recipient_region', {}).get('region', {}).get('code', {}), data.get('transaction_recipient_region', {}).get('vocabulary', {}).get('code', {}), data.get('transaction_recipient_region', {}).get('vocabulary_uri'), data.get('flow_type', {}).get('code'), data.get('finance_type', {}).get('code'), data.get('aid_type', {}).get('code'), data.get('tied_status', {}).get('code'), ) return handle_errors(validated) def create(self, validated_data): activity = validated_data.get('activity') description_narratives_data = validated_data.pop('description_narratives', []) provider_data = validated_data.pop('provider_org') provider_narratives_data = validated_data.pop('provider_org_narratives', []) receiver_data = validated_data.pop('receiver_org') receiver_narratives_data = validated_data.pop('receiver_org_narratives', []) sector_data = validated_data.pop('sector') recipient_country_data = validated_data.pop('recipient_country') recipient_region_data = validated_data.pop('recipient_region') instance = models.Transaction.objects.create(**validated_data) if provider_data.get('ref'): provider_org = models.TransactionProvider.objects.create( transaction=instance, **provider_data) save_narratives(provider_org, provider_narratives_data, activity) validated_data['provider_organisation'] = provider_org if receiver_data.get('ref'): receiver_org = models.TransactionReceiver.objects.create( transaction=instance, **receiver_data) save_narratives(receiver_org, receiver_narratives_data, activity) validated_data['receiver_organisation'] = receiver_org if sector_data.get('sector'): models.TransactionSector.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **sector_data ) if recipient_country_data.get('country'): models.TransactionRecipientCountry.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **recipient_country_data ) if recipient_region_data.get('region'): models.TransactionRecipientRegion.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **recipient_region_data ) return instance def update(self, instance, validated_data): activity = validated_data.get('activity') description_narratives_data = validated_data.pop('description_narratives', []) provider_data = validated_data.pop('provider_org') provider_narratives_data = validated_data.pop('provider_org_narratives', []) receiver_data = validated_data.pop('receiver_org') receiver_narratives_data = validated_data.pop('receiver_org_narratives', []) sector_data = validated_data.pop('sector') recipient_country_data = validated_data.pop('recipient_country') recipient_region_data = validated_data.pop('recipient_region') update_instance = models.Transaction(**validated_data) update_instance.id = instance.id update_instance.save() if provider_data.get('ref'): try: provider_org = models.TransactionProvider.objects.get( transaction=instance) except BaseException: provider_org = models.TransactionProvider.objects.create( transaction=instance, **provider_data) save_narratives(provider_org, provider_narratives_data, activity) validated_data['provider_organisation'] = provider_org if receiver_data.get('ref'): try: receiver_org = models.TransactionReceiver.objects.get( transaction=instance) except BaseException: receiver_org = models.TransactionReceiver.objects.create( transaction=instance, **receiver_data) save_narratives(receiver_org, receiver_narratives_data, activity) validated_data['receiver_organisation'] = receiver_org if sector_data.get('sector'): try: models.TransactionSector.objects.get( transaction=instance, reported_transaction=instance) except BaseException: models.TransactionSector.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **sector_data ) if recipient_country_data.get('country'): try: models.TransactionRecipientCountry.objects.get( reported_transaction=instance, ) except BaseException: models.TransactionRecipientCountry.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **recipient_country_data ) if recipient_region_data.get('region'): try: models.TransactionRecipientRegion.objects.get( transaction=instance, reported_transaction=instance) except BaseException: models.TransactionRecipientRegion.objects.create( transaction=instance, reported_transaction=instance, percentage=100, **recipient_region_data ) return update_instance
class ActivitySerializer(DynamicFieldsModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='activities:activity-detail') iati_identifier = serializers.CharField() reporting_organisations = ReportingOrganisationSerializer( many=True,) title = TitleSerializer() descriptions = DescriptionSerializer( many=True, read_only=True, source='description_set') participating_organisations = ParticipatingOrganisationSerializer( many=True,) # TODO ; add other-identifier serializer # other_identifier = serializers.OtherIdentifierSerializer(many=True,source="?") activity_status = CodelistSerializer() activity_dates = ActivityDateSerializer( many=True, source='activitydate_set') # TODO ; add contact-info serializer # note; contact info has a sequence we should use in the ContactInfoSerializer! contact_info = ContactInfoSerializer(many=True,source="contactinfo_set") activity_scope = CodelistSerializer(source='scope') recipient_countries = RecipientCountrySerializer( many=True, source='activityrecipientcountry_set') recipient_regions = ActivityRecipientRegionSerializer( many=True, source='activityrecipientregion_set') locations = LocationSerializer(many=True, source='location_set') sectors = ActivitySectorSerializer( many=True, source='activitysector_set') # TODO ; add country-budget-items serializer # country_budget_items = serializers.CountryBudgetItemsSerializer(many=True,source="?") humanitarian_scope = HumanitarianScopeSerializer(many=True, source='humanitarianscope_set') policy_markers = ActivityPolicyMarkerSerializer( many=True, source='activitypolicymarker_set') collaboration_type = CodelistSerializer() default_flow_type = CodelistSerializer() default_finance_type = CodelistSerializer() default_aid_type = CodelistSerializer() default_tied_status = CodelistSerializer() budgets = BudgetSerializer(many=True, source='budget_set') # note; planned-disbursement has a sequence in PlannedDisbursementSerializer planned_disbursements = PlannedDisbursementSerializer(many=True, source='planneddisbursement_set') capital_spend = CapitalSpendSerializer() transactions = serializers.HyperlinkedIdentityField( view_name='activities:activity-transactions',) # transactions = TransactionSerializer( # many=True, # source='transaction_set') document_links = DocumentLinkSerializer( many=True, source='documentlink_set') related_activities = RelatedActivitySerializer( many=True, source='relatedactivity_set') # TODO ; add legacy-data serializer? note: we dont parse legacy data atm. # legacy_data = LegacyDataSerializer(many=True, source="?") # TODO ; add conditions serializer # conditions = serializers.ConditionsSerializer(many=True,source="?") results = ResultSerializer(many=True, source="result_set") # TODO ; add crs-add serializer # note; crs-add has a sequence in CrsAddSerializer # crs_add = serializers.CrsAddSerializer(many=True, source="?") # TODO ; add fss serializer # fss = serializers.FssSerializer(many=True, source="?") # activity attributes last_updated_datetime = serializers.DateTimeField() xml_lang = serializers.CharField(source='default_lang') default_currency = CodelistSerializer() humanitarian = serializers.BooleanField() # other added data aggregations = ActivityAggregationContainerSerializer(source="*") class Meta: model = iati_models.Activity fields = ( 'url', 'id', 'iati_identifier', 'reporting_organisations', 'title', 'descriptions', 'participating_organisations', # 'other_identifier', 'activity_status', 'activity_dates', 'contact_info', 'activity_scope', 'recipient_countries', 'recipient_regions', 'locations', 'sectors', # 'country_budget_items', 'humanitarian', 'humanitarian_scope', 'policy_markers', 'collaboration_type', 'default_flow_type', 'default_finance_type', 'default_aid_type', 'default_tied_status', 'planned_disbursements', 'budgets', 'capital_spend', 'transactions', 'document_links', 'related_activities', # 'legacy_data', # 'conditions', 'results', # 'crs_add', # 'fss', 'last_updated_datetime', 'xml_lang', 'default_currency', 'humanitarian', 'hierarchy', 'linked_data_uri', 'aggregations', 'xml_source_ref', )
class OrganisationSerializer(DynamicFieldsModelSerializer): class PublishedStateSerializer(DynamicFieldsSerializer): published = serializers.BooleanField() ready_to_publish = serializers.BooleanField() modified = serializers.BooleanField() url = EncodedHyperlinkedIdentityField( view_name='organisations:organisation-detail', read_only=True) last_updated_datetime = serializers.DateTimeField(required=False) xml_lang = serializers.CharField(source='default_lang.code', required=False) default_currency = CodelistSerializer(required=False) name = OrganisationNameSerializer(required=False) published_state = PublishedStateSerializer(source="*", read_only=True) class Meta: model = org_models.Organisation fields = ('url', 'id', 'organisation_identifier', 'last_updated_datetime', 'xml_lang', 'default_currency', 'name', 'published_state', 'primary_name') def validate(self, data): validated = validators.organisation( data.get('organisation_identifier'), data.get('default_lang', {}).get('code'), data.get('default_currency', {}).get('code'), data.get('name'), ) return handle_errors(validated) def create(self, validated_data): old_organisation = get_or_none(org_models.Organisation, validated_data, 'organisation_identifier') if old_organisation: raise ValidationError({ "organisation_identifier": "Organisation with this IATI identifier already exists" }) name_data = validated_data.pop('name', None) name_narratives_data = validated_data.pop('name_narratives', None) # TODO: only allow user to create the organisation he is validated with on # the IATI registry - 2017-03-06 instance = org_models.Organisation.objects.create(**validated_data) instance.publisher_id = self.context['view'].kwargs.get('publisher_id') instance.published = False instance.ready_to_publish = False instance.modified = True instance.save() name = org_models.OrganisationName.objects.create( organisation=instance) instance.name = name if name_narratives_data: save_narratives(name, name_narratives_data, instance) return instance def update(self, instance, validated_data): name_data = validated_data.pop('name', None) name_narratives_data = validated_data.pop('name_narratives', None) update_instance = org_models.Organisation(**validated_data) update_instance.id = instance.id update_instance.modified = True update_instance.save() if name_narratives_data: save_narratives(update_instance.name, name_narratives_data, instance) return update_instance
class OrganisationDocumentLinkSerializer(ModelSerializerNoValidation): class DocumentDateSerializer(SerializerNoValidation): # CharField because we want to let the validators do the parsing iso_date = serializers.CharField() format = CodelistSerializer(source='file_format') categories = OrganisationDocumentLinkCategorySerializer( many=True, required=False, source="documentlinkcategory_set") languages = OrganisationDocumentLinkLanguageSerializer( many=True, required=False, source="documentlinklanguage_set") recipient_countries = OrganisationDocumentLinkRecipientCountrySerializer( many=True, required=False, source="documentlinkrecipientcountry_set") title = OrganisationNarrativeContainerSerializer( source="documentlinktitle") document_date = DocumentDateSerializer(source="*") organisation = serializers.CharField(write_only=True) class Meta: model = org_models.OrganisationDocumentLink fields = ( 'organisation', 'id', 'url', 'format', 'title', 'categories', 'languages', 'document_date', 'recipient_countries', ) def validate(self, data): organisation = get_or_raise(org_models.Organisation, data, 'organisation') validated = validators.organisation_document_link( organisation, data.get('url'), data.get('file_format', {}).get('code'), data.get('iso_date'), data.get('documentlinktitle', {}).get('narratives'), ) return handle_errors(validated) def create(self, validated_data): organisation = validated_data.get('organisation') title_narratives_data = validated_data.pop('title_narratives', []) instance = org_models.OrganisationDocumentLink.objects.create( **validated_data) document_link_title = org_models.DocumentLinkTitle.objects.create( document_link=instance) save_narratives(document_link_title, title_narratives_data, organisation) organisation.modified = True organisation.save() return instance def update(self, instance, validated_data): organisation = validated_data.get('organisation') title_narratives_data = validated_data.pop('title_narratives', []) update_instance = org_models.OrganisationDocumentLink(**validated_data) update_instance.id = instance.id update_instance.save() save_narratives(update_instance.documentlinktitle, title_narratives_data, organisation) organisation.modified = True organisation.save() return update_instance
class OrganisationSerializer(DynamicFieldsModelSerializer): class PublishedStateSerializer(DynamicFieldsSerializer): published = serializers.BooleanField() ready_to_publish = serializers.BooleanField() modified = serializers.BooleanField() url = EncodedHyperlinkedIdentityField( view_name='organisations:organisation-detail', read_only=True ) default_currency = CodelistSerializer(required=False) last_updated_datetime = serializers.DateTimeField(required=False) xml_lang = serializers.CharField( source='default_lang.code', required=False ) name = OrganisationNameSerializer(required=False) published_state = PublishedStateSerializer(source="*", read_only=True) reporting_org = OrganisationReportingOrganisationSerializer(read_only=True) total_budgets = OrganisationTotalBudgetSerializer( many=True, read_only=True ) recipient_org_budgets = OrganisationRecipientOrgBudgetSerializer( source='recipientorgbudget_set', many=True, read_only=True ) recipient_region_budgets = OrganisationRecipientRegionBudgetSerializer( source='recipient_region_budget', many=True, read_only=True ) recipient_country_budgets = OrganisationRecipientCountryBudgetSerializer( many=True, read_only=True ) total_expenditures = OrganisationTotalExpenditureSerializer( source='total_expenditure', many=True, read_only=True ) document_links = OrganisationDocumentLinkSerializer( source='organisationdocumentlink_set', many=True, read_only=True ) class Meta: model = org_models.Organisation fields = ( 'url', 'id', 'published_state', 'primary_name', 'default_currency', 'last_updated_datetime', 'xml_lang', 'organisation_identifier', 'name', 'reporting_org', 'total_budgets', 'recipient_org_budgets', 'recipient_region_budgets', 'recipient_country_budgets', 'total_expenditures', 'document_links', 'dataset' ) def validate(self, data): validated = validators.organisation( data.get('organisation_identifier'), data.get('default_lang', {}).get('code'), data.get('default_currency', {}).get('code'), data.get('name'), ) return handle_errors(validated) def create(self, validated_data): old_organisation = get_or_none( org_models.Organisation, validated_data, 'organisation_identifier') if old_organisation: raise ValidationError({ "organisation_identifier": "Organisation with this IATI identifier already exists" }) name_data = validated_data.pop('name', None) # NOQA: F841 name_narratives_data = validated_data.pop('name_narratives', None) # TODO: only allow user to create the organisation he is # validated with on the IATI registry - 2017-03-06 instance = org_models.Organisation.objects.create(**validated_data) instance.publisher_id = self.context['view'].kwargs.get('publisher_id') instance.published = False instance.ready_to_publish = False instance.modified = True instance.save() name = org_models.OrganisationName.objects.create( organisation=instance) instance.name = name if name_narratives_data: save_narratives(name, name_narratives_data, instance) return instance def update(self, instance, validated_data): name_data = validated_data.pop('name', None) # NOQA: F841 name_narratives_data = validated_data.pop('name_narratives', None) update_instance = org_models.Organisation(**validated_data) update_instance.id = instance.id update_instance.modified = True update_instance.save() if name_narratives_data: save_narratives(update_instance.name, name_narratives_data, instance) return update_instance def to_representation(self, instance): """ Custom render to avoid auto render of 'total-budget' """ ret = OrderedDict() fields = self._readable_fields for field in fields: try: attribute = field.get_attribute(instance) except SkipField: continue # We skip `to_representation` for `None` values so that fields do # not have to explicitly deal with that case. # # For related fields with `use_pk_only_optimization` we need to # resolve the pk value. check_for_none = attribute.pk if isinstance( attribute, PKOnlyObject ) else attribute if check_for_none is None: ret[field.field_name] = None else: # Some organisations has more than 100 'total-budget', # 'recipient-org-budget', 'recipient-country-budget', # 'recipient-region-budget' and 'document-link' # elements, and cause time out problem in the server. # So these additional elements will be shown only if there # are less than 100 records of them. Otherwise a message # with information will be returned. if field.field_name in ['total_budgets', 'recipient_org_budgets', 'recipient_country_budgets', 'recipient_region_budgets', 'total_expenditures', 'document_links']: if field.field_name not in ret: if field.field_name == 'total_budgets' and \ instance.total_budgets.count() > 100: custom_ret1 = OrderedDict() custom_ret1['message'] = \ 'This organisation has more ' \ 'than 100 total-budget! ' \ 'To get all total-budget, ' \ 'please use the total-budget endpoint ' \ 'instead!' ret[field.field_name] = custom_ret1 elif field.field_name == 'recipient_org_budgets' and \ instance.recipientorgbudget_set.count() > 100: custom_ret2 = OrderedDict() custom_ret2['message'] = \ 'This organisation has more ' \ 'than 100 recipient-org-budget! ' \ 'To get all recipient-org-budgets, ' \ 'please use the recipient-org-budget ' \ 'endpoint instead!' ret[field.field_name] = custom_ret2 elif field.field_name == 'recipient_country_budgets' \ and \ instance.recipient_country_budgets.count() >\ 100: custom_ret3 = OrderedDict() custom_ret3['message'] = \ 'This organisation has more ' \ 'than 100 recipient-country-budget! ' \ 'To get all recipient_country-budgets, ' \ 'please use the recipient-country-budget ' \ 'endpoint instead!' ret[field.field_name] = custom_ret3 elif field.field_name == 'recipient_region_budgets' \ and \ instance.recipient_region_budget.count() > 100: custom_ret4 = OrderedDict() custom_ret4['message'] = \ 'This organisation has more ' \ 'than 100 recipient-region-budget! ' \ 'To get all recipient-region-budget, ' \ 'please use the recipient-region-budget ' \ 'endpoint instead!' ret[field.field_name] = custom_ret4 elif field.field_name == 'total_expenditures' and \ instance.total_expenditure.count() > 100: custom_ret5 = OrderedDict() custom_ret5['message'] = \ 'This organisation has more ' \ 'than 100 total-expenditures! ' \ 'To get all total-expenditures, ' \ 'please use the total-expenditure endpoint ' \ 'instead!' ret[field.field_name] = custom_ret5 elif field.field_name == 'document_links' and \ instance.organisationdocumentlink_set.count( ) > 100: custom_ret6 = OrderedDict() custom_ret6['message'] = \ 'This organisation has more ' \ 'than 100 document-links! ' \ 'To get all document-links, ' \ 'please use the document-link endpoint ' \ 'instead!' ret[field.field_name] = custom_ret6 else: ret[field.field_name] = field.to_representation( attribute ) else: ret[field.field_name] = field.to_representation(attribute) return ret
class OrganisationRecipientRegionBudgetSerializer(ModelSerializerNoValidation): organisation = serializers.CharField(write_only=True) value = ValueSerializer(source='*') status = CodelistSerializer() # because we want to validate in the validator instead period_start = serializers.CharField() period_end = serializers.CharField() recipient_region = BasicRegionSerializer(source="region", fields=('url', 'code', 'name')) budget_lines = RecipientRegionBudgetLineSerializer( many=True, source="recipientregionbudgetline_set", required=False) class Meta: model = org_models.RecipientRegionBudget fields = ( 'organisation', 'id', 'status', 'recipient_region', 'period_start', 'period_end', 'value', 'budget_lines', ) def validate(self, data): organisation = get_or_raise(org_models.Organisation, data, 'organisation') validated = validators.organisation_recipient_region_budget( organisation, data.get('status', {}).get('code'), data.get('region', {}).get('code'), data.get('period_start'), data.get('period_end'), data.get('value'), data.get('currency').get('code'), data.get('value_date'), ) return handle_errors(validated) def create(self, validated_data): organisation = validated_data.get('organisation') instance = org_models.RecipientRegionBudget.objects.create( **validated_data) organisation.modified = True organisation.save() return instance def update(self, instance, validated_data): organisation = validated_data.get('organisation') update_instance = org_models.RecipientRegionBudget(**validated_data) update_instance.id = instance.id update_instance.save() organisation.modified = True organisation.save() return update_instance