def create_ical(): data = dict() data['voting'] = api_load_all('/issue', q={'issue_state': 'voting'}) tz = pytz.timezone('Europe/Berlin') cal = Calendar() cal.add('prodid', '-//Niels Lohmann//LiquidFeedback Viewer//DE') cal.add('version', '2.0') for issue in data['voting']['result']: start_time = iso8601.parse_date(issue['fully_frozen']).astimezone(pytz.timezone('Europe/Berlin')) end_time = iso8601.parse_date(future_date_filter(issue['fully_frozen'], issue['voting_time'])).astimezone(pytz.timezone('Europe/Berlin')) event = Event() event.add('summary', u'Abstimmung %s %d' % (policy_filter(issue['policy_id'], False, False), issue['id'])) event.add('description', u'Abstimmung über Thema %d im Themenbereich "%s" mit Regelwerk %s.' % (issue['id'], area_filter(issue['area_id'], False, False), policy_filter(issue['policy_id'], False, False) )) event.add('location', u'%s' % (area_filter(issue['area_id'], False, False))) event.add('url', '%s/issue/show/%d.html' % (app.config['LQFB_URL'], issue['id'])) event.add('dtstart', start_time) event.add('dtend', end_time) event.add('dtstamp', datetime.now(tz=tz)) event['uid'] = '%s/issue/show/%d.html' % (app.config['LQFB_URL'], issue['id']) event.add('priority', 5) cal.add_component(event) return cal.to_ical()
def issue_aggregated(issue_id, session=None): result = db_load('/issue', q={'issue_id': issue_id})['result'][0] # add prospected ends of the timestamps result['accepted_deadline'] = result['accepted'] if result['accepted'] != None else future_date_filter(result['created'], result['admission_time']) result['half_frozen_deadline'] = result['half_frozen'] if result['half_frozen'] != None else future_date_filter(result['accepted_deadline'], result['discussion_time']) result['fully_frozen_deadline'] = result['fully_frozen'] if result['fully_frozen'] != None else future_date_filter(result['half_frozen_deadline'], result['verification_time']) result['closed_deadline'] = result['closed'] if result['closed'] != None else future_date_filter(result['fully_frozen_deadline'], result['voting_time']) # calculate voter percentage result['voter_percentage'] = round(100.0 * float(result['voter_count']) / float(result['population']), 2) if result['voter_count'] != None else None # add the area result['area'] = db_load('/area', q={'area_id': result['area_id']})['result'][0] # add the unit result['unit'] = db_load('/unit', q={'unit_id': result['area']['unit_id']})['result'][0] # add the policy result['policy'] = db_load('/policy', q={'policy_id': result['policy_id']})['result'][0] result['policy']['issue_quorum_percentage'] = round(100.0 * float(result['policy']['issue_quorum_num']) / float(result['policy']['issue_quorum_den']), 2) if result['policy']['issue_quorum_num'] != 0 else 0 result['policy']['initiative_quorum_percentage'] = round(100.0 * float(result['policy']['initiative_quorum_num']) / float(result['policy']['initiative_quorum_den']), 2) if result['policy']['initiative_quorum_num'] != 0 else 0 # add absolute numbers for the quorums result['issue_quorum'] = int(ceil((float(result['policy']['issue_quorum_num']) / float(result['policy']['issue_quorum_den'])) * result['population'])) result['initiative_quorum'] = int(ceil((float(result['policy']['initiative_quorum_num']) / float(result['policy']['initiative_quorum_den'])) * result['population'])) # add bars bars = policy_bars(result['policy']) result['policy'] = dict(result['policy'].items() + bars.items()) # add all initiatives of the issue result['initiatives'] = db_load('/initiative', q={'issue_id': issue_id})['result'] for i in result['initiatives']: # store information on the supporters and the used quorum if result['state'] in ['admission', 'canceled_revoked_before_accepted', 'canceled_issue_not_accepted']: if result['issue_quorum'] > 0: i['supporter_percentage'] = round(100.0 * float(i['supporter_count']) / float(result['issue_quorum']), 2) i['supporter_missing'] = result['issue_quorum'] - i['supporter_count'] if i['supporter_percentage'] < 100 else 0 else: i['supporter_percentage'] = 100 i['supporter_missing'] = 0 i['quorum_type'] = 'issue' else: if result['initiative_quorum'] > 0: i['supporter_percentage'] = round(100.0 * float(i['supporter_count']) / float(result['initiative_quorum']), 2) i['supporter_missing'] = result['initiative_quorum'] - i['supporter_count'] if i['supporter_percentage'] < 100 else 0 else: i['supporter_percentage'] = 100 i['supporter_missing'] = 0 i['quorum_type'] = 'initiative' if i['negative_votes'] != None: i['absention_votes'] = result['voter_count'] - i['positive_votes'] - i['negative_votes'] # distribution of positive_votes/negative_votes votes = i['positive_votes'] + i['negative_votes'] if votes != 0: positive_votes_percentage = round(100.0 * float(i['positive_votes']) / float(votes), 2) negative_votes_pecentage = round(100.0 - positive_votes_percentage, 2) i['vote_distribution2'] = [positive_votes_percentage, negative_votes_pecentage] else: i['vote_distribution2'] = [0.0, 0.0] # distribution of all votes votes = result['voter_count'] positive_votes_percentage = round(100.0 * float(i['positive_votes']) / float(votes), 2) negative_votes_pecentage = round(100.0 * float(i['negative_votes']) / float(votes), 2) absention_votes_pecentage = round(100.0 - positive_votes_percentage - negative_votes_pecentage, 2) i['vote_distribution3'] = [positive_votes_percentage, absention_votes_pecentage, negative_votes_pecentage] # add interested members (needs a session) if 'session_key' in session: result['interest_snapshots'] = dict() result['interest_members'] = dict() result['interest_weights'] = dict() result['interest_delegates'] = dict() for snapshot in ['latest', 'end_of_admission', 'half_freeze', 'full_freeze']: result['interest_weights'][snapshot] = 0 result['interest_snapshots'][snapshot] = api_load('/interest', q={'issue_id': issue_id, 'snapshot': snapshot}, session=session)['result'] for p in result['interest_snapshots'][snapshot]: result['interest_weights'][snapshot] += p['weight'] result['interest_members'][snapshot] = len(result['interest_snapshots'][snapshot]) result['interest_delegates'][snapshot] = result['interest_weights'][snapshot] - result['interest_members'][snapshot] # add population of the issue if 'session_key' in session: result['population_snapshots'] = dict() result['population_members'] = dict() result['population_weights'] = dict() result['population_delegates'] = dict() for snapshot in ['latest', 'end_of_admission', 'half_freeze', 'full_freeze']: result['population_weights'][snapshot] = 0 result['population_snapshots'][snapshot] = api_load('/population', q={'issue_id': issue_id, 'snapshot': snapshot}, session=session)['result'] for p in result['population_snapshots'][snapshot]: result['population_weights'][snapshot] += p['weight'] result['population_members'][snapshot] = len(result['population_snapshots'][snapshot]) result['population_delegates'][snapshot] = result['population_weights'][snapshot] - result['population_members'][snapshot] # add progress progress = issue_progress(issue=result, policy=result['policy']) result = dict(result.items() + progress.items()) # add battle if result['status_quo_schulze_rank'] != None: result['battle'] = api_load_all('/battle', q={'issue_id': issue_id})['result'] result['battle_table'] = dict() for b in result['battle']: winner = b['winning_initiative_id'] if b['winning_initiative_id'] != None else 0 loser = b['losing_initiative_id'] if b['losing_initiative_id'] != None else 0 if not winner in result['battle_table']: result['battle_table'][winner] = dict() result['battle_table'][winner][loser] = b['count'] return result