Exemplo n.º 1
0
def sync_projects(dry_run, sync_from_datetime, loglevel):
    logger.setLevel(loglevel)
    error_count = 0
    success_count = 0

    projects = Project.objects.all()

    if sync_from_datetime:
        projects = projects.filter(updated__gte=sync_from_datetime)

    logger.info("Syncing {0} Project objects.".format(projects.count()))

    for project in projects:
        logger.debug("Syncing Project: {0}".format(project.id))

        # Find the corresponding SF project.
        try:
            sfproject = SalesforceProject.objects.get(external_id=project.id)
        except SalesforceProject.DoesNotExist:
            sfproject = SalesforceProject()

        # SF Layout: 1%CLUB Project Detail section.
        try:
            project_campaign = ProjectCampaign.objects.get(project=project)
        except ProjectCampaign.DoesNotExist:
            pass
        else:
            sfproject.amount_at_the_moment = "%01.2f" % (project_campaign.money_donated / 100)
            sfproject.amount_requested = "%01.2f" % (project_campaign.money_asked / 100)
            sfproject.amount_still_needed = "%01.2f" % (project_campaign.money_needed / 100)
            if project.phase == ProjectPhases.campaign:
                sfproject.date_project_deadline = project_campaign.deadline

        try:
            sfproject.project_owner = SalesforceContact.objects.get(external_id=project.owner.id)
        except SalesforceContact.DoesNotExist:
            logger.error(
                "Unable to find contact id {0} in Salesforce for project id {1}".format(project.owner.id, project.id)
            )

        sfproject.project_name = project.title
        sfproject.status_project = ProjectPhases.values[project.phase].title()

        # SF Layout: Summary Project Details section.
        try:
            project_pitch = ProjectPitch.objects.get(project=project)
        except ProjectPitch.DoesNotExist:
            pass
        else:
            if project_pitch.country:
                sfproject.country_in_which_the_project_is_located = project_pitch.country.name
            sfproject.describe_the_project_in_one_sentence = project_pitch.pitch[:5000]
            sfproject.extensive_project_description = project_pitch.description

            # Set pitch status dates
            if project_pitch.status == ProjectPitch.PitchStatuses.new and not sfproject.date_pitch_created:
                sfproject.date_pitch_created = project_pitch.created
            elif project_pitch.status == ProjectPitch.PitchStatuses.submitted and not sfproject.date_pitch_submitted:
                sfproject.date_pitch_submitted = project_pitch.updated
            elif project_pitch.status == ProjectPitch.PitchStatuses.approved and not sfproject.date_pitch_approved:
                sfproject.date_pitch_approved = project_pitch.updated
            elif project_pitch.status == ProjectPitch.PitchStatuses.rejected and not sfproject.date_pitch_created:
                sfproject.date_pitch_created = project_pitch.updated

            sfproject.tags = ""
            for tag in project_pitch.tags.all():
                sfproject.tags = str(tag) + ", " + sfproject.tags

        try:
            project_plan = ProjectPlan.objects.get(project=project)
        except ProjectPlan.DoesNotExist:
            sfproject.organization_account = None
        else:
            sfproject.target_group_s_of_the_project = project_plan.for_who
            sfproject.number_of_people_reached_direct = project_plan.reach
            sfproject.describe_where_the_money_is_needed_for = project_plan.money_needed
            sfproject.sustainability = project_plan.future
            sfproject.contribution_project_in_reducing_poverty = project_plan.effects

            # Set plan status dates
            if project_plan.status == ProjectPlan.PlanStatuses.submitted and not sfproject.date_plan_submitted:
                sfproject.date_plan_submitted = project_plan.updated
            elif project_plan.status == ProjectPlan.PlanStatuses.approved and not sfproject.date_plan_approved:
                sfproject.date_plan_approved = project_plan.updated
            elif project_plan.status == ProjectPlan.PlanStatuses.rejected and not sfproject.date_plan_rejected:
                sfproject.date_plan_rejected = project_plan.updated

            # Project referrals (ambassador) - expected are three or less related values
            try:
                project_ambs = ProjectAmbassador.objects.filter(project_plan=project_plan)
                if project_ambs.count() > 0:
                    sfproject.name_referral_1 = project_ambs[0].name
                    sfproject.description_referral_1 = project_ambs[0].description
                    sfproject.email_address_referral_1 = project_ambs[0].email
                if project_ambs.count() > 1:
                    sfproject.name_referral_2 = project_ambs[1].name
                    sfproject.description_referral_2 = project_ambs[1].description
                    sfproject.email_address_referral_2 = project_ambs[1].email
                if project_ambs.count() > 2:
                    sfproject.name_referral_3 = project_ambs[2].name
                    sfproject.description_referral_3 = project_ambs[2].description
                    sfproject.email_address_referral_3 = project_ambs[2].email
            except ProjectAmbassador.DoesNotExist:
                pass

            # TODO: determine what should be in project number_of_people_reached_indirect?
            # sfproject.number_of_people_reached_indirect = (project.fundphase.impact_indirect_male +
            #                                                project.fundphase.impact_indirect_female)
            if project_plan.organization:
                try:
                    sfproject.organization_account = SalesforceOrganization.objects.get(
                        external_id=project_plan.organization.id
                    )
                except SalesforceOrganization.DoesNotExist:
                    logger.error(
                        "Unable to find organization id {0} in Salesforce for project id {1}".format(
                            project_plan.organization.id, project.id
                        )
                    )

        sfproject.project_url = "http://www.onepercentclub.com/en/#!/projects/{0}".format(project.slug)

        # Unknown: sfproject.third_half_project =
        # Unknown: sfproject.earth_charther_project =

        # Set project status dates
        sfproject.project_created_date = project.created
        if project.phase == ProjectPhases.act and not sfproject.date_project_act:
            sfproject.date_project_act = project.updated
        elif project.phase == ProjectPhases.realized and not sfproject.date_project_realized:
            sfproject.date_project_realized = project.updated
        elif project.phase == ProjectPhases.failed and not sfproject.date_project_failed:
            sfproject.date_project_failed = project.updated
        elif project.phase == ProjectPhases.results and not sfproject.date_project_result:
            sfproject.date_project_result = project.updated

        # SF Layout: Other section.
        sfproject.external_id = project.id

        # Save the object to Salesforce
        if not dry_run:
            try:
                sfproject.save()
                success_count += 1
            except Exception as e:
                error_count += 1
                logger.error("Error while saving project id {0}: ".format(project.id) + str(e))

    return success_count, error_count