[PATCH 1/5] Create the API namespace
Pierre-Yves Chibon
pingou at pingoured.fr
Sun Jan 27 13:11:25 UTC 2013
This is the namespace that we will use to describe and expose the copr API.
This commit introduce it, move some code from misc to the api_general and
start with two API functions to list someone's copr and add a new one.
These two functions are documented in the /api/ (ie in the api.html template).
---
coprs_frontend/coprs/__init__.py | 3 +
coprs_frontend/coprs/templates/api.html | 42 +++++++++++
coprs_frontend/coprs/views/api_ns/__init__.py | 3 +
coprs_frontend/coprs/views/api_ns/api_general.py | 96 ++++++++++++++++++++++++
coprs_frontend/coprs/views/misc.py | 19 -----
5 files changed, 144 insertions(+), 19 deletions(-)
create mode 100644 coprs_frontend/coprs/views/api_ns/__init__.py
create mode 100644 coprs_frontend/coprs/views/api_ns/api_general.py
diff --git a/coprs_frontend/coprs/__init__.py b/coprs_frontend/coprs/__init__.py
index d5d732a..f239b65 100644
--- a/coprs_frontend/coprs/__init__.py
+++ b/coprs_frontend/coprs/__init__.py
@@ -22,6 +22,8 @@ import coprs.filters
import coprs.log
import coprs.models
+from coprs.views import api_ns
+from coprs.views.api_ns import api_general
from coprs.views import coprs_ns
from coprs.views.coprs_ns import coprs_builds
from coprs.views.coprs_ns import coprs_general
@@ -29,6 +31,7 @@ from coprs.views import backend_ns
from coprs.views.backend_ns import backend_general
from coprs.views import misc
+app.register_blueprint(api_ns.api_ns)
app.register_blueprint(coprs_ns.coprs_ns)
app.register_blueprint(misc.misc)
app.register_blueprint(backend_ns.backend_ns)
diff --git a/coprs_frontend/coprs/templates/api.html b/coprs_frontend/coprs/templates/api.html
index fb20f0d..2800fd3 100644
--- a/coprs_frontend/coprs/templates/api.html
+++ b/coprs_frontend/coprs/templates/api.html
@@ -33,6 +33,48 @@
<h3>The API</h3>
+ <h4>List someone's copr</h4>
+
+ <p>To list the coprs owned by someone one argument is required:</p>
+ <table>
+ <tr>
+ <th>name</th> <td>The name of the user you would to list the
+ copr of.</td>
+ </tr>
+ </table>
+ <p>URL will therefore look like:</p>
+ <pre style="font-size:120%">
+ /list/<username>/
+ </pre>
+
+ <h4>Add a new copr</h4>
+
+ <p><span style="font-style:italic">Login required</span></p>
+
+ <p>To add a new copr some informations are required:</p>
+ <table>
+ <tr>
+ <th>name</th> <td>The name of the copr to create.</td>
+ </tr><tr>
+ <th>chroots</th> <td>A comma separated list of chroots to
+ use in the copr.</td>
+ </tr><tr>
+ <th>repos</th> <td>A comma separated list of repositories
+ that this new copr should have access to.</td>
+ </tr><tr>
+ <th>initial_pkgs</th> <td>A comma separated list of initial
+ packages to build in this new copr.</td>
+ </tr>
+ </table>
+
+ <p>URL will therefore look like:</p>
+ <pre style="font-size:120%">
+ /add/<name>/<chroots>/
+ /add/<name>/<chroots>/<repos>/
+ /add/<name>/<chroots>/<repos>/<initial_pkgs>/
+ </pre>
+
+
<p>To come here, more information about the API itself.</p>
</div>
diff --git a/coprs_frontend/coprs/views/api_ns/__init__.py b/coprs_frontend/coprs/views/api_ns/__init__.py
new file mode 100644
index 0000000..ce13abc
--- /dev/null
+++ b/coprs_frontend/coprs/views/api_ns/__init__.py
@@ -0,0 +1,3 @@
+import flask
+
+api_ns = flask.Blueprint('api_ns', __name__, url_prefix = '/api')
diff --git a/coprs_frontend/coprs/views/api_ns/api_general.py b/coprs_frontend/coprs/views/api_ns/api_general.py
new file mode 100644
index 0000000..adc851d
--- /dev/null
+++ b/coprs_frontend/coprs/views/api_ns/api_general.py
@@ -0,0 +1,96 @@
+import time
+
+import flask
+
+from coprs import db
+from coprs import exceptions
+
+from coprs.views.misc import login_required
+
+from coprs.views.api_ns import api_ns
+
+from coprs.logic import builds_logic
+from coprs.logic import coprs_logic
+
+
+ at 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')
+
+
+ at api_ns.route('/new/', methods = ["GET", "POST"])
+ at login_required
+def api_new_token():
+ """ Method use to generate a new API token for the current user.
+ """
+ user = flask.g.user
+ user.api_token = generate_api_token(app.config['API_TOKEN_LENGTH'])
+ user.api_token_expiration = datetime.date.today() \
+ + datetime.timedelta(days=30)
+ db.session.add(user)
+ db.session.commit()
+ flask.g.user = user
+ return flask.redirect(flask.url_for('misc.api'))
+
+
+ at api_ns.route('/add/<name>/<chroots>/',
+ defaults={'repos':"", 'initial_pkgs':""})
+ at api_ns.route('/add/<name>/<chroots>/<repos>/',
+ defaults={'initial_pkgs':None})
+ at api_ns.route('/add/<name>/<chroots>/<repos>/<initial_pkgs>/')
+ at login_required
+def api_add_copr(name, chroots, repos="", initial_pkgs=""):
+ """ Receive information from the user on how to create its new copr,
+ check their validity and create the corresponding copr.
+
+ :arg name: the name of the copr to add
+ :arg chroots: a comma separated list of chroots to use
+ :kwarg repos: a comma separated list of repository that this copr
+ can use.
+ :kwarg initial_pkgs: a comma separated list of initial packages to
+ 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))
+
+
+ at api_ns.route('/list/<username>/', methods=['GET'])
+def api_list_copr(username):
+ """ 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
diff --git a/coprs_frontend/coprs/views/misc.py b/coprs_frontend/coprs/views/misc.py
index e10b07f..c5cffc1 100644
--- a/coprs_frontend/coprs/views/misc.py
+++ b/coprs_frontend/coprs/views/misc.py
@@ -119,22 +119,3 @@ def backend_authenticated(f):
return 'You have to provide the correct password', 401
return f(*args, **kwargs)
return decorated_function
-
-
- at misc.route('/api/')
-def api():
- return flask.render_template('api.html',
- user=flask.g.user)
-
-
- at misc.route('/api/new/', methods = ["GET", "POST"])
- at login_required
-def api_new_token():
- user = flask.g.user
- user.api_token = generate_api_token(app.config['API_TOKEN_LENGTH'])
- user.api_token_expiration = datetime.date.today() \
- + datetime.timedelta(days=30)
- db.session.add(user)
- db.session.commit()
- flask.g.user = user
- return flask.redirect(flask.url_for('misc.api'))
--
1.8.1
More information about the copr-devel
mailing list