コード例 #1
0
def set_publishing_status(publishing_statuses):
    outsys("\nRunning {}() ".format(who_am_i()))
    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)
    for internal_id, publish in publishing_statuses.items():
        try:
            status = PublishingStatus.objects.get(
                project__partnerships__internal_id=internal_id,
                project__partnerships__organisation=cordaid,
            )
            status.status = PublishingStatus.STATUS_PUBLISHED if publish else PublishingStatus.STATUS_UNPUBLISHED
            status.save()
            log(
                u"Set publishing status for project ID: {pk}: {extra}",
                dict(internal_id=internal_id,
                     pk=status.project.pk,
                     event=ACTION_PUBLISHING_SET,
                     extra=status.status))
            outsys(".")
        except Exception, e:
            log(
                u"Error setting publishing status for project {internal_id}\nException class: {extra}",
                dict(internal_id=internal_id,
                     event=e.__class__,
                     extra=e.message),
            )
            outsys("*")
コード例 #2
0
 def update_organisation(org_etree, internal_org_id):
     try:
         org_dict = org_data_from_xml(org_etree)
         referenced_org = internal_org_id.referenced_org
         update_org = Organisation.objects.filter(pk=referenced_org.pk)
         update_org.update(**org_dict)
         log(
             u"Updated organisation: {label}, Akvo ID: {pk}",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_org_id.identifier,
                 label=referenced_org.name,
                 pk=referenced_org.pk,
                 event=ACTION_UPDATE_ORG
             )
         )
         # return the updated organisation record to be used in the following steps
         return update_org[0]
     except Exception, e:
         log(
             u"Error trying to update organisation with Cordaid ID {internal_id} ",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_org_id.identifier,
                 event=ERROR_EXCEPTION,
                 extra=e.message
             )
         )
コード例 #3
0
 def create_new_organisation(org_etree, internal_id):
     try:
         org_dict = org_data_from_xml(org_etree)
         referenced_org = Organisation.objects.create(**org_dict)
         log(
             u"Created new organisation: {label}, Akvo ID: {pk}",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_id,
                 label=referenced_org.name,
                 pk=referenced_org.pk,
                 event=ACTION_CREATE_ORG
             )
         )
         return referenced_org
     except Exception, e:
         log(
             u"Error trying to create organisation with Cordaid ID {internal_id} ",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_id,
                 event=ERROR_EXCEPTION,
                 extra=e.message
             )
         )
コード例 #4
0
def upload_organisations(argv):
    user_cred = credentials_from_args(argv)
    reporting_org_id = user_org(user_cred, **dict())
    if user_cred:
        with open(ORGANISATIONS_XML, 'r') as f:
            root = etree.fromstring(f.read())
            organisations = root.findall('object')
            for i in range(len(organisations)):
                internal_org_id = organisations[i].find('org_id').text
                name = organisations[i].find('name').text
                print "Processing organisation {name}".format(name=name),
                if internal_org_id:
                    print " ID: {org_id}".format(org_id=internal_org_id),
                    import pdb
                    pdb.set_trace()
                    ok, pk = find_org(user_cred, reporting_org_id,
                                      internal_org_id)
                    if pk:
                        ok, message, data = put_an_org(organisations[i],
                                                       user_cred, pk)
                        log(message, data)
                        print message.format(**data)
                    else:
                        ok, message, data = post_an_org(
                            organisations[i], user_cred)
                        log(message, data)
                        print message.format(**data)
                        if ok:
                            post_an_internal_id(user_cred, reporting_org_id,
                                                internal_org_id, data['pk'])
                else:
                    print "No internal org ID"
コード例 #5
0
def upload_organisations(argv):
    user_cred = credentials_from_args(argv)
    reporting_org_id = user_org(user_cred, **dict())
    if user_cred:
        with open(ORGANISATIONS_XML, 'r') as f:
            root = etree.fromstring(f.read())
            organisations = root.findall('object')
            for i in range(len(organisations)):
                internal_org_id = organisations[i].find('org_id').text
                name = organisations[i].find('name').text
                print "Processing organisation {name}".format(name=name),
                if internal_org_id:
                    print " ID: {org_id}".format(org_id=internal_org_id),
                    import pdb
                    pdb.set_trace()
                    ok, pk = find_org(user_cred, reporting_org_id,
                                      internal_org_id)
                    if pk:
                        ok, message, data = put_an_org(organisations[i],
                                                       user_cred, pk)
                        log(message, data)
                        print message.format(**data)
                    else:
                        ok, message, data = post_an_org(
                            organisations[i], user_cred)
                        log(message, data)
                        print message.format(**data)
                        if ok:
                            post_an_internal_id(user_cred, reporting_org_id,
                                                internal_org_id, data['pk'])
                else:
                    print "No internal org ID"
コード例 #6
0
ファイル: post_import.py プロジェクト: mahmoudimus/akvo-rsr
def fix_funding(budgets):
    """
    Add Cordaid as a funding partner to all its projects and "fill the project up"
    """
    outsys("\nRunning {}() ".format(who_am_i()))

    def assign_funding_partner(project, organisation, amount):
        funding_partnership, created = Partnership.objects.get_or_create(
            organisation=organisation,
            project=project,
            partner_type=Partnership.FUNDING_PARTNER,
            defaults={'funding_amount': amount}
        )
        if created:
            log(
                u"Added {org_name} as funding partner to project {{pk}}, funding amount: {{extra}}".format(org_name=organisation.name),
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_SET, extra=amount)
            )
        else:
            funding_partnership.funding_amount = amount
            funding_partnership.save()
            log(
                u"Found {org_name} as funding partner to project {{pk}}, setting funding amount: {{extra}}".format(org_name=organisation.name),
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_FOUND, extra=amount)
            )

    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)
    others = Organisation.objects.get(pk=OTHERS_ORG_ID)
    for budget in budgets:
        internal_id = budget['internal_project_id']
        try:
            project = None
            project = Project.objects.get(
                partnerships__internal_id=internal_id, partnerships__organisation=cordaid
            )
            cordaid_funding = budget.get('cordaid_funding', 0)
            others_funding = budget.get('others_funding', 0)
            if cordaid_funding:
                assign_funding_partner(project, cordaid, cordaid_funding)
            if others_funding:
                assign_funding_partner(project, others, others_funding)
            total_budget = cordaid_funding + others_funding
            old_budgets = BudgetItem.objects.filter(project=project)
            old_budgets.delete()
            BudgetItem.objects.create(
                project=project,
                label = BudgetItemLabel.objects.get(pk=13), #total budget label
                amount = total_budget
            )
            log(
                u"Total budget for project {pk}: {extra}",
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_BUDGET_SET, extra=total_budget)
            )
            outsys(".")
        except Exception, e:
            log(u"Error setting up funding partners for project {pk}\nException class: {extra}",
                dict(internal_id=internal_id, pk=getattr(project, 'pk', None), event=e.__class__, extra=e.message),
            )
            outsys("*")
コード例 #7
0
def create_cats_and_benches(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    for internal_id, data in business_units.items():
        for name in data['benchmarknames']:
            outsys('.')
            new_bench, created = Benchmarkname.objects.get_or_create(name=name)
            if created:
                log(u"Created bench: {id}, {name}", dict(id=new_bench.id, name=name))
            else:
                log(u"Found existing bench: {id}, {name}", dict(id=new_bench.id, name=name))
            data['category'].benchmarknames.add(new_bench)
コード例 #8
0
def upload_activities(argv):
    user = credentials_from_args(argv)
    if user:
        with open(CORDAID_IATI_ACTIVITIES_XML, 'r') as f:
            root = etree.fromstring(f.read())
            document_akvo_ns = '{{{akvo_ns}}}'.format(
                akvo_ns=root.nsmap['akvo'])
            assert document_akvo_ns == AKVO_NS, "Akvo name space is incorrect in the IATI XML"
            activities = root.findall('iati-activity')
            activity_count = len(activities)
            for i in range(activity_count):
                internal_id = activities[i].get(AKVO_NS +
                                                'internal-project-id')
                iati_id = activities[i].findall('iati-identifier')[0].text
                print "({current} of {activity_count}) Processing activity {iati_id}".format(
                    current=i + 1,
                    activity_count=activity_count,
                    iati_id=iati_id),
                if len(activities[i].findall('participating-org')) > 0:
                    if internal_id:
                        ok, project = get_project_count(
                            user,
                            **dict(partnerships__internal_id=internal_id))
                    elif iati_id:
                        ok, project = get_project_count(
                            user,
                            **dict(partnerships__iati_activity_id=iati_id))
                    if not ok:
                        continue  #error msg already output
                    project_count = project.response.json(
                    )['meta']['total_count']
                    if project_count == 0:
                        ok, message, data = post_an_activity(
                            activities[i], user)
                        log(message, data)
                        print message.format(**data)
                    elif project_count == 1:
                        pk = project.response.json()['objects'][0]['id']
                        ok, message, data = put_an_activity(
                            activities[i], pk, user)
                        log(message, data)
                        print message.format(**data)
                    elif project_count > 1:
                        data = dict(iati_id=iati_id,
                                    event=ERROR_MULTIPLE_OBJECTS,
                                    extra=internal_id)
                        log(None, data)
                        print(
                            "**** Error updating iati-activity: {iati_id}. "
                            "More than one project with internal ID {extra} exists."
                            .format(**data))
                else:
                    message = "Iati-activity {iati_id} has no participating-orgs, aborting"
                    data = dict(
                        iati_id=iati_id,
                        event=ERROR_NO_ORGS,
                    )
                    log(message, data)
                    print(message.format(**data))
コード例 #9
0
def find_cordaid_business_units(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    known_business_units = {
        "27239": dict(pk=CORDAID_ORG_ID),
        "K6020": dict(pk=959, cat_name="Children & Education", fa="Education"),
        "K6090": dict(pk=962, cat_name="Domestic", fa="Economic development"),
        "K6030": dict(pk=961, cat_name="Disaster Recovery", fa="Economic development"),
        "K6070": dict(pk=950, cat_name="Entrepreneurship", fa="Economic development"),
        "K6110": dict(pk=1099, cat_name="Food Security", fa="Healthcare"),
        "K6100": dict(pk=953, cat_name="Investments", fa="Economic development"),
        "K6010": dict(pk=949, cat_name="Healthcare", fa="Healthcare"),
        "K6060": dict(pk=1241, cat_name="Security & Justice", fa="Economic development"),
        "K6080": dict(pk=946, cat_name="Urban Matters", fa="Economic development"),
        "K6040": dict(pk=955, cat_name="Women's leadership", fa="Economic development"),
        "K6050": dict(pk=960, cat_name="Extractives", fa="Economic development"),
    }
    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)

    for internal_id in business_units.keys():
        cbu = known_business_units.get(internal_id, {'pk': -1})
        pk, cat_name, fa_name = cbu['pk'], cbu.get('cat_name'), cbu.get('fa'),
        try:
            organisation = Organisation.objects.get(pk=pk)
            outsys('.')
        except:
            outsys('*')
            log(
                u"No business unit with internal ID {internal_id}",
                dict(
                    internal_id=internal_id,
                    event=ERROR_BUSINESS_UNIT_MISSING
                )
            )
            continue
        internal_org, created = InternalOrganisationID.objects.get_or_create(
            recording_org=cordaid,
            referenced_org=organisation,
            identifier= internal_id
        )
        if cat_name:
            new_cat, created = Category.objects.get_or_create(name=cat_name)
            if created:
                log(u"Created cat: {id}, {cat_name}",dict(id=new_cat.id, cat_name=cat_name))
                new_cat.focus_area.add(FocusArea.objects.get(name=fa_name))
            else:
                log(u"Found existing cat: {id}, {cat_name}", dict(id=new_cat.id, cat_name=cat_name))
            business_units.setdefault(internal_id, {'category': None, 'benchmarknames': []})['category'] = new_cat

    cordaid.iati_org_id = CORDAID_IATI_ID
    cordaid.save()
    try:
        dgis = Organisation.objects.get(pk=DGIS_ORG_ID)
        dgis.iati_org_id = DGIS_IATI_ID
        dgis.save()
    except:
        log(u"Can't find DGIS using ID {dgis_id}", dict(dgis_id=DGIS_ORG_ID),)
    return business_units
コード例 #10
0
ファイル: pre_import.py プロジェクト: punchagan/akvo-rsr
def find_cordaid_business_units(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    known_business_units = {
        "27239": dict(pk=CORDAID_ORG_ID),
        "K6020": dict(pk=959, cat_name="Children & Education", fa="Education"),
        "K6090": dict(pk=962, cat_name="Domestic", fa="Economic development"),
        "K6030": dict(pk=961, cat_name="Disaster Recovery", fa="Economic development"),
        "K6070": dict(pk=950, cat_name="Entrepreneurship", fa="Economic development"),
        "K6110": dict(pk=1099, cat_name="Food Security", fa="Healthcare"),
        "K6100": dict(pk=953, cat_name="Investments", fa="Economic development"),
        "K6010": dict(pk=949, cat_name="Healthcare", fa="Healthcare"),
        "K6060": dict(pk=1241, cat_name="Security & Justice", fa="Economic development"),
        "K6080": dict(pk=946, cat_name="Urban Matters", fa="Economic development"),
        "K6040": dict(pk=955, cat_name="Women's leadership", fa="Economic development"),
        "K6050": dict(pk=960, cat_name="Extractives", fa="Economic development"),
    }
    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)

    for internal_id in business_units.keys():
        cbu = known_business_units.get(internal_id, {'pk': -1})
        pk, cat_name, fa_name = cbu['pk'], cbu.get('cat_name'), cbu.get('fa'),
        try:
            organisation = Organisation.objects.get(pk=pk)
            outsys('.')
        except:
            outsys('*')
            log(
                u"No business unit with internal ID {internal_id}",
                dict(
                    internal_id=internal_id,
                    event=ERROR_BUSINESS_UNIT_MISSING
                )
            )
            continue
        internal_org, created = InternalOrganisationID.objects.get_or_create(
            recording_org=cordaid,
            referenced_org=organisation,
            identifier=internal_id
        )
        if cat_name:
            new_cat, created = Category.objects.get_or_create(name=cat_name)
            if created:
                log(u"Created cat: {id}, {cat_name}", dict(id=new_cat.id, cat_name=cat_name))
                new_cat.focus_area.add(FocusArea.objects.get(name=fa_name))
            else:
                log(u"Found existing cat: {id}, {cat_name}", dict(id=new_cat.id, cat_name=cat_name))
            business_units.setdefault(internal_id, {'category': None, 'benchmarknames': []})['category'] = new_cat

    cordaid.iati_org_id = CORDAID_IATI_ID
    cordaid.save()
    try:
        dgis = Organisation.objects.get(pk=DGIS_ORG_ID)
        dgis.iati_org_id = DGIS_IATI_ID
        dgis.save()
    except:
        log(u"Can't find DGIS using ID {dgis_id}", dict(dgis_id=DGIS_ORG_ID),)
    return business_units
コード例 #11
0
ファイル: post_import.py プロジェクト: ronna/akvo-rsr
 def assign_funding_partner(project, organisation, amount):
     funding_partnership, created = Partnership.objects.get_or_create(
         organisation=organisation,
         project=project,
         iati_organisation_role=Partnership.IATI_FUNDING_PARTNER,
         defaults={'funding_amount': amount}
     )
     if created:
         log(
             "Added {org_name} as funding partner to project {{pk}}, funding amount: {{extra}}".format(org_name=organisation.name),
             dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_SET, extra=amount)
         )
     else:
         funding_partnership.funding_amount = amount
         funding_partnership.save()
         log(
             "Found {org_name} as funding partner to project {{pk}}, setting funding amount: {{extra}}".format(org_name=organisation.name),
             dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_FOUND, extra=amount)
         )
コード例 #12
0
ファイル: post_import.py プロジェクト: punchagan/akvo-rsr
 def assign_funding_partner(project, organisation, amount):
     funding_partnership, created = Partnership.objects.get_or_create(
         organisation=organisation,
         project=project,
         iati_organisation_role=Partnership.IATI_FUNDING_PARTNER,
         defaults={'funding_amount': amount}
     )
     if created:
         log(
             u"Added {org_name} as funding partner to project {{pk}}, funding amount: {{extra}}".format(org_name=organisation.name),
             dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_SET, extra=amount)
         )
     else:
         funding_partnership.funding_amount = amount
         funding_partnership.save()
         log(
             u"Found {org_name} as funding partner to project {{pk}}, setting funding amount: {{extra}}".format(org_name=organisation.name),
             dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_FOUND, extra=amount)
         )
コード例 #13
0
def create_cordaid_business_units(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    business_units_info = [
        dict(pk=CORDAID_ORG_ID,  internal_id="27239"),
        dict(pk=959,  internal_id="K6020", cat_name="Children & Education", fa="Education"),
        dict(pk=962,  internal_id="K6090", cat_name="Domestic", fa="Economic development"),
        dict(pk=961,  internal_id="K6030", cat_name="Disaster Recovery", fa="Economic development"),
        dict(pk=950,  internal_id="K6070", cat_name="Entrepreneurship", fa="Economic development"),
        dict(pk=1099, internal_id="K6110", cat_name="Food Security", fa="Healthcare"),
        dict(pk=953,  internal_id="K6100", cat_name="Investments", fa="Economic development"),
        dict(pk=949,  internal_id="K6010", cat_name="Healthcare", fa="Healthcare"),
        dict(pk=1241, internal_id="K6060", cat_name="Security & Justice", fa="Economic development"),
        dict(pk=946,  internal_id="K6080", cat_name="Urban Matters", fa="Economic development"),
        dict(pk=955,  internal_id="K6040", cat_name="Women's leadership", fa="Economic development"),
        dict(pk=960,  internal_id="K6050", cat_name="Extractives", fa="Economic development"),
    ]
    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)
    for data in business_units_info:
        outsys('.')
        pk, identifier = data['pk'], data['internal_id']
        cat_name, fa_name = data.get('cat_name'), data.get('fa')
        try:
            organisation = Organisation.objects.get(pk=pk)
        except:
            log(
                u"No business unit with id {pk}, internal ID {identifier}",
                dict(pk=pk, identifier=identifier),
            )
            continue
        internal_org, created = InternalOrganisationID.objects.get_or_create(
            recording_org=cordaid,
            referenced_org=organisation,
            identifier= identifier
        )
        if cat_name:
            new_cat, created = Category.objects.get_or_create(name=cat_name)
            if created:
                log(u"Created cat: {id}, {cat_name}",dict(id=new_cat.id, cat_name=cat_name))
                new_cat.focus_area.add(FocusArea.objects.get(name=fa_name))
            else:
                log(u"Found existing cat: {id}, {cat_name}", dict(id=new_cat.id, cat_name=cat_name))
            business_units.setdefault(identifier, {'category': None, 'benchmarknames': []})['category'] = new_cat

    cordaid.iati_org_id = CORDAID_IATI_ID
    cordaid.save()
    try:
        dgis = Organisation.objects.get(pk=DGIS_ORG_ID)
        dgis.iati_org_id = DGIS_IATI_ID
        dgis.save()
    except:
        log(u"Can't find DGIS using ID {dgis_id}", dict(dgis_id=DGIS_ORG_ID),)
    return business_units
コード例 #14
0
def import_images(image_dir, photos):
    outsys("\nRunning {}() ".format(who_am_i()))
    for image_name in os.listdir(image_dir):
        photo_id, ext = splitext(image_name)
        if ext.lower() in ['.png', '.jpg', '.jpeg', '.gif']:
            try:
                internal_id = photos.get(
                    photo_id,
                    {'internal_project_id': None})['internal_project_id']
                project = Project.objects.get(
                    partnerships__internal_id=internal_id)
                filename = model_and_instance_based_filename(
                    'Project', project.pk, 'current_image', image_name)
                with open(os.path.join(image_dir, image_name), 'rb') as f:
                    image_data = f.read()
                    image_temp = NamedTemporaryFile(delete=True)
                    image_temp.write(image_data)
                    image_temp.flush()
                    project.current_image.save(filename,
                                               File(image_temp),
                                               save=True)
                f.close()
                project.current_image_caption = photos.get(
                    photo_id, {'image_caption': ''})['image_caption']
                project.current_image_credit = photos.get(
                    photo_id, {'image_credit': ''})['image_credit']
                project.save()
                log(
                    u"Uploaded image to project {pk}",
                    dict(internal_id=internal_id,
                         pk=project.pk,
                         event=ACTION_SET_IMAGE))
                outsys(".")
            except Exception, e:
                log(
                    u"Upload failed. internal_id: {internal_id} Exception class: {extra}",
                    dict(internal_id=internal_id,
                         event=ERROR_IMAGE_UPLOAD,
                         extra=e.__class__),
                )
                outsys("*")
コード例 #15
0
ファイル: post_import.py プロジェクト: punchagan/akvo-rsr
def set_publishing_status(publishing_statuses):
    outsys("\nRunning {}() ".format(who_am_i()))
    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)
    for internal_id, publish in publishing_statuses.items():
        try:
            status = PublishingStatus.objects.get(
                project__partnerships__internal_id=internal_id,
                project__partnerships__organisation=cordaid,
            )
            status.status = PublishingStatus.STATUS_PUBLISHED if publish else PublishingStatus.STATUS_UNPUBLISHED
            status.save()
            log(
                u"Set publishing status for project ID: {pk}: {extra}",
                dict(internal_id=internal_id, pk=status.project.pk, event=ACTION_PUBLISHING_SET, extra=status.status)
            )
            outsys(".")
        except Exception, e:
            log(u"Error setting publishing status for project {internal_id}\nException class: {extra}",
                dict(internal_id=internal_id, event=e.__class__, extra=e.message),
                )
            outsys("*")
コード例 #16
0
def create_cats_and_benches(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    for internal_id, data in business_units.items():
        if data.get('category'):
            for name in data['benchmarknames']:
                outsys('.')
                new_bench, created = Benchmarkname.objects.get_or_create(
                    name=name)
                if created:
                    log(
                        u"Created bench: {pk}, {label}",
                        dict(label=name,
                             pk=new_bench.id,
                             event=ACTION_BENCH_CREATE))
                else:
                    log(
                        u"Found existing bench: {pk}, {label}",
                        dict(label=name,
                             pk=new_bench.id,
                             event=ACTION_BENCH_FOUND))
                try:
                    data['category'].benchmarknames.add(new_bench)
                except:
                    # we shouldn't end up here since we're testing for the existance of the category above
                    pass
        else:
            outsys('*')
            log(
                u"No category set of business unit with internal ID {internal_id}",
                dict(internal_id=internal_id, event=ERROR_CATEGORY_MISSING))
コード例 #17
0
ファイル: post_import.py プロジェクト: punchagan/akvo-rsr
def import_images(image_dir, photos):
    outsys("\nRunning {}() ".format(who_am_i()))
    for image_name in os.listdir(image_dir):
        photo_id, ext = splitext(image_name)
        if ext.lower() in ['.png', '.jpg', '.jpeg', '.gif']:
            try:
                internal_id = photos.get(
                    photo_id, {'internal_project_id': None}
                )['internal_project_id']
                project = Project.objects.get(
                    partnerships__internal_id=internal_id
                )
                filename = model_and_instance_based_filename(
                    'Project', project.pk, 'current_image', image_name
                )
                with open(os.path.join(image_dir, image_name), 'rb') as f:
                    image_data = f.read()
                    image_temp = NamedTemporaryFile(delete=True)
                    image_temp.write(image_data)
                    image_temp.flush()
                    project.current_image.save(filename, File(image_temp), save=True)
                f.close()
                project.current_image_caption = photos.get(
                    photo_id, {'image_caption': ''}
                )['image_caption']
                project.current_image_credit = photos.get(
                    photo_id, {'image_credit': ''}
                )['image_credit']
                project.save()
                log(
                    u"Uploaded image to project {pk}",
                    dict(internal_id=internal_id, pk=project.pk, event=ACTION_SET_IMAGE))
                outsys(".")
            except Exception, e:
                log(
                    u"Upload failed. internal_id: {internal_id} Exception class: {extra}",
                    dict(internal_id=internal_id, event=ERROR_IMAGE_UPLOAD, extra=e.__class__),
                )
                outsys("*")
コード例 #18
0
 def organisation_logo(org_etree, internal_id, org):
     logo_file = glob.glob(
         os.path.join(
             CORDAID_LOGOS_DIR,
             u"{logo_id}.*".format(logo_id=text_from_xpath(org_etree, 'logo_id'))
         )
     )
     if len(logo_file) == 1:
         logo_filename = basename(logo_file[0])
         _, extension = splitext(logo_filename)
         if extension.lower() in (".png", ".jpg", ".jpeg", ".gif"):
             filename = model_and_instance_based_filename(
                 "Organisation",
                 org.pk,
                 "logo",
                 logo_filename
             )
             with open(os.path.join(CORDAID_LOGOS_DIR, logo_filename), "rb") as f:
                 logo_data = f.read()
                 logo_tmp = NamedTemporaryFile(delete=True)
                 logo_tmp.write(logo_data)
                 logo_tmp.flush()
                 org.logo.save(
                     filename, File(logo_tmp), save=True
                 )
                 log(
                     u"  Added logo {extra} to org {pk}, ",
                     dict(
                         log_type=LOG_ORGANISATIONS,
                         internal_id=internal_id,
                         pk=org.pk,
                         label=org.name,
                         event=ACTION_SET_IMAGE,
                         extra= filename,
                     )
                 )
コード例 #19
0
def upload_activities(argv):
    user = credentials_from_args(argv)
    if user:
        with open(CORDAID_IATI_ACTIVITIES_XML, 'r') as f:
            root = etree.fromstring(f.read())
            document_akvo_ns = '{akvo_ns}'.format(akvo_ns=root.nsmap['akvo'])
            assert document_akvo_ns == AKVO_NS, "Akvo name space is incorrect in the IATI XML"
            activities = root.findall('iati-activity')
            activity_count = len(activities)
            for i in range(activity_count):
                internal_id = activities[i].get(AKVO_NS + 'internal-project-id')
                iati_id=activities[i].findall('iati-identifier')[0].text
                print "({current} of {activity_count}) Processing activity {iati_id}".format(current=i+1, activity_count=activity_count, iati_id=iati_id),
                if len(activities[i].findall('participating-org')) > 0:
                    if internal_id:
                        ok, project = get_project_count(user, **dict(partnerships__internal_id=internal_id))
                    elif iati_id:
                        ok, project = get_project_count(user, **dict(iati_activity_id=iati_id))
                    if not ok:
                        continue #error msg already output
                    project_count = project.response.json()['meta']['total_count']
                    if project_count == 0:
                        ok, message, data = post_an_activity(activities[i], user)
                        log(message, data)
                        print message.format(**data)
                    elif project_count == 1:
                        pk = project.response.json()['objects'][0]['id']
                        ok, message, data = put_an_activity(activities[i], pk, user)
                        log(message, data)
                        print message.format(**data)
                    elif project_count > 1:
                        data = dict(iati_id=iati_id, event=ERROR_MULTIPLE_OBJECTS, extra=internal_id)
                        log(None, data)
                        print(
                            "**** Error updating iati-activity: {iati_id}. "
                            "More than one project with internal ID {extra} exists.".format(**data)
                        )
                else:
                    message = "Iati-activity {iati_id} has no participating-orgs, aborting"
                    data = dict(iati_id = iati_id, event = ERROR_NO_ORGS,)
                    log(message, data)
                    print(message.format(**data))
コード例 #20
0
 def update_organisation(org_etree, internal_org_id, cordaid):
     try:
         org_dict = org_data_from_xml(org_etree)
         referenced_org = internal_org_id.referenced_org
         update_org = Organisation.objects.filter(pk=referenced_org.pk)
         content_owner = update_org[0].content_owner
         if content_owner and content_owner != cordaid:
             log(
                 u"Organisation content owned by different organisation: {label}, Akvo ID: {pk}, owned by: {extra}",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     internal_id=internal_org_id.identifier,
                     label=referenced_org.name,
                     pk=referenced_org.pk,
                     event=OWNER_CONTENT,
                     extra=content_owner.name
                 )
             )
             # return None so that organisation does not get updated afterwards
             return None
         else:
             update_org.update(**org_dict)
             log(
                 u"Updated organisation: {label}, Akvo ID: {pk}",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     internal_id=internal_org_id.identifier,
                     label=referenced_org.name,
                     pk=referenced_org.pk,
                     event=ACTION_UPDATE_ORG
                 )
             )
             # return the updated organisation record to be used in the following steps
             return update_org[0]
     except Exception, e:
         log(
             u"Error trying to update organisation with Cordaid ID {internal_id} ",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_org_id.identifier,
                 event=ERROR_EXCEPTION,
                 extra=e.message
             )
         )
コード例 #21
0
 def set_location_for_org(org_etree, internal_id, org):
     if not org.primary_location:
         iso_code = text_from_xpath(org_etree, 'location/object/iso_code').lower()
         if not iso_code == "ww!":
             country = custom_get_or_create_country(iso_code)
             location = OrganisationLocation.objects.create(
                 country=country,
                 location_target=org
             )
             org.locations.add(location)
             org.primary_location = location
             org.save()
             log(
                 u"  Added location to org {pk}",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     internal_id=internal_id,
                     pk=org.pk,
                     label=org.name,
                     event=ACTION_LOCATION_SET,
                 )
             )
         else:
             log(
                 u"Couldn't create location for org {pk}, no proper country code",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     internal_id=internal_id,
                     pk=org.pk,
                     label=org.name,
                     event=ERROR_COUNTRY_CODE,
                 )
             )
     else:
         log(
             u"  Org {pk} already has a location.",
             dict(
                 log_type=LOG_ORGANISATIONS,
                 internal_id=internal_id,
                 pk=org.pk,
                 label=org.name,
                 event=ACTION_LOCATION_FOUND,
             )
         )
コード例 #22
0
ファイル: pre_import.py プロジェクト: punchagan/akvo-rsr
def create_cats_and_benches(business_units):
    outsys("\nRunning {}() ".format(who_am_i()))
    for internal_id, data in business_units.items():
        if data.get('category'):
            for name in data['benchmarknames']:
                outsys('.')
                new_bench, created = Benchmarkname.objects.get_or_create(name=name)
                if created:
                    log(u"Created bench: {pk}, {label}",
                        dict(
                            label=name,
                            pk=new_bench.id,
                            event=ACTION_BENCH_CREATE
                        )
                        )
                else:
                    log(u"Found existing bench: {pk}, {label}",
                        dict(
                            label=name,
                            pk=new_bench.id,
                            event=ACTION_BENCH_FOUND
                        )
                        )
                try:
                    data['category'].benchmarknames.add(new_bench)
                except:
                    # we shouldn't end up here since we're testing for the existance of the category above
                    pass
        else:
            outsys('*')
            log(
                u"No category set of business unit with internal ID {internal_id}",
                dict(
                    internal_id=internal_id,
                    event=ERROR_CATEGORY_MISSING
                )
            )
コード例 #23
0
 with open(xml_file, "rb") as f:
     root = etree.fromstring(f.read())
     cordaid = Organisation.objects.get(id=CORDAID_ORG_ID)
     for org_etree in root:
         outsys('.')
         internal_id = text_from_xpath(org_etree, 'org_id')
         try:
             internal_org_id = InternalOrganisationID.objects.get(
                 recording_org=cordaid,
                 identifier=internal_id
             )
             log(
                 u"Found existing org {label} (Akvo PK {pk}) with Cordaid internal ID '{internal_id}'",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     label=internal_org_id.referenced_org.name,
                     pk=internal_org_id.referenced_org.pk,
                     internal_id=internal_id,
                     event=ACTION_FOUND
                 )
             )
             referenced_org = update_organisation(org_etree, internal_org_id)
             set_location_for_org(org_etree, internal_id, referenced_org)
         except InternalOrganisationID.MultipleObjectsReturned:
             log(
                 u"Error from lookup of internal ID {internal_id}. Multiple objects found.",
                 dict(
                     log_type=LOG_ORGANISATIONS,
                     internal_id=internal_id,
                     event=ERROR_MULTIPLE_OBJECTS
                 ),
             )
コード例 #24
0
ファイル: post_import.py プロジェクト: ronna/akvo-rsr
def fix_funding(budgets):
    """
    Add Cordaid as a funding partner to all its projects and "fill the project up"
    """
    outsys("\nRunning {}() ".format(who_am_i()))

    def assign_funding_partner(project, organisation, amount):
        funding_partnership, created = Partnership.objects.get_or_create(
            organisation=organisation,
            project=project,
            iati_organisation_role=Partnership.IATI_FUNDING_PARTNER,
            defaults={'funding_amount': amount}
        )
        if created:
            log(
                "Added {org_name} as funding partner to project {{pk}}, funding amount: {{extra}}".format(org_name=organisation.name),
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_SET, extra=amount)
            )
        else:
            funding_partnership.funding_amount = amount
            funding_partnership.save()
            log(
                "Found {org_name} as funding partner to project {{pk}}, setting funding amount: {{extra}}".format(org_name=organisation.name),
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_FUNDING_FOUND, extra=amount)
            )

    cordaid = Organisation.objects.get(pk=CORDAID_ORG_ID)
    others = Organisation.objects.get(pk=OTHERS_ORG_ID)
    for budget in budgets:
        internal_id = budget['internal_project_id']
        try:
            project = None
            project = Project.objects.get(
                partnerships__internal_id=internal_id, partnerships__organisation=cordaid
            )
            project.set_reporting_org(cordaid)
            project.save()
            cordaid_funding = budget.get('cordaid_funding', 0)
            others_funding = budget.get('others_funding', 0)
            if cordaid_funding:
                assign_funding_partner(project, cordaid, cordaid_funding)
            if others_funding:
                assign_funding_partner(project, others, others_funding)
            total_budget = cordaid_funding + others_funding
            old_budgets = BudgetItem.objects.filter(project=project)
            old_budgets.delete()
            BudgetItem.objects.create(
                project=project,
                label=BudgetItemLabel.objects.get(pk=BudgetItemLabel.TOTAL_BUDGET_LABEL_ID),
                amount=total_budget
            )
            log(
                "Total budget for project {pk}: {extra}",
                dict(internal_id=internal_id, pk=project.pk, event=ACTION_BUDGET_SET, extra=total_budget)
            )
            outsys(".")
        except Exception as e:
            log("Error setting up funding partners for project {pk}\nException class: {extra}",
                dict(internal_id=internal_id, pk=getattr(project, 'pk', None), event=e.__class__, extra=str(e)),
                )
            outsys("*")
    outsys('\n')