예제 #1
0
 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
예제 #2
0
    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
예제 #3
0
 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
예제 #4
0
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
예제 #5
0
 def project_currency(self):
     return project_currency(self)
예제 #6
0
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)
예제 #7
0
    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
예제 #8
0
def projectCurrency(data):
    return project_currency(data.context.aq_parent)
예제 #9
0
 def project_currency(self):
     return utils.project_currency(self)
예제 #10
0
def defaultCurrency(data):
    return utils.project_currency(data)