Пример #1
0
 def delete(self):
     """ Mark as deleted. """
     self.deleted_at = utcnow()
Пример #2
0
 def cancel(self):
     """ Mark as cancelled. """
     self.cancelled_at = utcnow()
Пример #3
0
 def publish(self):
     """Mark as published."""
     self.published_at = utcnow()
Пример #4
0
 def announce(self):
     """Mark as announced."""
     self.announced_at = utcnow()
Пример #5
0
 def person_needs_update(self, person):
     too_old = utcnow() - datetime.timedelta(
         minutes=self.MAX_PERSON_DATA_AGE)
     return (person.last_update_from_feide is None or
             person.last_update_from_feide < too_old)
Пример #6
0
def make_group_from_template(session, template_name, ou, principals=()):
    """Create election with elections from template."""
    current_app.logger.info('Make election group %s for %s', template_name, ou)
    election_templates = current_app.config.get('ELECTION_GROUP_TEMPLATES')

    template = election_templates[template_name]
    name = template['name']
    group_type = template['settings']['group_type']
    elections = template['settings']['elections']
    metadata = template['settings']['rule_set']

    now = utcnow()

    def candidate_type(e):
        return metadata['candidate_type']

    def common_candidate_type():
        return functools.reduce(lambda x, y: x if x == y else None,
                                map(candidate_type, elections))

    def default_start():
        return datetime.datetime.combine(
            now.date(),
            DEFAULT_START_TIME).replace(tzinfo=datetime.timezone.utc)

    def default_end():
        return datetime.datetime.combine(
            (now + DEFAULT_DURATION).date(),
            DEFAULT_END_TIME).replace(tzinfo=datetime.timezone.utc)

    def mandate_period_start(e):
        start = e['mandate_period'].get('start', '--01-01')

        if start.startswith('--'):
            # aniso8601 does not support extended year representation.
            # Let's try to fix that:
            start = str(now.year) + start[1:]

        date = aniso8601.parse_date(start)
        if date < now.date():
            date = date.replace(year=(now.year + 1))
        return date

    def mandate_period_end(e):
        start = mandate_period_start(e)
        length = e['mandate_period'].get('duration')
        if length is None:
            return None
        duration = aniso8601.parse_duration(length)
        return start + duration

    grp_name = {}
    for lang in name.keys():
        grp_name[lang] = name[lang].format(ou.name[lang])

    group = ElectionGroup(
        name=grp_name,
        template_name=template_name,
        description=None,  # Set this?
        type=group_type,
        meta=metadata,
        ou=ou)

    def make_candidate_list(name):
        cand_list = ElectionList(name=name)
        return cand_list

    def make_pollbook(kw):
        return Pollbook(**kw)

    def make_election(e):
        if group_type == 'single_election':
            name = group.name
        else:
            name = e['name']
        election = Election(
            name=name,
            sequence=e['sequence'],
            election_group=group,
            start=default_start(),
            end=default_end(),
            mandate_period_start=mandate_period_start(e),
            mandate_period_end=mandate_period_end(e),
            meta=metadata,
            active=group_type == 'single_election',
        )
        if candidate_type(e) == 'party_list':
            election.lists = []
        else:
            election.lists = [make_candidate_list(name)]
        election.pollbooks = list(map(make_pollbook, e['voter_groups']))
        return election

    group.elections = list(map(make_election, elections))
    session.add(group)
    session.flush()
    return group