From 368d79e5829f9ac470a9f1f7a57902830e3ecea9 Mon Sep 17 00:00:00 2001 From: Adabriand Furtado Date: Mon, 20 Jun 2016 12:03:16 -0300 Subject: [PATCH] Adicionado um mĂ©todo na API para recuperar as Ășltimas respostas de um projeto. --- pybossa/api/__init__.py | 13 ++++++++++++- pybossa/cache/projects.py | 33 +++++++++++++++++++++++++++++++++ pybossa/core.py | 2 ++ pybossa/default_settings.py | 1 + 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/pybossa/api/__init__.py b/pybossa/api/__init__.py index 29738fb..c594c9d 100644 --- a/pybossa/api/__init__.py +++ b/pybossa/api/__init__.py @@ -53,6 +53,7 @@ from result import ResultAPI from pybossa.core import project_repo, task_repo from pybossa.contributions_guard import ContributionsGuard from pybossa.cache import users as cached_users +from pybossa.cache import projects as cached_projects blueprint = Blueprint('api', __name__) @@ -188,8 +189,18 @@ def user_progress(project_id=None, short_name=None): @blueprint.route('/leaderboard') @crossdomain(origin='*', headers=cors_headers) @ratelimit(limit=ratelimits.get('LIMIT'), per=ratelimits.get('PER')) -def leaderboard(limit=None): +def leaderboard(): user_id = None if current_user.is_anonymous() else current_user.id limit = request.args.get('limit') data = cached_users.get_complete_leaderboard(n=limit, user_id=user_id) return Response(json.dumps(data), mimetype="application/json") + +@jsonpify +@blueprint.route('/project_last_answers') +@crossdomain(origin='*', headers=cors_headers) +@ratelimit(limit=ratelimits.get('LIMIT'), per=ratelimits.get('PER')) +def project_last_answers(): + user_id = None if current_user.is_anonymous() else current_user.id + project_id = request.args.get('project_id') + data = cached_projects.project_last_answers(project_id) + return Response(json.dumps(data), mimetype="application/json") diff --git a/pybossa/cache/projects.py b/pybossa/cache/projects.py index f2792ba..f5b7ba3 100644 --- a/pybossa/cache/projects.py +++ b/pybossa/cache/projects.py @@ -204,6 +204,39 @@ def last_activity(project_id): return None +def project_last_answers_data(project_id): + """Return last answers from a project.""" + sql = text(''' + WITH last_answers AS (SELECT task_id, MAX(finish_time) AS timestamp + FROM task_run WHERE project_id =:project_id GROUP BY task_id) + SELECT task_run.info AS taskrun_info, task.info AS task_info FROM task_run + JOIN last_answers ON task_run.task_id = last_answers.task_id AND finish_time = timestamp + JOIN task ON task_run.task_id = task.id''') + + results = session.execute(sql, dict(project_id=project_id)) + last_answers = [] + for row in results: + answer = dict( + taskrun_info=row.taskrun_info, + task_info=row.task_info) + last_answers.append(answer) + return last_answers + +@memoize(timeout=timeouts.get('PROJECT_LAST_ANSWERS_TIMEOUT')) +def project_last_answers(project_id): + projects = [] + if project_id is None: + projects = session.query(Project).all() + else: + projects.append(session.query(Project).get(project_id)) + results = [] + for project in projects: + last_answers = dict() + last_answers['project_name'] = project.short_name + last_answers['last_answers'] = project_last_answers_data(project.id) + result.append(last_answers) + return results + @memoize(timeout=timeouts.get('APP_TIMEOUT')) def average_contribution_time(project_id): sql = text('''SELECT diff --git a/pybossa/core.py b/pybossa/core.py index 6d449f6..ca7b758 100644 --- a/pybossa/core.py +++ b/pybossa/core.py @@ -567,6 +567,8 @@ def setup_cache_timeouts(app): timeouts['STATS_DRAFT_TIMEOUT'] = app.config['STATS_DRAFT_TIMEOUT'] timeouts['N_APPS_PER_CATEGORY_TIMEOUT'] = \ app.config['N_APPS_PER_CATEGORY_TIMEOUT'] + timeouts['PROJECT_LAST_ANSWERS_TIMEOUT'] = \ + app.config['PROJECT_LAST_ANSWERS_TIMEOUT'] # Categories timeouts['CATEGORY_TIMEOUT'] = app.config['CATEGORY_TIMEOUT'] # Users diff --git a/pybossa/default_settings.py b/pybossa/default_settings.py index b932dd3..deda8c1 100644 --- a/pybossa/default_settings.py +++ b/pybossa/default_settings.py @@ -75,6 +75,7 @@ STATS_APP_TIMEOUT = 12 * 60 * 60 STATS_DRAFT_TIMEOUT = 24 * 60 * 60 N_APPS_PER_CATEGORY_TIMEOUT = 60 * 60 BROWSE_TASKS_TIMEOUT = 3 * 60 * 60 +PROJECT_LAST_ANSWERS_TIMEOUT = 5 * 60 # Category cache CATEGORY_TIMEOUT = 24 * 60 * 60 # User cache -- libgit2 0.21.2