Ejemplo n.º 1
0
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',
        )
Ejemplo n.º 2
0
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',
        )
Ejemplo n.º 3
0
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',
        )
Ejemplo n.º 4
0
class ActivityDateSerializer(serializers.Serializer):
    type = CodelistSerializer()
    iso_date = serializers.DateTimeField()

    class Meta:
        model = iati_models.ActivityDate
        fields = ('iso_date', 'type')
Ejemplo n.º 5
0
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',
        )
Ejemplo n.º 6
0
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',
        )
Ejemplo n.º 7
0
class DescriptionSerializer(serializers.ModelSerializer):
    type = CodelistSerializer()
    narratives = NarrativeSerializer(many=True)

    class Meta:
        model = iati_models.Description
        fields = (
            'type',
            'narratives'
        )
Ejemplo n.º 8
0
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')
Ejemplo n.º 9
0
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')
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
class PlannedDisbursementSerializer(serializers.ModelSerializer):
    value = ValueSerializer(source='*')
    type = CodelistSerializer()

    class Meta:
        model = iati_models.PlannedDisbursement

        fields = (
            'type',
            'period_start',
            'period_end',
            'value',
        )
Ejemplo n.º 12
0
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')
Ejemplo n.º 13
0
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',
        )
Ejemplo n.º 14
0
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',
        )
Ejemplo n.º 15
0
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
Ejemplo n.º 16
0
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',
        )
Ejemplo n.º 17
0
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',
        )
Ejemplo n.º 18
0
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',
        )
Ejemplo n.º 19
0
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'
        )
Ejemplo n.º 20
0
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'
        )
Ejemplo n.º 21
0
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',
        )
Ejemplo n.º 22
0
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',
        )
Ejemplo n.º 23
0
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
Ejemplo n.º 24
0
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
Ejemplo n.º 25
0
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
Ejemplo n.º 26
0
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',
        )
Ejemplo n.º 27
0
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
Ejemplo n.º 28
0
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
Ejemplo n.º 29
0
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
Ejemplo n.º 30
0
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