+ # ACTION: query users' choices joined with users' identity if not anonymous
+ user_choices = query_db('select user_choice.id_user as userid, users.name as username, \
+ choices.id as choiceid, choices.name as choice_name, \
+ user_choice.weight as weight, user_vote.comment as comment \
+ from choices \
+ join user_choice on choices.id = user_choice.id_choice \
+ left join users on userid = users.id \
+ left join user_vote on userid = user_vote.id_user and choices.id_vote = user_vote.id_vote \
+ where choices.id_vote = ? \
+ order by user_vote.date,choices.id', [idvote])
+ # ACTION: aggregate user choices per vote
+ vote['blank'] = 0
+ results = OrderedDict()
+ for c in choices:
+ choice_values = [(w, { 'nb':0
+ , 'idx':i
+ , 'name':weights[w]['name']
+ , 'class':weights[w]['class'] }
+ ) for (i,w) in enumerate(weights, start=0)]
+ choice_values = OrderedDict(choice_values)
+ results[c['id']] = { 'id':c['id']
+ , 'name':c['name']
+ , 'sum':0
+ , 'average':0.0
+ , 'nb':0
+ , 'blank':0
+ , 'values_':choice_values }
+ for uc in user_choices:
+ results[uc['choiceid']]['nb'] += 1
+ results[uc['choiceid']]['values_'][uc['weight']]['nb'] += 1
+ if uc['weight'] is None:
+ results[uc['choiceid']]['blank'] += 1
+ vote['blank'] += 1
+ else:
+ results[uc['choiceid']]['sum'] += uc['weight']
+ for c in results:
+ if results[c]['nb'] - results[c]['blank'] != 0:
+ results[c]['average'] = results[c]['average'] + (float(results[c]['sum']) / float(results[c]['nb'] - results[c]['blank']))
+ previous_percent = 0
+ for w in weights:
+ if results[c]['nb'] > 0:
+ percent = float(results[c]['values_'][w]['nb'] * 100) / results[c]['nb']
+ else:
+ percent = 0.
+ results[c]['values_'][w]['percent'] = percent
+ results[c]['values_'][w]['previous_percent'] = previous_percent
+ previous_percent += percent
+ results[c]['values_'] = results[c]['values_'].values()
+ results = sorted(results.values(), key=lambda c: c['average'], reverse=True)
+ len_results = len(results)
+ if len_results % 2 == 0:
+ medians = results[len_results/2-1:len_results/2+1]
+ else:
+ medians = [results[len_results/2]]
+ results = { 'list':results
+ , 'medians':[m['id'] for m in medians]
+ , 'average':sum([r['sum'] for r in results])/len_results }
+ # ACTION: list user results per user
+ users = OrderedDict()
+ if vote['is_anonymous']:
+ user_votes = query_db('select users.name, id_user as userid, comment \
+ from user_vote \
+ join users on users.id = id_user where id_vote = ?', [idvote])
+ for uc in user_votes:
+ users[uc['userid']] = { 'username':uc['name']
+ , 'comment':uc['comment']
+ , 'choices':{}
+ , 'userid':uc['userid'] }
+ else:
+ for uc in user_choices:
+ weight = uc['weight']
+ value = { 'weight':weight
+ , 'name':weights[weight]['name']
+ , 'class':weights[weight]['class'] }
+ if uc['userid'] in users:
+ users[uc['userid']]['choices'][uc['choiceid']] = value
+ else:
+ users[uc['userid']] = { 'userid':uc['userid']
+ , 'username':uc['username']
+ , 'comment':uc['comment']
+ , 'choices':{uc['choiceid']:value} }
+ attachments = query_db('select * from attachments where id_vote=?', [idvote])
+ if query_db('select * from user_group where id_group = ? and id_user = ?'
+ , [vote['id_group'], get_userid()], one=True) and not vote['is_terminated']: