Exemplo n.º 1
0
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
Exemplo n.º 2
0
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')
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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&nbsp;" + 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&nbsp;%d' % member_id

    if result == None:
        result = 'Mitglied&nbsp;%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>&nbsp;' + result

    return result
Exemplo n.º 5
0
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>'
Exemplo n.º 6
0
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
Exemplo n.º 7
0
def member2_filter(member_id):
    # get name
    if not 'current_access_level' in session or session['current_access_level'] != 'member':
        return "Mitglied&nbsp;" + 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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
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')
Exemplo n.º 12
0
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)