예제 #1
0
 def dispatch_request(self):
     if not current_user.is_authenticated():
         raise PermissionDenied
     period = request.args.get('period') or get_default_period()
     period_obj = Dataset.query.get(period)
     history = self.get_history(period)
     return render_template(
         self.template,
         history=history,
         subject_name=self.subject_name,
         summary_endpoint=self.summary_endpoint,
         period=period_obj,
     )
예제 #2
0
 def dispatch_request(self):
     if not current_user.is_authenticated:
         raise PermissionDenied
     period = request.args.get('period') or get_default_period()
     period_obj = Dataset.query.get(period)
     history = self.get_history(period)
     return render_template(
         self.template,
         history=history,
         subject_name=self.subject_name,
         summary_endpoint=self.summary_endpoint,
         period=period_obj,
     )
예제 #3
0
    def get_default_values(self):
        period = request.args.get('period') or get_default_period()
        subject = request.args.get('subject')
        region = request.args.get('region')
        if consultation_ended() and (etc_perm.can() or admin_perm.can()):
            best = (
                self.model_manual_cls.query
                .filter_by(
                    dataset_id=period,
                    subject=subject,
                    region=region,
                    decision='OK',
                )
                .first()
            )
            if best:
                return best.__dict__

        best = (
            self.model_auto_cls.query
            .filter_by(dataset_id=period, subject=subject, region=region)
            .join(
                EtcDicMethod,
                self.model_auto_cls.assessment_method == EtcDicMethod.method
            )
        ).all()
        cmpf = (
            lambda x, y:
            -1 if x.assessment_method == '00' else cmp(x.order, y.order)
        )
        best.sort(cmp=cmpf)
        values = {}
        for f in all_fields(self.manual_form_cls()):
            attr = f.name
            for ass in filter(lambda a: getattr(a, attr, None), best):
                if attr not in EXCLUDE_FIELDS:
                    values[attr] = split_semicolon(attr, getattr(ass, attr))
                if attr in CONC_METHODS:
                    method = getattr(ass, 'assessment_method')
                    values[CONC_METHODS[attr]] = method
                break
        # Special case: conclusion_assessment_prev
        prev_lu = (
            self.prev_lu_cls.query
            .filter_by(subject=subject, region=region, dataset_id=period)
            .first()
        )
        if prev_lu:
            values['conclusion_assessment_prev'] = prev_lu.conclusion_assessment
        return values
예제 #4
0
    def get_default_values(self):
        period = request.args.get('period') or get_default_period()
        subject = request.args.get('subject')
        region = request.args.get('region')
        if consultation_ended() and (etc_perm.can() or admin_perm.can()):
            best = (self.model_manual_cls.query.filter_by(
                dataset_id=period,
                subject=subject,
                region=region,
                decision='OK',
            ).first())
            if best:
                return best.__dict__

        best = (self.model_auto_cls.query.filter_by(
            dataset_id=period, subject=subject, region=region).join(
                EtcDicMethod,
                self.model_auto_cls.assessment_method == EtcDicMethod.method)
                ).all()
        cmpf = (lambda x, y: -1
                if x.assessment_method == '00' else cmp(x.order, y.order))
        best.sort(cmp=cmpf)
        values = {}
        # for f in all_fields(self.manual_form_cls()):
        #     attr = f.name
        #     for ass in filter(lambda a: getattr(a, attr, None), best):
        #         if attr not in EXCLUDE_FIELDS:
        #             values[attr] = split_semicolon(attr, getattr(ass, attr))
        #         if attr in CONC_METHODS:
        #             method = getattr(ass, 'assessment_method')
        #             values[CONC_METHODS[attr]] = method
        #         break
        # Special case: conclusion_assessment_prev
        prev_lu = (self.prev_lu_cls.query.filter_by(subject=subject,
                                                    region=region,
                                                    dataset_id=period).first())

        if prev_lu:
            if period == '3':
                values[
                    'conclusion_assessment_prev'] = prev_lu.conclusion_assessment
            if period == '5':
                values[
                    'conclusion_assessment_prev'] = prev_lu.conclusion_assessment_prev
                values[
                    'conclusion_assessment_trend_prev'] = prev_lu.conclusion_assessment_trend_prev
                values['backcasted_2007'] = prev_lu.backcasted_2007
        return values
예제 #5
0
    def dispatch_request(self):
        period = request.args.get('period') or get_default_period()
        group = request.args.get('group')
        country = request.args.get('country')
        region = request.args.get('region')

        self.objects = []
        self.setup_objects_and_data(period, group, country, region)

        countries = self.get_countries(period)
        regions = self.get_regions_by_country(period, country)
        report_filter_form = ReportFilterForm(
            MultiDict(
                dict(period=period,
                     group=group,
                     country=country,
                     region=region)))
        report_filter_form.group.choices = self.get_groups(period)
        report_filter_form.country.choices = countries
        report_filter_form.region.choices = regions

        countries_map = dict(countries)
        regions_map = dict(regions)
        period_query = Dataset.query.get(period)
        period_name = period_query.name if period_query else ''

        current_selection = self.get_current_selection(
            period_name, group, countries_map.get(country, country),
            regions_map.get(region, region))

        context = self.get_context()
        context.update({
            'objects': self.objects,
            'current_selection': current_selection,
            'report_filter_form': report_filter_form,
            'region': region,
            'country': country,
            'show_report_headers': True,
            'dataset': period_query,
            'generate_map_url': generate_map_url,
        })

        return render_template(self.template_name, **context)
예제 #6
0
    def dispatch_request(self):
        period = request.args.get('period') or get_default_period()
        group = request.args.get('group')
        country = request.args.get('country')
        region = request.args.get('region')

        self.objects = []
        self.setup_objects_and_data(period, group, country, region)

        countries = self.get_countries(period)
        regions = self.get_regions_by_country(period, country)
        report_filter_form = ReportFilterForm(
            MultiDict(dict(period=period, group=group, country=country,
                           region=region))
        )
        report_filter_form.group.choices = self.get_groups(period)
        report_filter_form.country.choices = countries
        report_filter_form.region.choices = regions

        countries_map = dict(countries)
        regions_map = dict(regions)
        period_query = Dataset.query.get(period)
        period_name = period_query.name if period_query else ''

        current_selection = self.get_current_selection(
            period_name, group,
            countries_map.get(country, country),
            regions_map.get(region, region)
        )

        context = self.get_context()
        context.update({
            'objects': self.objects,
            'current_selection': current_selection,
            'report_filter_form': report_filter_form,
            'region': region,
            'country': country,
            'show_report_headers': True,
            'dataset': period_query,
            'generate_map_url': generate_map_url,
        })

        return render_template(self.template_name, **context)
예제 #7
0
    def dispatch_request(self, period_param=None, group_param=None):
        period = period_param or request.args.get('period') or get_default_period()
        group = group_param or request.args.get('group')
        conclusion = request.args.get('conclusion') or DEFAULT_CONCLUSION
        assessor = request.args.get('assessor')
        extra = request.args.get('extra') or ''

        progress_filter_form = ProgressFilterForm(
            MultiDict(dict(period=period, group=group, conclusion=conclusion,
                           assessor=assessor, extra=extra))
        )
        progress_filter_form.group.choices = self.get_groups(period)
        progress_filter_form.conclusion.choices = self.get_conclusions()
        progress_filter_form.assessor.choices = (
            self.get_assessors(period, group)
        )

        period_query = Dataset.query.get(period)
        period_name = period_query.name if period_query else ''
        regions = (
            EtcDicBiogeoreg.query
            .with_entities(EtcDicBiogeoreg.reg_code)
            .filter_by(dataset_id=period)
            .order_by(EtcDicBiogeoreg.order)
        )

        current_selection = self.get_current_selection(
            period_name, group, conclusion)

        self.DECISION_DETAILS = self.get_decision_details()
        self.METHOD_DETAILS = self.get_method_details()

        presence = self.get_presence(period)
        data_dict = self.setup_objects_and_data(period, group, conclusion,
                                                assessor)
        comment_counts = self.get_comment_counts(period)
        ret_dict = {}
        for subject, region in data_dict.iteritems():
            ret_dict[subject] = {}
            for region, cell_options in region.iteritems():
                presence_info = presence.get(subject, {}).get(region, {})
                cell = self.process_cell(
                    subject, region, cell_options, conclusion, presence_info,
                    comment_counts,
                )
                ret_dict[subject][region] = cell

        context = self.get_context()
        context.update({
            'progress_filter_form': progress_filter_form,
            'current_selection': current_selection,
            'period_name': period_name,
            'group': group,
            'conclusion': conclusion,
            'subjects': self.subjects_by_group(period, group),
            'regions': regions.all(),
            'objects': ret_dict,
            'dataset': period_query,
            'summary_endpoint': self.summary_endpoint,
            'extra': extra,
        })

        return render_template(self.template_name, **context)
예제 #8
0
def species_config_xml():
    dataset_id = get_default_period()
    region = flask.request.args.get('region', '')
    species = flask.request.args.get('species', '')
    species_name = base64.urlsafe_b64decode(species.encode('ascii'))

    user = flask.g.get('user')
    roles = [r.name for r in user.roles] if user and user.id else []

    if region == '':
        rows = (models.db.session.query(
            models.EtcDataSpeciesRegion.region).distinct().filter_by(
                assesment_speciesname=species_name).filter(
                    models.EtcDataSpeciesRegion.dataset_id ==
                    dataset_id).order_by(models.EtcDataSpeciesRegion.region))
        region = '/%s/' % '|'.join(['^%s' % rec[0] for rec in rows])
    else:
        region = "/^%s/" % region

    results = (models.db.session.query(
        models.EtcDataSpeciesRegion.eu_country_code,
        models.EtcDataSpeciesRegion.code,
        models.EtcDataSpeciesRegion.conclusion_assessment,
        models.EtcDataSpeciesRegion.region).filter(
            models.EtcDataSpeciesRegion.region.in_(region[1:-1].replace(
                '^', '').split('|'))
        ).filter(models.EtcDataSpeciesRegion.dataset_id == dataset_id).filter(
            models.EtcDataSpeciesRegion.assesment_speciesname == species_name))

    assesment_speciesname = urllib.quote(species_name)

    countries_style = []
    countries = []
    species_code = ''

    def background_colour(value):
        colors = [
            '#70a800', '#e69800', '#e69800', '#e69800', '#d62b00', '#d62b00',
            '#d62b00', '#b4b4b4', '#FFFFFF'
        ]
        assessments = ['FV', 'U1', 'U1-', 'U1+', 'U2', 'U2-', 'U2+', 'XX', '']

        RGBS = dict(zip(assessments, [x for x in colors]))
        colour = RGBS.get(value, '')
        if colour:
            return colour[1:]
        else:
            return ''

    def get_coordinates(region="/MED/",
                        qstring="/FR|RO|IT/",
                        url="http://merlin.eea.europa.eu/cgi-bin/art17wsQ?%s"):
        """ open url and sort coordinates """
        params = urllib.urlencode({
            'mode': 'ITEMNQUERY',
            'LAYER': 'Europe_BIOGEO_MERGE30Jan',
            'qlayer': 'Europe_BIOGEO_MERGE30Jan',
            'qitem': 'Country',
            'rg': region,
            'qstring': qstring
        })
        f = urllib.urlopen(url % params)
        line = f.readline()
        minx, miny, maxx, maxy = line.split()
        for line in f.readlines():
            cur_minx, cur_miny, cur_maxx, cur_maxy = line.split()
            minx = min(minx, cur_minx)
            maxx = max(maxx, cur_maxx)
            miny = min(miny, cur_miny)
            maxy = max(maxy, cur_maxy)
        return [minx, miny, maxx, maxy]

    for res in results:
        if res.eu_country_code == 'UK':
            country = 'GB'
        else:
            if res.eu_country_code == 'EL':
                country = 'GR'
            else:
                country = res.eu_country_code
        species_code = res.code
        countries.append(country)
        countries_style.append('l=%s%s|%s' %
                               (country, res.region,
                                background_colour(res.conclusion_assessment)))

    qstring = "/%s/" % '|'.join(countries)
    #extent = get_coordinates(region, qstring)
    extent = [2635945.400202, 1385857.104555, 6084637.867846, 5307244.006638]

    rows = (models.db.session.query(
        models.t_restricted_species.c.eu_country_code, ).filter(
            models.t_restricted_species.c.assesment_speciesname == species_name
        ).filter(models.t_restricted_species.c.ext_dataset_id == dataset_id))
    restricted_species_list = [r[0] for r in rows]
    restricted = not ((species_name.lower() not in restricted_species_list)
                      or 'admin' in roles or 'nat' in roles)

    body = flask.render_template(
        'maps/config-species.xml',
        restricted=restricted,
        extent=','.join(str(v) for v in extent),
        assessment_speciesname=assesment_speciesname,
        countries_style=Markup('&'.join(escape(s) for s in countries_style)),
        region=region,
    )
    return flask.Response(body, content_type='text/xml')
예제 #9
0
def habitats_config_xml():
    dataset_id = get_default_period()

    def select_habitat_regions(habitatcode):
        """
        SELECT DISTINCT 
          etc_data_habitattype_regions.region
        FROM
          etc_data_habitattype_regions
        WHERE <dtml-sqltest name="habitatcode" column="etc_data_habitattype_regions.habitatcode" type=string>
        """
        return (models.db.session.query(
            models.EtcDataHabitattypeRegion.region, ).distinct().filter_by(
                dataset_id=dataset_id).filter_by(habitatcode=habitatcode))

    def getRegions(habitat):
        regions = [
            '^%s' % rec.region
            for rec in select_habitat_regions(habitatcode=habitat)
        ]
        return '|'.join(regions)

    def select_habitat_countries(region_list, habitatcode):
        """
        SELECT
          eu_country_code,
          code,
          conclusion_assessment,
          region
        FROM
          etc_data_habitattype_regions
        WHERE <dtml-sqltest region type="string" multiple="multiple">
        AND <dtml-sqltest habitatcode type=string>
        """
        return (models.db.session.query(
            models.EtcDataHabitattypeRegion.eu_country_code,
            models.EtcDataHabitattypeRegion.code,
            models.EtcDataHabitattypeRegion.conclusion_assessment,
            models.EtcDataHabitattypeRegion.region,
        ).filter(
            models.EtcDataHabitattypeRegion.region.in_(region_list)).filter_by(
                habitatcode=habitatcode).filter_by(dataset_id=dataset_id))

    def background_colour(value):
        colors = ('#9CB34D', '#D16E43', '#D16E43', '#D16E43', '#C22C15',
                  '#C22C15', '#C22C15', '#6F6C66', '#FFFFFF')
        assessments = ('FV', 'U1', 'U1-', 'U1+', 'U2', 'U2-', 'U2+', 'XX', '')

        RGBS = dict(zip(assessments, [x for x in colors]))
        colour = RGBS.get(value, '')
        if colour:
            return colour[1:]
        else:
            return ''

    region = flask.request.args.get('region', '')
    habitat = flask.request.args.get('habitat', '')
    if region == '':
        region = '/%s/' % getRegions(habitat)
    else:
        region = "/^%s/" % region
    results = select_habitat_countries(region_list=region[1:-1].replace(
        '^', '').split('|'),
                                       habitatcode=habitat)

    countries_style = []
    countries = []
    habitat_code = ''

    for res in results:
        if res.eu_country_code == 'UK':
            country = 'GB'
        else:
            if res.eu_country_code == 'EL':
                country = 'GR'
            else:
                country = res.eu_country_code
        habitat_code = res.code
        countries.append(country)
        countries_style.append('l=%s%s|%s' %
                               (country, res.region,
                                background_colour(res.conclusion_assessment)))

    qstring = "/%s/" % '|'.join(countries)
    #extent = get_coordinates(region, qstring)
    extent = [2635945.400202, 1385857.104555, 6084637.867846, 5307244.006638]

    body = flask.render_template(
        'maps/config-habitats.xml',
        extent=','.join(str(v) for v in extent),
        habitat_code=habitat_code,
        countries_style=Markup('&'.join(escape(s) for s in countries_style)),
        region=region,
    )
    return flask.Response(body, content_type='text/xml')
예제 #10
0
def species_config_xml():
    dataset_id = get_default_period()
    region = flask.request.args.get('region', '')
    species = flask.request.args.get('species', '')
    species_name = base64.urlsafe_b64decode(species.encode('ascii'))

    user = flask.g.get('user')
    roles = [r.name for r in user.roles] if user and user.id else []

    if region == '':
       rows = (
           models.db.session.query(
               models.EtcDataSpeciesRegion.region
           )
           .distinct()
           .filter_by(assesment_speciesname=species_name)
           .filter(models.EtcDataSpeciesRegion.dataset_id == dataset_id)
           .order_by(models.EtcDataSpeciesRegion.region)
       )
       region = '/%s/' % '|'.join(['^%s' % rec[0] for rec in rows])
    else:
       region = "/^%s/" % region

    results = (
        models.db.session.query(
            models.EtcDataSpeciesRegion.eu_country_code,
            models.EtcDataSpeciesRegion.code,
            models.EtcDataSpeciesRegion.conclusion_assessment,
            models.EtcDataSpeciesRegion.region
        )
        .filter(
            models.EtcDataSpeciesRegion.region.in_(
                region[1:-1].replace('^', '').split('|'))
        )
        .filter(models.EtcDataSpeciesRegion.dataset_id == dataset_id)
        .filter(models.EtcDataSpeciesRegion.assesment_speciesname
                == species_name)
    )


    assesment_speciesname=urllib.quote(species_name)

    countries_style = []
    countries = []
    species_code = ''

    def background_colour(value):
        colors = ['#70a800','#e69800','#e69800','#e69800','#d62b00',
                  '#d62b00','#d62b00','#b4b4b4','#FFFFFF']
        assessments = ['FV','U1','U1-','U1+','U2','U2-','U2+','XX','']

        RGBS = dict(zip(assessments, [x for x in colors]))
        colour = RGBS.get(value,'')
        if colour:
            return colour[1:]
        else:
            return ''

    def get_coordinates(region="/MED/", qstring="/FR|RO|IT/",
                        url="http://merlin.eea.europa.eu/cgi-bin/art17wsQ?%s"):
        """ open url and sort coordinates """
        params = urllib.urlencode({
            'mode':'ITEMNQUERY', 
            'LAYER': 'Europe_BIOGEO_MERGE30Jan', 
            'qlayer': 'Europe_BIOGEO_MERGE30Jan',
            'qitem': 'Country',
            'rg': region,
            'qstring': qstring})
        f = urllib.urlopen(url % params)
        line = f.readline()
        minx, miny, maxx, maxy = line.split()
        for line in f.readlines():
            cur_minx, cur_miny, cur_maxx, cur_maxy = line.split()
            minx = min(minx, cur_minx)
            maxx = max(maxx, cur_maxx)
            miny = min(miny, cur_miny)
            maxy = max(maxy, cur_maxy)
        return [minx, miny, maxx, maxy]

    for res in results:
        if res.eu_country_code == 'UK':
            country = 'GB'
        else: 
            if res.eu_country_code == 'EL':
               country = 'GR'
            else:
               country = res.eu_country_code
        species_code = res.code
        countries.append(country)
        countries_style.append('l=%s%s|%s' % (country, res.region, background_colour(res.conclusion_assessment)))

    qstring="/%s/" % '|'.join(countries)
    #extent = get_coordinates(region, qstring)
    extent = [2635945.400202,1385857.104555,6084637.867846,5307244.006638]

    rows = (
        models.db.session.query(
            models.t_restricted_species.c.eu_country_code,
        )
        .filter(models.t_restricted_species.c.assesment_speciesname
                == species_name)
        .filter(models.t_restricted_species.c.ext_dataset_id == dataset_id)
    )
    restricted_species_list = [r[0] for r in rows]
    restricted = not (
        (species_name.lower() not in restricted_species_list)
        or 'admin' in roles
        or 'nat' in roles
    )

    body = flask.render_template('maps/config-species.xml',
                                 restricted=restricted,
                                 extent=','.join(str(v) for v in extent),
                                 assessment_speciesname=assesment_speciesname,
                                 countries_style=Markup('&'.join(
                                     escape(s) for s in countries_style)),
                                 region=region,
                                 )
    return flask.Response(body, content_type='text/xml')
예제 #11
0
def habitats_config_xml():
    dataset_id = get_default_period()

    def select_habitat_regions(habitatcode):
        """
        SELECT DISTINCT 
          etc_data_habitattype_regions.region
        FROM
          etc_data_habitattype_regions
        WHERE <dtml-sqltest name="habitatcode" column="etc_data_habitattype_regions.habitatcode" type=string>
        """
        return (
            models.db.session.query(
                models.EtcDataHabitattypeRegion.region,
            )
            .distinct()
            .filter_by(dataset_id=dataset_id)
            .filter_by(habitatcode=habitatcode)
        )

    def getRegions(habitat):
        regions = ['^%s' % rec.region for rec in
                   select_habitat_regions(habitatcode=habitat)]
        return '|'.join(regions)

    def select_habitat_countries(region_list, habitatcode):
        """
        SELECT
          eu_country_code,
          code,
          conclusion_assessment,
          region
        FROM
          etc_data_habitattype_regions
        WHERE <dtml-sqltest region type="string" multiple="multiple">
        AND <dtml-sqltest habitatcode type=string>
        """
        return (
            models.db.session.query(
                models.EtcDataHabitattypeRegion.eu_country_code,
                models.EtcDataHabitattypeRegion.code,
                models.EtcDataHabitattypeRegion.conclusion_assessment,
                models.EtcDataHabitattypeRegion.region,
            )
            .filter(models.EtcDataHabitattypeRegion.region.in_(region_list))
            .filter_by(habitatcode=habitatcode)
            .filter_by(dataset_id=dataset_id)
        )

    def background_colour(value):
        colors = ('#9CB34D', '#D16E43', '#D16E43', '#D16E43', '#C22C15',
                  '#C22C15', '#C22C15', '#6F6C66', '#FFFFFF')
        assessments = ('FV', 'U1', 'U1-', 'U1+', 'U2', 'U2-', 'U2+', 'XX', '')

        RGBS = dict(zip(assessments, [x for x in colors]))
        colour = RGBS.get(value, '')
        if colour:
            return colour[1:]
        else:
            return ''

    region = flask.request.args.get('region', '')
    habitat = flask.request.args.get('habitat', '')
    if region == '':
        region = '/%s/' % getRegions(habitat)
    else:
        region = "/^%s/" % region
    results = select_habitat_countries(
        region_list=region[1:-1].replace('^', '').split('|'),
        habitatcode=habitat)

    countries_style = []
    countries = []
    habitat_code = ''

    for res in results:
        if res.eu_country_code == 'UK':
            country = 'GB'
        else: 
            if res.eu_country_code == 'EL':
                country = 'GR'
            else:
                country = res.eu_country_code
        habitat_code = res.code
        countries.append(country)
        countries_style.append('l=%s%s|%s' % (
            country,
            res.region,
            background_colour(res.conclusion_assessment)))

    qstring="/%s/" % '|'.join(countries)
    #extent = get_coordinates(region, qstring)
    extent = [2635945.400202,1385857.104555,6084637.867846,5307244.006638]

    body = flask.render_template('maps/config-habitats.xml',
                                 extent=','.join(str(v) for v in extent),
                                 habitat_code=habitat_code,
                                 countries_style=Markup('&'.join(
                                     escape(s) for s in countries_style)),
                                 region=region,
                                 )
    return flask.Response(body, content_type='text/xml')
예제 #12
0
    def dispatch_request(self):
        period = request.args.get('period') or get_default_period()
        subject = request.args.get('subject')
        group = request.args.get('group')
        region = request.args.get('region')
        action = request.args.get('action')
        rowid = request.args.get('rowid')
        fresh_new_record = False

        self.objects = []
        self.restricted_countries = []
        self.auto_objects = []
        self.manual_objects = []
        self.setup_objects_and_data(period, subject, region)
        group = group or self.get_group_for_subject(subject)

        regions = self.get_regions(period, subject)
        summary_filter_form = SummaryFilterForm(
            MultiDict(
                dict(period=period,
                     group=group,
                     subject=subject,
                     region=region)))
        summary_filter_form.group.choices = self.get_groups(period)
        summary_filter_form.subject.choices = self.get_subjects(period, group)
        summary_filter_form.region.choices = regions

        manual_form, manual_assessment = self.get_manual_form(
            request.form,
            period=period,
            action=action,
        )
        manual_form.region.choices = self.get_regions(period, subject, True)
        if period != '4':
            manual_form.region.choices = manual_form.region.choices[1:]
        if not request.form.get('region'):
            manual_form.region.process_data(region or manual_form.region.data)
        if hasattr(manual_form, 'MS'):
            manual_form.kwargs = dict(subject=subject, period=period)
            manual_form.MS.choices = self.get_user_MS(subject, region, period)

        if request.method == 'POST':
            home_url = url_for(self.summary_endpoint,
                               period=period,
                               subject=subject,
                               region=region)
            if manual_form.validate(subject=subject, period=period):
                if not can_touch(manual_assessment):
                    raise PermissionDenied()

                if not manual_assessment:
                    manual_assessment = self.model_manual_cls(subject=subject)
                    manual_form.populate_obj(manual_assessment)
                    manual_assessment.last_update = datetime.now().strftime(
                        DATE_FORMAT)
                    if EU_ASSESSMENT_MODE:
                        user = RegisteredUser.query.filter_by(
                            id='test_for_eu_assessment').first()
                        if not user:

                            user = RegisteredUser(
                                id='test_for_eu_assessment',
                                name='Test_for_eu_assessment',
                                account_date=datetime.now())
                            db.session.add(user)
                            db.session.commit()
                        manual_assessment.user_id = user.id

                    else:
                        manual_assessment.user_id = current_user.id
                    manual_assessment.dataset_id = period
                    db.session.flush()
                    db.session.add(manual_assessment)
                    try:
                        db.session.commit()
                    except IntegrityError:
                        db.session.rollback()
                        flash('A record with the same keys exist. Cannot add',
                              'error')
                    else:
                        flash('Conclusion added successfully')
                        fresh_new_record = manual_assessment
                    manual_assessment = None
                else:
                    manual_form.populate_obj(manual_assessment)
                    manual_assessment.last_update = datetime.now().strftime(
                        DATE_FORMAT)
                    db.session.add(manual_assessment)
                    db.session.commit()
                    flash('Conclusion edited successfully')
                    if rowid:
                        home_url += '#man-row-' + rowid
                    return redirect(home_url)
            else:
                flash('Please correct the errors below and try again.')

        self.dataset = Dataset.query.get(period)
        period_name = self.dataset.name if self.dataset else ''

        current_selection = self.get_current_selection(period_name, group,
                                                       subject, region, period)
        annexes = self.get_annexes(subject, period)
        default_ms = DEFAULT_MS if not nat_perm.can() else current_user.MS
        context = self.get_context()
        context.update({
            'objects':
            self.objects,
            'auto_objects':
            self.auto_objects,
            'manual_objects':
            self.filter_conclusions(self.manual_objects),
            'restricted_countries':
            self.restricted_countries,
            'regions':
            regions,
            'summary_filter_form':
            summary_filter_form,
            'manual_form':
            manual_form,
            'manual_assessment':
            manual_assessment,
            'edit_ref':
            must_edit_ref(manual_assessment),
            'current_selection':
            current_selection,
            'annexes':
            annexes,
            'group':
            group,
            'subject':
            subject,
            'region':
            region,
            'period_name':
            period_name,
            'dataset':
            self.dataset,
            'default_ms':
            default_ms,
            'fresh_new_record':
            fresh_new_record,
        })

        return render_template(self.template_name, **context)
예제 #13
0
    def dispatch_request(self):
        period = request.args.get('period') or get_default_period()
        subject = request.args.get('subject')
        group = request.args.get('group')
        region = request.args.get('region')
        action = request.args.get('action')
        rowid = request.args.get('rowid')
        fresh_new_record = False

        self.objects = []
        self.restricted_countries = []
        self.auto_objects = []
        self.manual_objects = []
        self.setup_objects_and_data(period, subject, region)
        group = group or self.get_group_for_subject(subject)

        regions = self.get_regions(period, subject)
        summary_filter_form = SummaryFilterForm(
            MultiDict(dict(period=period, group=group, subject=subject,
                           region=region)
                      )
        )
        summary_filter_form.group.choices = self.get_groups(period)
        summary_filter_form.subject.choices = self.get_subjects(period, group)
        summary_filter_form.region.choices = regions

        manual_form, manual_assessment = self.get_manual_form(
            request.form, period=period, action=action,
        )
        manual_form.region.choices = self.get_regions(period, subject, True)
        if period != '4':
            manual_form.region.choices = manual_form.region.choices[1:]
        if not request.form.get('region'):
            manual_form.region.process_data(region or manual_form.region.data)
        if hasattr(manual_form, 'MS'):
            manual_form.kwargs = dict(subject=subject, period=period)
            manual_form.MS.choices = self.get_user_MS(subject, region, period)

        if request.method == 'POST':
            home_url = url_for(self.summary_endpoint, period=period,
                               subject=subject, region=region)
            if manual_form.validate(subject=subject, period=period):
                if not can_touch(manual_assessment):
                    raise PermissionDenied()

                if not manual_assessment:
                    manual_assessment = self.model_manual_cls(subject=subject)
                    manual_form.populate_obj(manual_assessment)
                    manual_assessment.last_update = datetime.now().strftime(DATE_FORMAT)
                    if EU_ASSESSMENT_MODE:
                        user = RegisteredUser.query.filter_by(
                            id='test_for_eu_assessment').first()
                        if not user:

                            user = RegisteredUser(id='test_for_eu_assessment',
                                                  name='Test_for_eu_assessment',
                                                  account_date=datetime.now())
                            db.session.add(user)
                            db.session.commit()
                        manual_assessment.user_id = user.id

                    else:
                        manual_assessment.user_id = current_user.id
                    manual_assessment.dataset_id = period
                    db.session.flush()
                    db.session.add(manual_assessment)
                    try:
                        db.session.commit()
                    except IntegrityError:
                        db.session.rollback()
                        flash('A record with the same keys exist. Cannot add',
                              'error')
                    else:
                        flash('Conclusion added successfully')
                        fresh_new_record = manual_assessment
                    manual_assessment = None
                else:
                    manual_form.populate_obj(manual_assessment)
                    manual_assessment.last_update = datetime.now().strftime(DATE_FORMAT)
                    db.session.add(manual_assessment)
                    db.session.commit()
                    flash('Conclusion edited successfully')
                    if rowid:
                        home_url += '#man-row-' + rowid
                    return redirect(home_url)
            else:
                flash('Please correct the errors below and try again.')

        self.dataset = Dataset.query.get(period)
        period_name = self.dataset.name if self.dataset else ''

        current_selection = self.get_current_selection(
            period_name, group, subject, region, period)
        annexes = self.get_annexes(subject, period)
        default_ms = DEFAULT_MS if not nat_perm.can() else current_user.MS
        context = self.get_context()
        context.update({
            'objects': self.objects,
            'auto_objects': self.auto_objects,
            'manual_objects': self.filter_conclusions(self.manual_objects),
            'restricted_countries': self.restricted_countries,
            'regions': regions,
            'summary_filter_form': summary_filter_form,
            'manual_form': manual_form,
            'manual_assessment': manual_assessment,
            'edit_ref': must_edit_ref(manual_assessment),
            'current_selection': current_selection,
            'annexes': annexes,
            'group': group,
            'subject': subject,
            'region': region,
            'period_name': period_name,
            'dataset': self.dataset,
            'default_ms': default_ms,
            'fresh_new_record': fresh_new_record,
        })

        return render_template(self.template_name, **context)
예제 #14
0
    def dispatch_request(self, period_param=None, group_param=None):
        period = period_param or request.args.get('period') or get_default_period()
        group = group_param or request.args.get('group')
        conclusion = request.args.get('conclusion') or DEFAULT_CONCLUSION
        assessor = request.args.get('assessor')
        extra = request.args.get('extra') or ''

        progress_filter_form = ProgressFilterForm(
            MultiDict(dict(period=period, group=group, conclusion=conclusion,
                           assessor=assessor, extra=extra))
        )
        progress_filter_form.group.choices = self.get_groups(period)
        progress_filter_form.conclusion.choices = self.get_conclusions()
        progress_filter_form.assessor.choices = (
            self.get_assessors(period, group)
        )

        period_query = Dataset.query.get(period)
        period_name = period_query.name if period_query else ''
        regions = (
            EtcDicBiogeoreg.query
            .with_entities(EtcDicBiogeoreg.reg_code)
            .filter_by(dataset_id=period)
            .order_by(EtcDicBiogeoreg.order)
        )

        current_selection = self.get_current_selection(
            period_name, group, conclusion)

        self.DECISION_DETAILS = self.get_decision_details()
        self.METHOD_DETAILS = self.get_method_details()

        presence = self.get_presence(period)
        data_dict = self.setup_objects_and_data(period, group, conclusion,
                                                assessor)
        comment_counts = self.get_comment_counts(period)
        ret_dict = {}
        for subject, region in data_dict.iteritems():
            ret_dict[subject] = {}
            for region, cell_options in region.iteritems():
                presence_info = presence.get(subject, {}).get(region, {})
                cell = self.process_cell(
                    subject, region, cell_options, conclusion, presence_info,
                    comment_counts,
                )
                ret_dict[subject][region] = cell

        context = self.get_context()
        context.update({
            'progress_filter_form': progress_filter_form,
            'current_selection': current_selection,
            'period_name': period_name,
            'group': group,
            'conclusion': conclusion,
            'subjects': self.subjects_by_group(period, group),
            'regions': regions.all(),
            'objects': ret_dict,
            'dataset': period_query,
            'summary_endpoint': self.summary_endpoint,
            'extra': extra,
        })

        return render_template(self.template_name, **context)