From 8712d88eb579facb330631ef767bc7024baf3566 Mon Sep 17 00:00:00 2001 From: Josef Skladanka Date: Jan 22 2019 15:05:33 +0000 Subject: niceify --- diff --git a/oraculum/__init__.py b/oraculum/__init__.py index 50db58d..e582821 100644 --- a/oraculum/__init__.py +++ b/oraculum/__init__.py @@ -20,6 +20,7 @@ from flask import Flask #from flask_sqlalchemy import SQLAlchemy from flask_caching import Cache +from flask_cors import CORS import logging import os @@ -109,4 +110,7 @@ app.config['JSON_AS_ASCII'] = False #db = SQLAlchemy(app) # # register blueprints + +CORS(app) + from oraculum.controllers import main diff --git a/oraculum/controllers/api_v0.py b/oraculum/controllers/api_v0.py new file mode 100644 index 0000000..5a0326b --- /dev/null +++ b/oraculum/controllers/api_v0.py @@ -0,0 +1,101 @@ +# Copyright 2014, Red Hat, Inc +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Authors: +# Josef Skladanka + +from oraculum import app, cache +from oraculum import data_providers +from oraculum.data_providers import PROVIDERS +from oraculum.utils import distgit, bz, fedocal, schedule, blockerbugs, meetbot, ACTION_TIMES_SPREAD + +from flask import request, url_for, jsonify, Blueprint +from werkzeug.contrib.cache import SimpleCache + +import urllib +import itertools +import importlib + +# FIXME: Move this into a proper config file +CACHE_TIMEOUT = 50 + + +@app.route('/api/v0/user/') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_user(fas_login): + distgit_info = distgit.get_user(fas_login) + bz_bugs = bz.get_user_bugs(fas_login) + bz_bugs = [{'summary': b.summary, 'status': b.status, 'id': b.id} for b in bz_bugs] + packages = [r['name'] for r in distgit_info.get('repos', [])] # FIXME add forksendpoints + resp = { + 'user': fas_login, + 'packages': packages, + 'bugs': bz_bugs, + } + + return jsonify(resp) + +## +@app.route('/api/v0/meetings') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_meetings(): + mtgs = fedocal.get_qa_meetings() + resp = { + 'meetings': mtgs, + } + return jsonify(resp) +## +@app.route('/api/v0/last_qa_meeting') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_last_qa_meeting(): + resp = meetbot.get_last_qa_meeting() + + return jsonify(resp) + + +### +@app.route('/api/v0/schedule') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_schedule_bikeshed(): + sched = schedule.get_schedule() + resp = { + 'schedule': sched, + } + return jsonify(resp) + +## +@app.route('/api/v0/blockerbugs') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_blockerbugs(): + blockers = blockerbugs.get_blockerbugs() + release = schedule.current_devel() + resp = { + 'release': release, + 'blockerbugs': blockers, + } + return jsonify(resp) + +@app.route('/api/v0/release') +@cache.cached(timeout=CACHE_TIMEOUT) +def api_v0_release(): + stable = schedule.current_stable() + devel = schedule.current_devel() + resp = { + 'stable': stable, + 'devel': devel, + } + return jsonify(resp) + diff --git a/oraculum/controllers/main.py b/oraculum/controllers/main.py index 69e7db9..98f23f6 100644 --- a/oraculum/controllers/main.py +++ b/oraculum/controllers/main.py @@ -18,194 +18,84 @@ # Josef Skladanka from oraculum import app, cache -from oraculum import data_providers from oraculum.data_providers import PROVIDERS -from oraculum.utils import distgit, bz, fedocal, schedule, blockerbugs, meetbot, ACTION_TIMES_SPREAD +from oraculum.utils import fedocal, schedule, blockerbugs, meetbot -from flask import request, url_for, jsonify, Blueprint -from flask_cors import CORS +from flask import request, url_for, jsonify from werkzeug.contrib.cache import SimpleCache import urllib import itertools -import importlib -CORS(app) # FIXME: Move this into a proper config file CACHE_TIMEOUT = 50 - -@app.route('/api/v0/user/') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_user(fas_login): - distgit_info = distgit.get_user(fas_login) - bz_bugs = bz.get_user_bugs(fas_login) - bz_bugs = [{'summary': b.summary, 'status': b.status, 'id': b.id} for b in bz_bugs] - packages = [r['name'] for r in distgit_info.get('repos', [])] # FIXME add forksendpoints - resp = { - 'user': fas_login, - 'packages': packages, - 'bugs': bz_bugs, - } - - return jsonify(resp) - - -@app.route('/api/v0/meetings') +@app.route('/api/v0/landing_page') @cache.cached(timeout=CACHE_TIMEOUT) def api_v0_meetings(): mtgs = fedocal.get_qa_meetings() - resp = { - 'meetings': mtgs, - } - return jsonify(resp) - -@app.route('/api/v0/last_qa_meeting') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_last_qa_meeting(): - resp = meetbot.get_last_qa_meeting() - - return jsonify(resp) - - -@app.route('/api/v0/schedule') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_schedule_bikeshed(): + last_qa_meeting = meetbot.get_last_qa_meeting() sched = schedule.get_schedule() - resp = { - 'schedule': sched, - } - return jsonify(resp) - -@app.route('/api/v0/blockerbugs') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_blockerbugs(): blockers = blockerbugs.get_blockerbugs() - release = schedule.current_devel() - resp = { - 'release': release, - 'blockerbugs': blockers, - } - return jsonify(resp) - -@app.route('/api/v0/release') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_release(): stable = schedule.current_stable() devel = schedule.current_devel() + resp = { + 'meetings': mtgs, + 'last_qa_meeting': last_qa_meeting, + 'schedule': sched, + 'blockerbugs': blockers, 'stable': stable, 'devel': devel, - } + } return jsonify(resp) - -@app.route('/api/v0/yumrepoinfo') -@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_yumrepoinfo(): - return jsonify({'status': 'WIP'}) - CACHE = SimpleCache() -@app.route('/api/v0/actions') -def api_v0_actions_filter(): - return jsonify(api_v0_actions_filter_backend(request)) - -def api_v0_actions_filter_backend(request): - - # FIXME: cache different providers differently - all_data = CACHE.get('all_actions') - if all_data is None: - all_data = [] - for p in PROVIDERS: - all_data.extend(p.get_actions()) - CACHE.set('all_actions', all_data, timeout=3600) - - - primary = request.args.get('primary') - tags = request.args.get('tags') - duration = int(request.args.get('duration', 0)) - - if primary: - primary = set(primary.split(',')) - all_data = [d for d in all_data if primary.intersection(d['tags']) == primary] +def get_actions(provider=None, tags=None): + actions = CACHE.get('api_v1_actions') + TIMEOUT = 3600 + if actions is None: + actions = [] + for p_name, p_module in PROVIDERS.items(): + actions.extend(p_module.get_actions()) + CACHE.set('api_v1_actions', actions, timeout=TIMEOUT) + if provider: + actions = [a for a in actions if a['provider'] == provider] if tags: tags = set(tags.split(',')) - all_data = [d for d in all_data if tags.intersection(d['tags'])] - - if duration: - t_min, t_max = ACTION_TIMES_SPREAD.get(duration, (0, 1024)) - all_data = [d for d in all_data if t_min < d['duration'] <= t_max] + actions = [a for a in actions if tags.intersection(a['tags'])] + return actions - resp = { - 'data': list(all_data) - } - return resp - -@app.route('/api/v0/actions/filtered_tags') -def api_v0_actions_filtered_tags(): - filtered_data = api_v0_actions_filter_backend(request)['data'] - - resp = { - 'tags': list(set(itertools.chain(*[d['tags'] for d in filtered_data]))), - 'duration': list(set([d['duration'] for d in filtered_data])), - } - - return jsonify(resp) - - - -""" -API v1 -""" @app.route('/api/v1/actions') def api_v1_actons(): provider = request.args.get('provider') tags = request.args.get('tags') - resp = {} - # FIXME proper handle missing provider or tags - if provider and tags: - # FIXME: cache different providers differently - actions = CACHE.get(provider) - if actions is None: - actions = PROVIDERS[provider].get_actions() - CACHE.set(provider, actions, timeout=3600) - - tags = set(tags.split(',')) - resp['actions'] = list([a for a in actions if tags.intersection(a['tags'])]) - + resp = {'actions': get_actions(provider, tags)} return jsonify(resp) + @app.route('/api/v1/actions/providers') def api_v1_actions_providers(): - resp = { - 'providers': [p.info() for p in PROVIDERS.values()] - } - + resp = {'providers': [p.info() for p in PROVIDERS.values()]} return jsonify(resp) + @app.route('/api/v1/actions/tags') def api_v1_actions_tags(): provider = request.args.get('provider') + actions = get_actions(provider) - resp = { - 'tags': [] - } - if provider: - actions = CACHE.get(provider) - if actions is None: - actions = PROVIDERS[provider].get_actions() - CACHE.set(provider, actions, timeout=3600) - + resp = {'tags': []} + if actions: resp['tags'] = list(set(itertools.chain(*[a['tags'] for a in actions]))) return jsonify(resp) - @app.route('/') @app.route('/index') def index(): diff --git a/oraculum/data_providers/fedora_easy_karma.py b/oraculum/data_providers/fedora_easy_karma.py index 75d1343..52bbad4 100644 --- a/oraculum/data_providers/fedora_easy_karma.py +++ b/oraculum/data_providers/fedora_easy_karma.py @@ -27,10 +27,10 @@ def info(): } def get_actions(): # FIXME - store/load the projects data for realz actions = [Action( - name="fppbar", + name="dummy action", duration=ACTION_TIMES['few hours'], provider="fedora_easy_karma", - tags=['foo', 'bar', 'C'], + tags=[], extra_data={}, )]