def donors(self): other = api.content.find( portal_type=['ContribDonor'], path='/'.join(self.context.getPhysicalPath()) + '/contribs/', depth=2) results = [] letter = utils.project_currency(self) for item in other: obj = item.getObject() results.append( dict( title=item.Title, edit=item.getURL() + '/edit', incash=str(0 if obj.incash is None else obj.incash) + ' ' + letter, inkind=str(0 if obj.inkind is None else obj.inkind) + ' ' + letter, )) return results
def get_budget(self): # Assign total_budget value to index. Needed to find by value in Project Global Map results = api.content.find( path='/'.join(self.context.getPhysicalPath()) + '/contribs/', depth=2) total = 0 for result in results: obj = result.getObject() if obj.portal_type == 'ContribPartner' or obj.portal_type == 'ContribDonor' or obj.portal_type == 'ContribOther': if obj.incash == None: obj.incash = 0 if obj.inkind == None: obj.inkind = 0 total = total + obj.incash + obj.inkind self.context.total_budget = total if self.context.total_budget == 0: return None else: letter = utils.project_currency(self) return str(self.context.total_budget) + ' ' + letter
def others(self): other = api.content.find( portal_type=['ContribOther'], path='/'.join(self.context.getPhysicalPath()) + '/contribs/', depth=2) results = [] letter = utils.project_currency(self) for item in other: obj = item.getObject() results.append( dict( title=item.Title, edit=item.getURL() + '/edit', url=item.getURL(), path='/'.join(obj.getPhysicalPath()), portal_type=obj.portal_type, incash=str(0 if obj.incash is None else obj.incash) + ' ' + letter, inkind=str(0 if obj.inkind is None else obj.inkind) + ' ' + letter, roles=str('' if obj.organization_roles is None else ' [' + str(obj.organization_roles) + ']'), )) return results
def updateReport(self): if not hasattr(self, 'context'): self.context = self request = getRequest() refresh = request.form.get('refresh', False) if refresh: logger.info('YYY - User: '******'YYY - ' + str(self.context.save_data)) try: project = self.aq_parent.aq_parent except: project = self.context.aq_parent.aq_parent if self.context.save_data and self.context.save_data != "": self.context.save_data['project_overview']['project_name'] = project.title self.context.save_data['project_overview']['project_code'] = project.code self.context.save_data['summary']['progress']['roadblock'] = self.context.overall_project_status == 'roadblock' self.context.save_data['summary']['progress']['potential'] = self.context.overall_project_status == 'potential' self.context.save_data['summary']['progress']['ontrack'] = self.context.overall_project_status == 'ontrack' self.context.save_data['summary']['progress']['stakeholders'] = self.context.progress_stakeholders self.context.save_data['summary']['other'] = self.context.other_additional_challenges self.context.save_data['next_steps'] = self.context.next_steps if not refresh: return self.context.save_data data = {} attr_lang = getTitleAttrLang() project_manager_admin = getProjectManagerAdmin(self) today = datetime.datetime.now() data['project_url'] = project.absolute_url() data['generation_report_date'] = today.strftime('%m/%d/%Y %H:%M:%S') data['project_overview'] = { 'project_name': project.title, 'project_code': project.code, 'reporting_type': utils.getTranslatedMesuringFrequencyFromID(project.measuring_frequency).split(',')[0], 'reporting_period': { 'project_year': self.context.project_year, 'from': self.context.gwopa_year_phases[int(self.context.project_year) - 1]['start'], 'to': self.context.gwopa_year_phases[int(self.context.project_year) - 1]['end'] }, 'author_report': project_manager_admin[0]['fullname'], 'position_report': project_manager_admin[0]['position'], 'currency': utils.project_currency(self), 'water_operators': getProjectWaterOperators(project), # Array 'donors': getProjectDonors(project), # Array 'other_organizations': getProjectOtherOrganizations(project), # Array 'total_budget': "", 'project_location': { 'country': project.country, 'location': project.location }, 'project_duration': { 'start': project.startactual.strftime('%B %d, %Y'), 'end': project.completionactual.strftime('%B %d, %Y') }, 'association': { 'wop_platform': project.wop_platform, 'wop_program': project.wop_program }, 'project_description': project.objectives.output if hasattr(project.objectives, 'output') else '', 'project_image': project.absolute_url() + '/@@images/image' if project.image else None, 'logos': getLogosFirstpage(project), } data['project_overview']['total_budget'] = getTotalBudget( data['project_overview']['water_operators'] + data['project_overview']['donors'] + data['project_overview']['other_organizations']) totalBugdets = float(data['project_overview']['total_budget']) dataChartBudgets = {'chart': {'water_operators': {'series': [], 'colors': []}, 'donors': {'series': [], 'colors': []}, 'other_organizations': {'series': [], 'colors': []}}, 'legend': {'water_operators': [], 'donors': [], 'other_organizations': []}} pos = totalWO = 0 for wo in data['project_overview']['water_operators']: inkind = float(wo['inkind']) if 'inkind' in wo and wo['inkind'] else 0 incash = float(wo['incash']) if 'incash' in wo and wo['incash'] else 0 woValue = inkind + incash totalWO += woValue dataChartBudgets['chart']['water_operators']['series'].append(woValue) color = getHexColor(pos) pos += 1 dataChartBudgets['chart']['water_operators']['colors'].append(color) wo.update({'color': color}) dataChartBudgets['legend']['water_operators'].append(wo) dataChartBudgets['chart']['water_operators']['series'].append(totalBugdets - totalWO) dataChartBudgets['chart']['water_operators']['colors'].append('#F1F1F1') dataChartBudgets['chart']['donors']['series'].append(totalWO) dataChartBudgets['chart']['donors']['colors'].append('#F1F1F1') pos = totalDonors = 0 for donor in data['project_overview']['donors']: inkind = float(donor['inkind']) if 'inkind' in donor and donor['inkind'] else 0 incash = float(donor['incash']) if 'incash' in donor and donor['incash'] else 0 donorsValue = inkind + incash totalDonors += donorsValue dataChartBudgets['chart']['donors']['series'].append(donorsValue) color = getHexColor(pos) pos += 1 dataChartBudgets['chart']['donors']['colors'].append(color) donor.update({'color': color}) dataChartBudgets['legend']['donors'].append(donor) dataChartBudgets['chart']['donors']['series'].append(totalBugdets - totalWO - totalDonors) dataChartBudgets['chart']['donors']['colors'].append('#F1F1F1') dataChartBudgets['chart']['other_organizations']['series'].append(totalWO + totalDonors) dataChartBudgets['chart']['other_organizations']['colors'].append('#F1F1F1') pos = totalOO = 0 for oo in data['project_overview']['other_organizations']: inkind = float(oo['inkind']) if 'inkind' in oo and oo['inkind'] else 0 incash = float(oo['incash']) if 'incash' in oo and oo['incash'] else 0 ooValue = inkind + incash totalOO += ooValue dataChartBudgets['chart']['other_organizations']['series'].append(ooValue) color = getHexColor(pos) pos += 1 dataChartBudgets['chart']['other_organizations']['colors'].append(color) oo.update({'color': color}) dataChartBudgets['legend']['other_organizations'].append(oo) data['project_overview'].update({'chart_budget': dataChartBudgets['chart'], 'chart_budget_legend': dataChartBudgets['legend']}) working_areas = getWorkingAreas(project) data['summary'] = { 'working_areas': ", ".join([utils.getTranslatedWorkingAreaFromID(wa.id) for wa in working_areas]), 'progress': { 'roadblock': self.context.overall_project_status == 'roadblock', 'potential': self.context.overall_project_status == 'potential', 'ontrack': self.context.overall_project_status == 'ontrack', 'stakeholders': self.context.progress_stakeholders }, 'other': self.context.other_additional_challenges } data['activities_outputs'] = {} KEY = "GWOPA_TARGET_YEAR_" + str(self.context.project_year) for wa in working_areas: wa_title = utils.getTranslatedWorkingAreaFromID(wa.id) data['activities_outputs'].update({wa_title: { 'title': wa_title, 'activities': {}, }}) activities = getActivitiesWA(self, wa.getObject()) for activity in activities: activityObj = activity.getObject() activityAnn = IAnnotations(activityObj) activity_title = activityObj.title data['activities_outputs'][wa_title]['activities'].update({activity_title: { 'title': activity_title, 'start': activityObj.start.strftime('%m/%d/%Y'), 'completion': activityObj.end.strftime('%m/%d/%Y'), 'progress_tracker': { 'progress': activityAnn[KEY]['monitoring']['progress'] if 'progress' in activityAnn[KEY]['monitoring'] and activityAnn[KEY]['monitoring']['progress'] else 0, 'real': '100', 'measuring_unit': '%', 'style': '' }, 'description': { 'description': activityObj.description, 'planning': activityObj.initial_situation, 'explanation_progress': activityAnn[KEY]['monitoring']['explanation'] if 'explanation' in activityAnn[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': 'obstacles' in activityAnn[KEY]['monitoring'] and 'Internal organizational' in activityAnn[KEY]['monitoring']['obstacles'], 'external': 'obstacles' in activityAnn[KEY]['monitoring'] and 'External environment' in activityAnn[KEY]['monitoring']['obstacles'], "wop_related": 'obstacles' in activityAnn[KEY]['monitoring'] and 'WOP project - related' in activityAnn[KEY]['monitoring']['obstacles'], }, 'main_contributing': { 'internal': 'contributing' in activityAnn[KEY]['monitoring'] and 'Internal organizational' in activityAnn[KEY]['monitoring']['contributing'], 'external': 'contributing' in activityAnn[KEY]['monitoring'] and 'External environment' in activityAnn[KEY]['monitoring']['contributing'], "wop_related": 'contributing' in activityAnn[KEY]['monitoring'] and 'WOP project - related' in activityAnn[KEY]['monitoring']['contributing'], }, 'explain_limiting': activityAnn[KEY]['monitoring']['limiting'] if 'limiting' in activityAnn[KEY]['monitoring'] else "", 'cosidetation_for_future': activityAnn[KEY]['monitoring']['consideration'] if 'consideration' in activityAnn[KEY]['monitoring'] else "", 'outputs': {} }}) progress = int(data['activities_outputs'][wa_title]['activities'][activity_title]['progress_tracker']['progress']) data['activities_outputs'][wa_title]['activities'][activity_title]['progress_tracker']['style'] = 'transform: translateX(' + str(progress - 100) + '%);' outputs = getOutputsActivity(self, activityObj) for output in outputs: outputObj = output.getObject() outputAnn = IAnnotations(outputObj) output_title = outputObj.title data['activities_outputs'][wa_title]['activities'][activity_title]['outputs'].update({output_title: { 'title': output_title, 'start': outputObj.start.strftime('%m/%d/%Y'), 'completion': outputObj.end.strftime('%m/%d/%Y'), 'progress_tracker': { 'progress': outputAnn[KEY]['planned'] if 'planned' in outputAnn[KEY] and outputAnn[KEY]['planned'] else 0, 'real': outputAnn[KEY]['real'] if 'real' in outputAnn[KEY] and outputAnn[KEY]['real'] else 0, 'measuring_unit': utils.getTranslatedMesuringUnitFromID(outputObj.measuring_unit), 'style': '' }, 'description': { 'description': outputObj.description, 'explanation_progress': outputAnn[KEY]['monitoring']['explanation'] if 'explanation' in outputAnn[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': 'obstacles' in outputAnn[KEY]['monitoring'] and 'Internal organizational' in outputAnn[KEY]['monitoring']['obstacles'], 'external': 'obstacles' in outputAnn[KEY]['monitoring'] and 'External environment' in outputAnn[KEY]['monitoring']['obstacles'], "wop_related": 'obstacles' in outputAnn[KEY]['monitoring'] and 'WOP project - related' in outputAnn[KEY]['monitoring']['obstacles'], }, 'main_contributing': { 'internal': 'contributing' in outputAnn[KEY]['monitoring'] and 'Internal organizational' in outputAnn[KEY]['monitoring']['contributing'], 'external': 'contributing' in outputAnn[KEY]['monitoring'] and 'External environment' in outputAnn[KEY]['monitoring']['contributing'], "wop_related": 'contributing' in outputAnn[KEY]['monitoring'] and 'WOP project - related' in outputAnn[KEY]['monitoring']['contributing'], }, 'explain_limiting': outputAnn[KEY]['monitoring']['limiting'] if 'limiting' in outputAnn[KEY]['monitoring'] else "", 'cosidetation_for_future': outputAnn[KEY]['monitoring']['consideration'] if 'consideration' in outputAnn[KEY]['monitoring'] else "", 'means_of_verification': outputObj.means, }}) try: progress = int(float(data['activities_outputs'][wa_title]['activities'][activity_title]['outputs'][output_title]['progress_tracker']['real']) / float(data['activities_outputs'][wa_title]['activities'][activity_title]['outputs'][output_title]['progress_tracker']['progress']) * 100) except: progress = 0 data['activities_outputs'][wa_title]['activities'][activity_title]['outputs'][output_title]['progress_tracker']['style'] = 'transform: translateX(' + str(progress - 100) + '%);' data['outcomes'] = {'dash_info': getItems(project), 'list': {}} outcomes = getOutcomes(project) for outcome in outcomes: outcomeObj = outcome.getObject() annotations = IAnnotations(outcomeObj) outcome_title = getTranslatedOutcomesFromTitle(outcomeObj.title) data['outcomes']['list'].update({outcome_title: { 'title': outcome_title, 'zone': outcomeObj.zone, 'baseline_date': outcomeObj.baseline_date.strftime('%Y-%m'), 'baseline_value': outcomeObj.baseline, 'target_value_real': annotations[KEY]['real'] if 'real' in annotations[KEY] and annotations[KEY]['real'] else 0, 'target_value_planned': annotations[KEY]['planned'] if 'planned' in annotations[KEY] and annotations[KEY]['planned'] else 0, 'target_value_style': '', 'description': { 'description': outcomeObj.description, 'explanation_progress': annotations[KEY]['monitoring']['explanation'] if 'explanation' in annotations[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': 'obstacles' in annotations[KEY]['monitoring'] and 'Internal organizational' in annotations[KEY]['monitoring']['obstacles'], 'external': 'obstacles' in annotations[KEY]['monitoring'] and 'External environment' in annotations[KEY]['monitoring']['obstacles'], "wop_related": 'obstacles' in annotations[KEY]['monitoring'] and 'WOP project - related' in annotations[KEY]['monitoring']['obstacles'], }, 'main_contributing': { 'internal': 'contributing' in annotations[KEY]['monitoring'] and 'Internal organizational' in annotations[KEY]['monitoring']['contributing'], 'external': 'contributing' in annotations[KEY]['monitoring'] and 'External environment' in annotations[KEY]['monitoring']['contributing'], "wop_related": 'contributing' in annotations[KEY]['monitoring'] and 'WOP project - related' in annotations[KEY]['monitoring']['contributing'], }, 'explain_contributed': annotations[KEY]['monitoring']['limiting'] if 'limiting' in annotations[KEY]['monitoring'] else "", 'consideration': annotations[KEY]['monitoring']['consideration'] if 'consideration' in annotations[KEY]['monitoring'] else "", 'means_of_verification': outcomeObj.means, # TODO ??? }}) try: progress = int(float(data['outcomes']['list'][outcome_title]['target_value_real']) / float(data['outcomes']['list'][outcome_title]['target_value_planned']) * 100) except: progress = 0 data['outcomes']['list'][outcome_title]['target_value_style'] = 'transform: translateX(' + str(progress - 100) + '%);' data['outcomes_capacity'] = {} for wa in working_areas: wa_title = utils.getTranslatedWorkingAreaFromID(wa.id) wa_object = wa.getObject() data['outcomes_capacity'].update({wa_title: { 'title': wa_title, 'getCurrentStage': getCurrentStage(wa_object, self.context.project_year), 'getOutcomeCC': getOutcomeCC(wa_object, self.context.project_year), 'capacities': {}, }}) outcomecc = getOutcomesCapacityWA(wa_object)[0] annotations = IAnnotations(outcomecc.getObject()) for capacity in annotations[KEY]['monitoring']: if 'selected' in capacity['selected_specific']: capacity_title = getTitleSpecific(capacity) data['outcomes_capacity'][wa_title]['capacities'].update({capacity_title: { 'title': capacity_title, 'degree_changes': capacity['degree_changes'] if 'degree_changes' in capacity and capacity['degree_changes'] else '', 'contributed_project': capacity['contributed_project'] if 'contributed_project' in capacity and capacity['contributed_project'] else '', 'consensus': capacity['consensus'] if 'consensus' in capacity and capacity['consensus'] else '', 'main_obstacles': { 'internal': 'obstacles' in capacity and 'Internal organizational' in capacity['obstacles'], 'external': 'obstacles' in capacity and 'External environment' in capacity['obstacles'], "wop_related": 'obstacles' in capacity and 'WOP project - related' in capacity['obstacles'], }, 'main_contributing': { 'internal': 'contributing_factors' in capacity and 'Internal organizational' in capacity['contributing_factors'], 'external': 'contributing_factors' in capacity and 'External environment' in capacity['contributing_factors'], "wop_related": 'contributing_factors' in capacity and 'WOP project - related' in capacity['contributing_factors'], }, 'explain': capacity['explain'], 'means_of_verification': "", # TODO ??? }}) data['budget'] = { 'planned_activities': {}, 'total_budget': "", } allActivities = api.content.find( portal_type=['Activity'], context=project) for activity in allActivities: title = '[' + getattr(activityObj.aq_parent, attr_lang.lower()) + '] ' + activity.Title activityObj = activity.getObject() data['budget']['planned_activities'].update({title: { 'title': title, 'wa_title': utils.getTranslatedWorkingAreaFromID(activityObj.aq_parent.id), 'act_title': activity.Title, 'assigned_budget': activityObj.budget }}) if not refresh: data['budget']['planned_activities'][title].update({'expenditure_reporting_period': ''}) data['budget']['planned_activities'][title].update({'total_expenditure_date': ''}) else: data['budget']['planned_activities'][title].update({'expenditure_reporting_period': self.context.save_data['budget']['planned_activities'][title]['expenditure_reporting_period'] if 'expenditure_reporting_period' in data['budget']['planned_activities'][title] else ''}) data['budget']['planned_activities'][title].update({'total_expenditure_date': self.context.save_data['budget']['planned_activities'][title]['total_expenditure_date'] if 'total_expenditure_date' in data['budget']['planned_activities'][title] else ''}) data['budget']['total_budget'] = getTotalAssignedBudget(data['budget']['planned_activities']) data['next_steps'] = self.context.next_steps self.context.save_data = data return data
def project_currency(self): return project_currency(self)
def projectModified(content, event): """ Project modified handler. Create new areas.newSometimes this code is executed and the project is not edited. In example, changing permissions, this hook is executed. We check the transition when edit, and seems to be: zope.lifecycleevent.ObjectModifiedEvent """ # Really check if project is modified if 'zope.lifecycleevent.ObjectModifiedEvent' in str(event): # Grant Editor/Reader role to members in project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager_admin: api.user.grant_roles(username=content.project_manager_admin, obj=content, roles=['Contributor', 'Editor', 'Reader']) wop_partners = getUsersRegionalWOPPlatform(content.wop_platform) if wop_partners: for user in wop_partners: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) wop_programs = getUsersWOPProgram(content.wop_program) if wop_programs: for user in wop_programs: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) users = [perm[0] for perm in content.get_local_roles()] for user in users: members = [] if content.members == None else content.members project_manager = [] if content.project_manager == None else content.project_manager project_manager_admin = [] if content.project_manager_admin == None else content.project_manager_admin if user not in members and user not in project_manager and user not in project_manager_admin and user not in wop_partners and user not in wop_programs: api.user.revoke_roles(username=user, obj=content, roles=['Contributor', 'Editor', 'Reader']) # Asign default image if not set if content.image is None: data = requests.get(api.portal.get().aq_parent.absolute_url( ) + '/++theme++gwopa.theme/assets/images/default_image.jpg', verify=False, timeout=10).content default_image = NamedBlobImage(data=data, filename=u'image.jpg', contentType='image/jpeg') content.image = default_image # Assign values to fases fases = int(math.ceil(float((content.completionactual - content.startactual).days) / float(365))) date1 = content.startactual date2 = content.completionactual if date2.month < date1.month or (date2.month == date1.month and date2.day < date1.day): rangeDates = range(date2.year - date1.year) else: rangeDates = range(date2.year - date1.year + 1) datas = [(date1 + relativedelta(years=i)).strftime("%B %d, %Y") for i in rangeDates] + [date2.strftime("%B %d, %Y")] isodate = [(date1 + relativedelta(years=i)).strftime("%Y-%m-%d") for i in rangeDates] + [date2.strftime("%Y-%m-%d")] patterndate = [(date1 - dateutil.relativedelta.relativedelta(months=1) + relativedelta(years=i)).strftime( "%Y %m %d").replace(' 0', ' ').replace(' ', ',') for i in rangeDates] patterndate.append((date2 - dateutil.relativedelta.relativedelta(months=1) ).strftime("%Y %m %d").replace(' 0', ' ').replace(' ', ',')) results = [] if fases > 1: count = 0 while count != fases: results.append(dict( start=datas[0 + count], end=datas[1 + count], start_iso=isodate[0 + count], end_iso=isodate[1 + count], pattern_start=patterndate[0 + count], pattern_end=patterndate[1 + count], fase=count + 1 )) count = count + 1 else: count = 0 results.append(dict( start=datas[0], end=datas[1], start_iso=isodate[0], end_iso=isodate[1], pattern_start=patterndate[0], pattern_end=patterndate[1], fase=1 )) content.gwopa_year_phases = results measuring_frequency = content.measuring_frequency if measuring_frequency: frequency = int(measuring_frequency[-1]) if frequency == 4: N_MONTHS = 3 elif frequency == 2: N_MONTHS = 6 elif frequency == 1: N_MONTHS = 12 reports = [] N_DAYS_AGO = 15 if content.project_manager_admin: user = api.user.get(content.project_manager_admin) email = user.getProperty('email') if fases > 1: count = 0 while count != fases: count = count + 1 date_start_year = datetime.strptime(results[count-1]['start'], "%B %d, %Y").date() # date_end_year = datetime.strptime(results[count-1]['end'], "%B %d, %Y").date() for i in range(frequency): date_generate_report = date_start_year + relativedelta(months=N_MONTHS) if date2 >= date_generate_report and date2 != date_start_year: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date_start_year = date_generate_report elif date2 == date_start_year: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break else: count = 0 for i in range(frequency): date_generate_report = date1 + relativedelta(months=N_MONTHS) if date2 > date_generate_report: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date1 = date_generate_report elif date2 == date1: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break content.gwopa_reporting = reports logger.info('Dates to reporting project {} id {}'.format(content.title.encode('utf-8'), content.id)) # Assign Areas new_areas = content.areas current = [a.id for a in api.content.find( portal_type="ImprovementArea", context=content, depth=1)] new_areas = content.areas if new_areas is None: return else: for area in new_areas: if area not in current: data = api.content.find(portal_type="ItemArea", id=quote_chars(area))[0] if data.id not in content: api.content.create( type=u'ImprovementArea', id=data.id, title=data.Title.decode('utf-8'), title_es=data.title_es, title_fr=data.title_fr, description=data.Description, image=data.getObject().image, container=content) # Delete Areas delete_areas = list(set(current) - set(new_areas)) for area in delete_areas: item = api.content.find(portal_type="ImprovementArea", id=quote_chars(area), context=content) if item: api.content.delete(obj=item[0].getObject(), check_linkintegrity=False) # Modify project_dates and currency project_path = '/'.join(content.getPhysicalPath()) activities = api.content.find(portal_type="Activity", path=project_path) for activity in activities: item = activity.getObject() project_dates = "The dates must be between the limits of this Project. Start: " + str(content.startactual) + " End: " + str(content.completionactual) if item.project_dates != project_dates: item.project_dates = project_dates item.currency = project_currency(content) item.reindexObject() path = '/'.join(content.contribs.getPhysicalPath()) partners = content.partners if partners: for partner in partners: item = api.content.find( portal_type='ContribPartner', Title=quote_chars(partner), path=path) if not item: obj = api.content.create( type='ContribPartner', title=partner, container=content.contribs) obj.incash = 0 obj.inkind = 0 else: partners = [] all_partners = [] items_partners = api.content.find( portal_type='ContribPartner', path=path) for item_partner in items_partners: item_partner_obj = item_partner.getObject() all_partners.append(item_partner_obj.title) for item in all_partners: if item not in partners: obj = api.content.find( portal_type='ContribPartner', Title=quote_chars(item), path=path) api.content.delete(obj=obj[0].getObject(), check_linkintegrity=False) donors = content.donors if donors: for donor in donors: item = api.content.find( portal_type='ContribDonor', Title=quote_chars(donor), path=path) if not item: obj = api.content.create( type='ContribDonor', title=donor, container=content.contribs) obj.incash = 0 obj.inkind = 0 else: donors = [] all_donors = [] items_donors = api.content.find( portal_type='ContribDonor', path=path) for item_donor in items_donors: item_donor_obj = item_donor.getObject() all_donors.append(item_donor_obj.title) for item in all_donors: if item not in donors: obj = api.content.find( portal_type='ContribDonor', Title=quote_chars(item), path=path) api.content.delete(obj=obj[0].getObject(), check_linkintegrity=False) path_files = '/'.join(content.files.getPhysicalPath()) folder_files = api.content.find(portal_type="Folder", path=path_files) obj_files = folder_files[0].getObject() # Grant Contributor role to members in folder files project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) # Partnership practice try: partnerships = content.partnerships except: partnerships = api.content.create( type='Folder', id='partnerships', title='Partnerships', container=content) logger.info('Create folder partnerships in project {} id {}'.format(content.title, content.id)) behaviorp = ISelectableConstrainTypes(partnerships) behaviorp.setConstrainTypesMode(1) behaviorp.setLocallyAllowedTypes(('PartnershipPractice', 'Folder')) behaviorp.setImmediatelyAddableTypes(('PartnershipPractice', 'Folder')) current_partnerships = [a.id for a in api.content.find( portal_type="PartnershipPractice", context=content.partnerships, depth=1)] config_folder = api.content.find(type='Folder',id='partnershippractice') config_folder = config_folder[0].getObject() partnerships_default = api.content.find( portal_type=['PartnershipPractice'], context=config_folder, sort_on='getObjPositionInParent') for partnership in partnerships_default: if partnership.id not in current_partnerships: partnership = partnership.getObject() obj = api.content.create( type='PartnershipPractice', title=partnership.title, title_es=partnership.title_es, title_fr=partnership.title_fr, description=partnership.description, description_es=partnership.description_es, description_fr=partnership.description_fr, container=content.partnerships)
def reportData(self): data = {} attr_lang = getTitleAttrLang() project_manager_admin = self.getProjectManagerAdmin() today = datetime.datetime.now() data['generation_report_date'] = today.strftime('%m/%d/%Y %H:%M:%S') data['project_overview'] = { 'project_name': self.context.title, 'project_code': "", # empty 'reporting_type': utils.getTranslatedMesuringFrequencyFromID( self.context.measuring_frequency), 'reporting_period': { 'project_year': self.getYear(), 'from': self.getFaseStart(), # TODO ??? 'to': self.getFaseEnd() # TODO ???? }, 'author_report': project_manager_admin[0]['fullname'], # TODO ??? 'position_report': project_manager_admin[0]['position'], # TODO ??? 'currency': utils.project_currency(self), 'water_operators': self.getProjectWaterOperators(), # Array 'donors': self.getProjectDonors(), # Array 'other_organizations': self.getProjectOtherOrganizations(), # Array 'total_budget': "", 'project_location': { 'country': self.context.country, 'location': self.context.location }, 'project_duration': { 'start': self.context.startactual.strftime('%m/%d/%Y'), 'end': self.context.completionactual.strftime('%m/%d/%Y') }, 'association': { 'wop_platform': self.context.wop_platform, 'wop_program': self.context.wop_program }, 'project_description': self.context.objectives, } data['project_overview']['total_budget'] = self.getTotalBudget( data['project_overview']['water_operators'] + data['project_overview']['donors'] + data['project_overview']['other_organizations']) working_areas = self.getWorkingAreas() data['summary'] = { 'working_areas': ", ".join([getattr(wa, attr_lang) for wa in working_areas]), 'progress': "", # empty 'other': "" # empty } data['activities_outputs'] = {} KEY = "GWOPA_TARGET_YEAR_" + str(self.year) for wa in working_areas: wa_title = getattr(wa, attr_lang) data['activities_outputs'].update( {wa_title: { 'title': wa_title, 'activities': {}, }}) activities = self.getActivitiesWA(wa.getObject()) for activity in activities: activityObj = activity.getObject() activityAnn = IAnnotations(activityObj) activity_title = activityObj.title data['activities_outputs'][wa_title]['activities'].update({ activity_title: { 'title': activity_title, 'start': activityObj.start.strftime('%m/%d/%Y'), 'completion': activityObj.end.strftime('%m/%d/%Y'), 'progress_tracker': { 'progress': activityAnn[KEY]['monitoring']['progress'] if 'progress' in activityAnn[KEY]['monitoring'] else "", 'real': '100', 'measuring_unit': '%', }, 'description': { 'description': activityObj.description, 'planning': activityObj.initial_situation, 'explanation_progress': activityAnn[KEY]['monitoring']['explanation'] if 'explanation' in activityAnn[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': "X" if 'obstacles' in activityAnn[KEY]['monitoring'] and 'Internal organizational' in activityAnn[KEY]['monitoring']['obstacles'] else "", 'external': "X" if 'obstacles' in activityAnn[KEY]['monitoring'] and 'External environment' in activityAnn[KEY]['monitoring']['obstacles'] else "", "wop_related": "X" if 'obstacles' in activityAnn[KEY]['monitoring'] and 'WOP project - related' in activityAnn[KEY]['monitoring']['obstacles'] else "", }, 'main_contributing': { 'internal': "X" if 'contributing' in activityAnn[KEY]['monitoring'] and 'Internal organizational' in activityAnn[KEY]['monitoring']['contributing'] else "", 'external': "X" if 'contributing' in activityAnn[KEY]['monitoring'] and 'External environment' in activityAnn[KEY]['monitoring']['contributing'] else "", "wop_related": "X" if 'contributing' in activityAnn[KEY]['monitoring'] and 'WOP project - related' in activityAnn[KEY]['monitoring']['contributing'] else "", }, 'explain_limiting': activityAnn[KEY]['monitoring']['limiting'] if 'limiting' in activityAnn[KEY]['monitoring'] else "", 'cosidetation_for_future': activityAnn[KEY]['monitoring']['consideration'] if 'consideration' in activityAnn[KEY]['monitoring'] else "", 'means_of_verification': "", # TODO ??? 'outputs': {} } }) outputs = self.getOutputsActivity(activityObj) for output in outputs: outputObj = output.getObject() outputAnn = IAnnotations(outputObj) output_title = outputObj.title data['activities_outputs'][wa_title]['activities'][ activity_title]['outputs'].update({ output_title: { 'title': output_title, 'start': outputObj.start.strftime('%m/%d/%Y'), 'completion': outputObj.end.strftime('%m/%d/%Y'), 'progress_tracker': { 'progress': outputAnn[KEY]['planned'], 'real': outputAnn[KEY]['real'], 'measuring_unit': utils.getTranslatedMesuringUnitFromID( outputObj.measuring_unit), }, 'description': { 'description': outputObj.description, 'explanation_progress': outputAnn[KEY]['monitoring']['explanation'] if 'explanation' in outputAnn[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': "X" if 'obstacles' in outputAnn[KEY]['monitoring'] and 'Internal organizational' in outputAnn[KEY]['monitoring']['obstacles'] else "", 'external': "X" if 'obstacles' in outputAnn[KEY]['monitoring'] and 'External environment' in outputAnn[KEY]['monitoring']['obstacles'] else "", "wop_related": "X" if 'obstacles' in outputAnn[KEY]['monitoring'] and 'WOP project - related' in outputAnn[KEY]['monitoring']['obstacles'] else "", }, 'main_contributing': { 'internal': "X" if 'contributing' in outputAnn[KEY]['monitoring'] and 'Internal organizational' in outputAnn[KEY] ['monitoring']['contributing'] else "", 'external': "X" if 'contributing' in outputAnn[KEY]['monitoring'] and 'External environment' in outputAnn[KEY] ['monitoring']['contributing'] else "", "wop_related": "X" if 'contributing' in outputAnn[KEY]['monitoring'] and 'WOP project - related' in outputAnn[KEY] ['monitoring']['contributing'] else "", }, 'explain_limiting': outputAnn[KEY]['monitoring']['limiting'] if 'limiting' in outputAnn[KEY]['monitoring'] else "", 'cosidetation_for_future': outputAnn[KEY]['monitoring']['consideration'] if 'consideration' in outputAnn[KEY]['monitoring'] else "", 'means_of_verification': "", # TODO ??? } }) data['outcomes'] = {} outcomes = self.getOutcomes() for outcome in outcomes: outcomeObj = outcome.getObject() annotations = IAnnotations(outcomeObj) outcome_title = getattr(outcome, attr_lang) data['outcomes'].update({ outcome_title: { 'title': outcome_title, 'zone': outcomeObj.zone, 'baseline_date': outcomeObj.baseline_date.strftime('%Y-%m'), 'baseline_value': outcomeObj.baseline, 'target_value_real': annotations[KEY]['real'], 'target_value_planned': annotations[KEY]['planned'], 'description': { 'description': outcomeObj.description, 'explanation_progress': annotations[KEY]['monitoring']['explanation'] if 'explanation' in annotations[KEY]['monitoring'] else "", }, 'main_obstacles': { 'internal': "X" if 'obstacles' in annotations[KEY]['monitoring'] and 'Internal organizational' in annotations[KEY]['monitoring']['obstacles'] else "", 'external': "X" if 'obstacles' in annotations[KEY]['monitoring'] and 'External environment' in annotations[KEY]['monitoring']['obstacles'] else "", "wop_related": "X" if 'obstacles' in annotations[KEY]['monitoring'] and 'WOP project - related' in annotations[KEY]['monitoring']['obstacles'] else "", }, 'main_contributing': { 'internal': "X" if 'contributing' in annotations[KEY]['monitoring'] and 'Internal organizational' in annotations[KEY]['monitoring']['contributing'] else "", 'external': "X" if 'contributing' in annotations[KEY]['monitoring'] and 'External environment' in annotations[KEY]['monitoring']['contributing'] else "", "wop_related": "X" if 'contributing' in annotations[KEY]['monitoring'] and 'WOP project - related' in annotations[KEY]['monitoring']['contributing'] else "", }, 'explain_contributed': annotations[KEY]['monitoring']['limiting'] if 'limiting' in annotations[KEY]['monitoring'] else "", 'consideration': annotations[KEY]['monitoring']['consideration'] if 'consideration' in annotations[KEY]['monitoring'] else "", 'means_of_verification': outcomeObj.means, # TODO ??? } }) data['outcomes_capacity'] = {} for wa in working_areas: wa_title = getattr(wa, attr_lang) data['outcomes_capacity'].update( {wa_title: { 'title': wa_title, 'capacities': {}, }}) outcomecc = self.getOutcomesCapacityWA(wa.getObject())[0] annotations = IAnnotations(outcomecc.getObject()) for capacity in annotations[KEY]['monitoring']: if 'selected' in capacity['selected_specific']: capacity_title = self.getTitleSpecific(capacity) data['outcomes_capacity'][wa_title]['capacities'].update({ capacity_title: { 'title': capacity_title, 'consensus': capacity['consensus'], 'main_obstacles': { 'internal': "X" if 'obstacles' in capacity and 'Internal organizational' in capacity['obstacles'] else "", 'external': "X" if 'obstacles' in capacity and 'External environment' in capacity['obstacles'] else "", "wop_related": "X" if 'obstacles' in capacity and 'WOP project - related' in capacity['obstacles'] else "", }, 'main_contributing': { 'internal': "X" if 'contributing_factors' in capacity and 'Internal organizational' in capacity['contributing_factors'] else "", 'external': "X" if 'contributing_factors' in capacity and 'External environment' in capacity['contributing_factors'] else "", "wop_related": "X" if 'contributing_factors' in capacity and 'WOP project - related' in capacity['contributing_factors'] else "", }, 'explain': capacity['explain'], 'means_of_verification': "", # TODO ??? } }) data['budget'] = { 'planned_activities': [], 'total_budget': "", } allActivities = api.content.find(portal_type=['Activity'], context=self.context) for activity in allActivities: activityObj = activity.getObject() data['budget']['planned_activities'].append({ 'wa_title': getattr(activityObj.aq_parent, attr_lang.lower()), 'title': activity.Title, 'assigned_budget': activityObj.budget, }) data['budget']['total_budget'] = self.getTotalAssignedBudget( data['budget']['planned_activities']) return data
def projectCurrency(data): return project_currency(data.context.aq_parent)
def project_currency(self): return utils.project_currency(self)
def defaultCurrency(data): return utils.project_currency(data)