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. sfproject.amount_at_the_moment = "%01.2f" % (project.amount_donated / 100) sfproject.amount_requested = "%01.2f" % (project.amount_asked / 100) sfproject.amount_still_needed = "%01.2f" % (project.amount_needed / 100) if project.status == ProjectPhase.objects.get(slug="campaign"): sfproject.date_project_deadline = project.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 = project.status__name # SF Layout: Summary Project Details section. if project.country: sfproject.country_in_which_the_project_is_located = project.country.name sfproject.describe_the_project_in_one_sentence = project.pitch[:5000] sfproject.extensive_project_description = project.description # Set pitch status dates if project.status == ProjectPhase.objects.get(slug="plan-new") and not sfproject.date_pitch_created: sfproject.date_pitch_created = project.created elif project.status == ProjectPhase.objects.get(slug="plan-submitted") and not sfproject.date_pitch_submitted: sfproject.date_pitch_submitted = project.updated elif project.status == ProjectPhase.objects.get(slug="campaign") and not sfproject.date_pitch_approved: sfproject.date_pitch_approved = project.updated elif project.status == ProjectPhase.objects.get(slug="plan-rejected") and not sfproject.date_pitch_created: sfproject.date_pitch_rejected = project.updated sfproject.tags = "" for tag in project.tags.all(): sfproject.tags = str(tag) + ", " + sfproject.tags sfproject.target_group_s_of_the_project = project.for_who sfproject.number_of_people_reached_direct = project.reach sfproject.describe_where_the_money_is_needed_for = project.amount_needed sfproject.sustainability = project.future sfproject.contribution_project_in_reducing_poverty = project.effects # Set plan status dates if project.status == ProjectPhase.objects.get(slug="plan-submitted") and not sfproject.date_plan_submitted: sfproject.date_plan_submitted = project.updated elif project.status == ProjectPhase.objects.get(slug="campaign") and not sfproject.date_plan_approved: sfproject.date_plan_approved = project.updated elif project.status == ProjectPhase.objects.get(slug="plan-rejected") and not sfproject.date_plan_rejected: sfproject.date_plan_rejected = project.updated if project.organization: try: sfproject.organization_account = SalesforceOrganization.objects.get( external_id=project.organization.id) except SalesforceOrganization.DoesNotExist: logger.error("Unable to find organization id {0} in Salesforce for project id {1}".format( project.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 = #TODO: this doesn't make a lot of sense since act, realized and results are the same status now (done-completed) # Set project status dates sfproject.project_created_date = project.created if project.phase == ProjectPhase.objects.get(slug="done-completed") and not sfproject.date_project_act: sfproject.date_project_act = project.updated elif project.phase == ProjectPhase.objects.get(slug="done-completed") and not sfproject.date_project_realized: sfproject.date_project_realized = project.updated elif project.phase == ProjectPhase.objects.get(slug="done-stopped") and not sfproject.date_project_failed: sfproject.date_project_failed = project.updated elif project.phase == ProjectPhase.objects.get(slug="done-completed") 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
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_rejected = 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