def get_delegation_diff(session): # get current delegations current_delegation = api_load('/delegation', session=session) current_delegation = current_delegation['result'] # get past delegations u = models.KeyValue.query.get('delegation') # update database if u == None: # bootstrapping: if database is empty, store current delegations and return u = models.KeyValue(key='delegation', value=json.dumps(current_delegation)) db.session.add(u) db.session.commit() return {}, {} else: past_delegation = json.loads(u.value) u.value=json.dumps(current_delegation) db.session.commit() # collect differences added_delegations = dict() removed_delegations = dict() for x in current_delegation: if not x in past_delegation: added_delegations[x['id']] = x for x in past_delegation: if not x in current_delegation: removed_delegations[x['id']] = x return added_delegations, removed_delegations
def show_index(): data = api_load('/info', session=session) if session == None or not 'current_access_level' in session: flash('Deine neue Zugangsberechtigung ist: <i class="' + helper['enums']['access'][data['current_access_level']]['icon'] + '"></i> ' + helper['enums']['access'][data['current_access_level']]['name'] + '.', 'info') session['current_access_level'] = data['current_access_level'] return render_template('index.html', data=data, helper=helper, ourl='index/index.html')
def show_unit(unit_id): data = dict() data['unit'] = db_load('/unit', q={'unit_id': unit_id}) data['privilege'] = api_load('/privilege', q={'unit_id': unit_id}, session=session) return render_template('unit.html', data=data, helper=helper, ourl='unit/show/%d.html' % unit_id)
def member_filter(member_id, link=False, icon=True): # get name if not 'current_access_level' in session or session['current_access_level'] != 'member': result = "Mitglied " + str(member_id) # it does not make sense to link without member access level link = False else: data = api_load('/member', q={'member_id': member_id}, session=session) if data['result'][0]['name'] != "": result = data['result'][0]['name'] else: result = 'Mitglied %d' % member_id if result == None: result = 'Mitglied %d' % member_id # add link if link: result = '<a href="/mitglieder/' + str(member_id) + '">' + result + '</a>' # add icon if icon: result = '<i class="icon-user"></i> ' + result return result
def avatar_filter(member_id): if not 'current_access_level' in session or session['current_access_level'] != 'member': return '<i class="icon-user"></i>' data = api_load('/member_image', q={'member_id': member_id, 'type': 'avatar'}, session=session) if data['result'] != []: return '<img class="img-rounded avatarpic" src="data:' + data['result'][0]['content_type'] + ';base64,' + data['result'][0]['data'] + '"/>' else: return '<i class="icon-user"></i>'
def initiative_aggregated(initiative_id, session=None): result = db_load('/initiative', q={'initiative_id': initiative_id})['result'][0] # add drafts result['draft'] = db_load('/draft', q={'initiative_id': initiative_id})['result'] # add suggestions result['suggestion'] = api_load('/suggestion', q={'initiative_id': initiative_id}, session=session)['result'] # add initiator if 'session_key' in session: result['initiator'] = api_load('/initiator', q={'initiative_id': initiative_id}, session=session)['result'] # add supporters if 'session_key' in session: result['supporter_snapshots'] = dict() result['supporter_members'] = dict() result['supporter_weights'] = dict() result['supporter_delegates'] = dict() for snapshot in ['latest', 'end_of_admission', 'half_freeze', 'full_freeze']: result['supporter_weights'][snapshot] = 0 result['supporter_snapshots'][snapshot] = api_load('/supporter', q={'initiative_id': initiative_id, 'snapshot': snapshot}, session=session)['result'] for p in result['supporter_snapshots'][snapshot]: result['supporter_weights'][snapshot] += p['weight'] result['supporter_members'][snapshot] = len(result['supporter_snapshots'][snapshot]) result['supporter_delegates'][snapshot] = result['supporter_weights'][snapshot] - result['supporter_members'][snapshot] # add opinion if 'session_key' in session: result['opinion'] = api_load('/opinion', q={'initiative_id': initiative_id}, session=session)['result'] # add voter if 'session_key' in session: result['voter'] = api_load('/voter', q={'issue_id': result['issue_id'], 'rendered_content': 'html'}, session=session)['result'] # add vote if 'session_key' in session: result['vote'] = api_load('/vote', q={'initiative_id': initiative_id}, session=session)['result'] # add issue result['issue'] = db_load('/issue', q={'issue_id': result['issue_id']})['result'][0] # add the policy result['policy'] = db_load('/policy', q={'policy_id': result['issue']['policy_id']})['result'][0] # add battle if result['issue']['status_quo_schulze_rank'] != None: result['battle'] = api_load_all('/battle', q={'initiative_id': initiative_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
def member2_filter(member_id): # get name if not 'current_access_level' in session or session['current_access_level'] != 'member': return "Mitglied " + str(member_id) result = '<div class="member_box">' result += '<a href="%s">' % url_for("show_member", member_id=member_id,) data = api_load('/member_image', q={'member_id': member_id, 'type': 'avatar'}, session=session) if data['result'] != []: result += '<img class="pull-left img-rounded" src="data:' + data['result'][0]['content_type'] + ';base64,' + data['result'][0]['data'] + '"/>' else: result += '<img class="pull-left img-rounded" src="/static/images/placeholder.jpg" />' data = api_load('/member', q={'member_id': member_id}, session=session)['result'][0] result += '<span">' if data['realname'] != None and data['realname'] != '': result += data['realname'] else: result += data['name'] result += '</a>' result += '<br>' if data['email'] != None: result += ' <a href="mailto:%s"><i class="icon-envelope"></i></a>' % data['email'] if data['website'] != None: result += ' <a href="http://%s"><i class="icon-home"></i></a>' % data['website'] result += "</span></div>" return result
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
def show_settings(): # store the key if request.method == 'POST' and 'submit_key' in request.form: session.permanent = True session['api_key'] = request.form['api_key'] # check the key url = app.config['LQFB_API'] + '/session' data = {'key': session['api_key']} rq = json.load(urllib2.urlopen(url, urllib.urlencode(data))) if rq['status'] == 'ok': flash(u"Dein API-Schlüssel wurde akzeptiert und verschlüsselt im Cookie gespeichert.", "success") session['session_key'] = rq['session_key'] elif rq['status'] == 'forbidden': flash(u"Dein API-Schlüssel wurde nicht akzeptiert.", "error") if 'session_key' in session: session.pop('session_key') else: flash(u"Es gab ein Problem mit deinem API-Schlüssel: " + rq['error'], "error") if 'session_key' in session: session.pop('session_key') # get access level data = api_load('/info', session=session, forceLoad=True) session['current_access_level'] = data['current_access_level'] flash('Deine neue Zugangsberechtigung ist: <i class="' + helper['enums']['access'][data['current_access_level']]['icon'] + '"></i> ' + helper['enums']['access'][data['current_access_level']]['name'] + '.', 'info') # get my member id if 'current_member_id' in data: session['current_member_id'] = data['current_member_id'] # take care of the email address u = models.Member.query.get(session['current_member_id']) if u != None: session['email'] = u.email else: if 'current_member_id' in session: session.pop('current_member_id') # delete the key if request.method == 'POST' and 'delete_key' in request.form: session.clear() flash(u"Der API-Schlüssel wurde aus dem Cookie gelöscht.", "success") # get access level data = api_load('/info', session=session, forceLoad=True) session['current_access_level'] = data['current_access_level'] flash('Deine neue Zugangsberechtigung ist: <i class="' + helper['enums']['access'][data['current_access_level']]['icon'] + '"></i> ' + helper['enums']['access'][data['current_access_level']]['name'] + '.', 'info') # store the email (and the API key) if request.method == 'POST' and 'submit_email' in request.form: if 'current_access_level' not in session or session['current_access_level'] != 'member': abort(403) session['email'] = request.form['email'] u = models.Member.query.get(session['current_member_id']) if u == None: u = models.Member(member_id=session['current_member_id'], email=request.form['email'], api_key=session['api_key'], active=True) db.session.add(u) flash('E-Mail-Adresse gespeichert.', 'info') else: u.email = request.form['email'] flash('E-Mail-Adresse aktualisert.', 'info') db.session.commit() send_email('[LQFB] E-Mail-Benachrichtigung', app.config['ADMINS'][0], [session['email']], render_template('welcome_email.txt'), render_template('welcome_email.html')) if request.method == 'POST' and 'delete_email' in request.form: if 'current_access_level' not in session or session['current_access_level'] != 'member': abort(403) if 'email' in session: session.pop('email') u = models.Member.query.get(session['current_member_id']) if u != None: db.session.delete(u) db.session.commit() flash(u'E-Mail-Adresse gelöscht.', 'info') # now display the page return render_template('settings.html', helper=helper, session=session)
def show_member(member_id): if 'current_access_level' not in session or session['current_access_level'] != 'member': abort(403) data = dict() data['event'] = db_load('/event') data['privilege'] = api_load('/privilege', q={'member_id': member_id}, session=session) data['membership'] = api_load('/membership', q={'member_id': member_id}, session=session) data['initiator'] = api_load('/initiator', q={'member_id': member_id}, session=session) data['delegation_in'] = api_load('/delegation', q={'member_id': member_id, 'direction': 'in'}, session=session) data['delegation_out'] = api_load('/delegation', q={'member_id': member_id, 'direction': 'out'}, session=session) data['delegating_voter'] = api_load('/delegating_voter', q={'member_id': member_id}, session=session) data['voter'] = api_load('/voter', q={'member_id': member_id, 'formatting_engine': 'html'}, session=session) data['vote'] = api_load('/vote', q={'member_id': member_id}, session=session) data['interest'] = api_load('/interest', q={'member_id': member_id, 'snapshot': 'latest'}, session=session) data['member'] = api_load('/member', q={'member_id': member_id, 'render_statement': 'html'}, session=session) data['member_image'] = api_load('/member_image', q={'member_id': member_id}, session=session) data['member_history'] = api_load('/member_history', q={'member_id': member_id}, session=session) return render_template('member.html', data=data, helper=helper, ourl='member/show/%d.html' % member_id)
def show_members(): data = dict() data['member'] = api_load('/member', session=session) return render_template('members.html', data=data, helper=helper, ourl='index/index.html?tab=members')
def show_area(area_id): data = dict() data['area'] = db_load('/area', q={'area_id': area_id}) data['allowed_policy'] = api_load('/allowed_policy', q={'area_id': area_id}) return render_template('area.html', data=data, helper=helper, ourl='area/show/%d.html' % area_id)