Add a new endpoint to pull out the json for team user data

This commit is contained in:
Sayan Chowdhury 2016-08-03 15:43:32 +05:30
parent a3b5c89653
commit 0e033ce8e5
3 changed files with 60 additions and 11 deletions

View File

@ -3,7 +3,7 @@ during development of tahrir.
"""
import socket
hostname = socket.gethostname()
hostname = socket.gethostname().split('.')[0]
config = dict(
endpoints={

View File

@ -174,6 +174,7 @@ def main(global_config, **settings):
config.add_route('user_json', '/user/{id}/json')
config.add_route('user_rss', '/user/{id}/rss')
config.add_route('user_foaf', '/user/{id}/foaf')
config.add_route('user_team_json', '/user/{id}/team/{team_id}/json')
config.add_route('diff', '/diff/{id_a}/{id_b}')
config.add_route('report', '/report')
config.add_route('report_this_month', '/report/this/month')

View File

@ -1,12 +1,10 @@
import re
import random
import transaction
import types
import codecs
import os
import sqlalchemy as sa
import velruse
import json as _json
import StringIO
import qrcode as qrcode_module
import docutils.examples
@ -16,7 +14,6 @@ from datetime import datetime
from datetime import timedelta
from decimal import Decimal, ROUND_UP
from mako.template import Template as t
from webhelpers import feedgenerator
from pyramid.view import (
view_config,
@ -29,6 +26,7 @@ from pyramid.httpexceptions import (
HTTPGone,
HTTPNotFound,
HTTPForbidden,
HTTPMethodNotAllowed,
)
from pyramid.security import (
@ -41,17 +39,12 @@ from pyramid.settings import asbool
import tahrir_api.model as m
from tahrir.utils import strip_tags, generate_badge_yaml
from tahrir.utils import generate_badge_yaml
from tahrir_api.utils import convert_name_to_id
import widgets
import foafutils
from moksha.wsgi.widgets.api import get_moksha_socket, LiveWidget
from sqlalchemy.orm import joinedload
from sqlalchemy.sql.expression import func
def _get_user(request, id_or_nickname):
'''Attempt to get a user by their id or nickname, returning None if
@ -70,6 +63,15 @@ def _get_user(request, id_or_nickname):
return None
def _get_team(request, team_id):
'''Get team for the given team_id'''
team = request.db.get_team(team_id=team_id)
if team:
return team
return None
def _get_user_badge_info(request, user):
""" Returns a dictionary of the user badge information
"""
@ -706,7 +708,7 @@ def explore_badges(request):
newest_badges=newest_badges,
auth_principals=effective_principals(request),
awarded_assertions=awarded_assertions,
)
)
@view_config(route_name='explore_badges_rss')
@ -1153,6 +1155,34 @@ def _user_json_generator(request, user):
'assertions': assertions,
'percentile': user_info['percentile'],
'rank': user_info['rank'],
'user_count': user_info['user_count'],
}
def _user_team_json_generator(request, team, user):
""" Generate the json of team data """
team_id = team.id
badges = request.db.get_badges_from_team(team_id)
badges_count = len(badges)
series = request.db.get_series_from_team(team_id)
assertions = user.assertions
assertion_ids = set([assertion.badge_id for assertion in assertions])
for elem in series:
series_info = []
perks = elem.perk
for perk in perks:
series_info.append({
'perk': perk.__json__(),
'series': elem.__json__(),
'is_awarded': perk.badge_id in assertion_ids
})
return {
'badges_count': badges_count,
'series_info': series_info
}
@ -1254,6 +1284,24 @@ def diff(request):
)
@view_config(route_name='user_team_json', renderer='json')
def user_team_json(request):
""" Render user team info as JSON dump."""
user = _get_user(request, request.matchdict.get('id'))
team = _get_team(request, request.matchdict.get('team_id'))
if not user:
request.response.status = '404 Not Found'
return {'error': 'No such user exists.'}
if user.opt_out and user.email != authenticated_userid(request):
request.response.status = '404 Not Found'
return {"error": "User has opted out."}
return _user_team_json_generator(request, team, user)
@view_config(route_name='user_json', renderer='json')
def user_json(request):
"""Render user info JSON dump."""