Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 9b617e528be131db0d95db7373a578466e8f390c
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Mon Jan 28 09:10:17 2013 +0100
Update the API code
Now the API makes use of the form to validate the input when the request uses POST
for GET requests though, we need to check the argument given to the request.
---------------------------------------------------------------
coprs_frontend/coprs/views/api_ns/api_general.py | 129 ++++++++++++++-------
1 files changed, 86 insertions(+), 43 deletions(-)
diff --git a/coprs_frontend/coprs/views/api_ns/api_general.py
b/coprs_frontend/coprs/views/api_ns/api_general.py
index a6a6c94..b41ec07 100644
--- a/coprs_frontend/coprs/views/api_ns/api_general.py
+++ b/coprs_frontend/coprs/views/api_ns/api_general.py
@@ -1,9 +1,14 @@
+import datetime
+import random
+import string
import time
import flask
+from coprs import app
from coprs import db
from coprs import exceptions
+from coprs import forms
from coprs.views.misc import login_required
@@ -13,12 +18,24 @@ from coprs.logic import builds_logic
from coprs.logic import coprs_logic
+def generate_api_token(size=30):
+ """ Generate a random string used as token to access the API
+ remotely.
+
+ :kwarg: size, the size of the token to generate, defaults to 30
+ chars.
+ :return: a string, the API token for the user.
+
+ """
+ return ''.join(random.choice(string.ascii_lowercase) for x in range(size))
+
+
@api_ns.route('/')
def api_home():
""" Renders the home page of the api.
This page provides information on how to call/use the API.
"""
- return flask.render_template('coprs/api.html')
+ return flask.render_template('api.html')
@api_ns.route('/new/', methods = ["GET", "POST"])
@@ -33,16 +50,12 @@ def api_new_token():
db.session.add(user)
db.session.commit()
flask.g.user = user
- return flask.redirect(flask.url_for('misc.api'))
+ return flask.redirect(flask.url_for('api_ns.api_home'))
-(a)api_ns.route('/add/<name>/<chroots>/',
- defaults={'repos':"", 'initial_pkgs':""})
-(a)api_ns.route('/add/<name>/<chroots>/<repos>/',
- defaults={'initial_pkgs':None})
-@api_ns.route('/add/<name>/<chroots>/<repos>/<initial_pkgs>/')
+(a)api_ns.route('/copr/new/', methods=['POST'])
@login_required
-def api_add_copr(name, chroots, repos="", initial_pkgs=""):
+def api_new_copr():
""" Receive information from the user on how to create its new copr,
check their validity and create the corresponding copr.
@@ -54,43 +67,73 @@ def api_add_copr(name, chroots, repos="",
initial_pkgs=""):
build in this new copr
"""
- infos = []
- copr = coprs_logic.CoprsLogic.add_coprs(
- name=name.strip(),
- repos=" ".join([repo.strip() for repo in repos.split(',')]),
- owner=flask.g.user,
- selected_chroots=[chroot.strip()
- for chroot in chroots.split(',')]
- )
- infos.append('New copr was successfully created.')
-
- if initial_pkgs:
- builds_logic.BuildsLogic.add_build(
- pkgs=" ".join([pkg.strip() for pkg in
initial_pkgs.split(',')]),
- copr=copr,
- owner=flask.g.user)
- infos.append('Initial packages were successfully submitted '
- 'for building.')
- return '{"output" : "%s"}' %
("\n".join(infos))
-
-
-(a)api_ns.route('/list/<username>/', methods=['GET'])
-def api_list_copr(username):
+ form = forms.CoprFormFactory.create_form_cls()(csrf_enabled=False)
+ if form.validate_on_submit():
+ infos = []
+ try:
+ copr = coprs_logic.CoprsLogic.add(
+ name=form.name.data.strip(),
+ repos=" ".join([repo.strip()
+ for repo in form.repos.data.split(',')]),
+ user=flask.g.user,
+ selected_chroots=form.selected_chroots,
+ description=form.description.data,
+ instructions=form.instructions.data,
+ check_for_duplicates=True,
+ )
+ infos.append('New copr was successfully created.')
+
+ if form.initial_pkgs.data:
+ builds_logic.BuildsLogic.add_build(
+ pkgs=" ".join([pkg.strip()
+ for pkg in form.initial_pkgs.data.split(',')]),
+ copr=copr,
+ owner=flask.g.user)
+ infos.append('Initial packages were successfully submitted '
+ 'for building.')
+
+ output = '{"output" : "ok", "message" :
"%s"}' % ("\n".join(infos))
+ db.session.commit()
+ except exceptions.DuplicateCoprNameException, err:
+ output = '{"output": "notok", "error":
"%s"}' % err
+ db.session.rollback()
+
+ else:
+ errormsg = "\n".join(form.errors['name'])
+ errormsg = errormsg.replace('"', "'")
+ output = '{"output": "notok", "error":
"%s"}' % errormsg
+
+ return flask.Response(output, mimetype='application/json')
+
+
+(a)api_ns.route('/owned/')
+def api_list_copr():
""" Return the list of coprs owned by the given user.
:arg username: the username of the person one would like to the
coprs of.
+
"""
- query = coprs_logic.CoprsLogic.get_multiple(flask.g.user,
- user_relation = 'owned', username = username)
- output = '{"repos":[\n'
- repos = query.all()
- cnt = 0
- for repo in repos:
- output += '{"name" : "%s", "repos" :
"%s"}\n' % (
- repo.name, repo.repos)
- cnt = cnt + 1
- if cnt < len(repos):
- output += ','
- output += "]}\n"
- return output
+ if 'username' in flask.request.args:
+ username = flask.request.args['username']
+ query = coprs_logic.CoprsLogic.get_multiple(flask.g.user,
+ user_relation = 'owned', username = username)
+ repos = query.all()
+ output = '{"output": "ok",\n"repos":[\n'
+ cnt = 0
+ for repo in repos:
+ output += '{'\
+ '"name" : "%s", '\
+ '"repos" : "%s", '\
+ '"description": "%s", '\
+ '"instructions": "%s" '\
+ '}\n' % (repo.name, repo.repos, repo.description,
+ repo.instructions)
+ cnt = cnt + 1
+ if cnt < len(repos):
+ output += ','
+ output += "]}\n"
+ else:
+ output = '{"output": "notok", "error":
"Invalid request"}'
+
+ return flask.Response(output, mimetype='application/json')