[PATCH] [frontend] add copr modification to web api

Matej Stuchlik mstuchli at redhat.com
Mon Jan 27 09:58:19 UTC 2014


I've yet to update the API documentation page [0], I'll send the relevant patch
if this one passes the review.

[0] http://copr-fe.cloud.fedoraproject.org/api/

I've also enhanced copr-cli to make use of this newly exposed API, I'll send that
patch in a little bit.

---

Allows for:
* modification of description, instructions and repos of a copr
via POST to $copr_api_url/coprs/<username>/<coprname>/modify
* adding packages to minimal buildroot of a chroot via POST to
$copr_api_url/coprs/<username>/<coprname>/modify/<chroot>
* reading what packages are currently added to minimal buildroot of a chroot
via POST to $copr_api_url/coprs/<username>/<coprname>/details/<chroot>
---
 coprs_frontend/coprs/forms.py                    | 15 ++++
 coprs_frontend/coprs/views/api_ns/api_general.py | 90 +++++++++++++++++++++++-
 2 files changed, 104 insertions(+), 1 deletion(-)

diff --git a/coprs_frontend/coprs/forms.py b/coprs_frontend/coprs/forms.py
index c5dfa42..62711d5 100644
--- a/coprs_frontend/coprs/forms.py
+++ b/coprs_frontend/coprs/forms.py
@@ -250,3 +250,18 @@ class PermissionsFormFactory(object):
                         coerce=int))
 
         return F
+
+class CoprModifyForm(wtf.Form):
+    description = wtforms.TextAreaField('Description',
+                                        validators=[wtforms.validators.Optional()])
+
+    instructions = wtforms.TextAreaField('Instructions',
+                                         validators=[wtforms.validators.Optional()])
+
+    repos = wtforms.TextAreaField('Repos',
+                                  validators=[UrlListValidator(),
+                                              wtforms.validators.Optional()],
+                                  filters=[StringListFilter()])
+
+class ModifyChrootForm(wtf.Form):
+    buildroot_pkgs = wtforms.TextField('Additional packages to be always present in minimal buildroot')
diff --git a/coprs_frontend/coprs/views/api_ns/api_general.py b/coprs_frontend/coprs/views/api_ns/api_general.py
index 6dcdaa6..8ecdc29 100644
--- a/coprs_frontend/coprs/views/api_ns/api_general.py
+++ b/coprs_frontend/coprs/views/api_ns/api_general.py
@@ -156,7 +156,6 @@ def copr_new_build(username, coprname):
         output = {'output': 'notok', 'error':
             'Copr with name {0} does not exist.'.format(coprname)}
         httpcode = 500
-
     else:
         if form.validate_on_submit() and flask.g.user.can_build_in(copr):
             # we're checking authorization above for now
@@ -203,3 +202,92 @@ def build_status(build_id):
     jsonout.status_code = httpcode
     return jsonout
 
+ at api_ns.route('/coprs/<username>/<coprname>/modify/', methods=["POST"])
+ at api_login_required
+def copr_modify(username, coprname):
+    form = forms.CoprModifyForm(csrf_enabled=False)
+    copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+
+    if copr is None:
+        output = {'output': 'notok', 'error': 'Invalid copr name or username'}
+        httpcode = 500
+    elif not form.validate_on_submit():
+        output = {'output': 'notok', 'error': 'Invalid request'}
+        httpcode = 500
+    else:
+        # .raw_data needs to be inspected to figure out whether the field
+        # was not sent or was sent empty
+        if form.description.raw_data and len(form.description.raw_data):
+            copr.description = form.description.data
+        if form.instructions.raw_data and len(form.instructions.raw_data):
+            copr.instructions = form.instructions.data
+        if form.repos.raw_data and len(form.repos.raw_data):
+            copr.repos = form.repos.data
+
+        try:
+            coprs_logic.CoprsLogic.update(flask.g.user, copr)
+        except (exceptions.ActionInProgressException, exceptions.InsufficientRightsException) as e:
+            db.session.rollback()
+
+            output = {'output': 'notok', 'error': str(e)}
+            httpcode = 500
+        else:
+            db.session.commit()
+
+            output = {'output': 'ok',
+                      'description': copr.description,
+                      'instructions': copr.instructions,
+                      'repos': copr.repos}
+            httpcode = 200
+
+    jsonout = flask.jsonify(output)
+    jsonout.status_code = httpcode
+    return jsonout
+
+ at api_ns.route('/coprs/<username>/<coprname>/modify/<chrootname>/', methods=["POST"])
+ at api_login_required
+def copr_modify_chroot(username, coprname, chrootname):
+    form = forms.ModifyChrootForm(csrf_enabled=False)
+    copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+    chroot = coprs_logic.MockChrootsLogic.get_from_name(chrootname, active_only=True).first()
+
+    if copr is None:
+        output = {'output': 'notok', 'error': 'Invalid copr name or username'}
+        httpcode = 500
+    elif chroot is None:
+        output = {'output': 'notok', 'error': 'Invalid chroot name'}
+        httpcode = 500
+    elif not form.validate_on_submit():
+        output = {'output': 'notok', 'error': 'Invalid request'}
+        httpcode = 500
+    else:
+        coprs_logic.CoprChrootsLogic.update_buildroot_pkgs(copr, chroot, form.buildroot_pkgs.data)
+        db.session.commit()
+
+        ch = copr.check_copr_chroot(chroot)
+        output = {'output': 'ok', 'buildroot_pkgs': ch.buildroot_pkgs}
+        httpcode = 200
+
+    jsonout = flask.jsonify(output)
+    jsonout.status_code = httpcode
+    return jsonout
+
+ at api_ns.route('/coprs/<username>/<coprname>/details/<chrootname>/', methods=["POST"])
+def copr_chroot_details(username, coprname, chrootname):
+    copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+    chroot = coprs_logic.MockChrootsLogic.get_from_name(chrootname, active_only=True).first()
+
+    if copr is None:
+        output = {'output': 'notok', 'error': 'Invalid copr name or username'}
+        httpcode = 500
+    elif chroot is None:
+        output = {'output': 'notok', 'error': 'Invalid chroot name'}
+        httpcode = 500
+    else:
+        ch = copr.check_copr_chroot(chroot)
+        output = {'output': 'ok', 'buildroot_pkgs': ch.buildroot_pkgs}
+        httpcode = 200
+
+    jsonout = flask.jsonify(output)
+    jsonout.status_code = httpcode
+    return jsonout
-- 
1.8.4.2


More information about the copr-devel mailing list