[copr] master: [frontend] unite edit, webhooks and delete under settings page (9237021)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 9237021f2bf925010ecbf08ceaa3f3625e371ee3
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Nov 30 20:25:47 2015 +0100
[frontend] unite edit, webhooks and delete under settings page
>---------------------------------------------------------------
.../coprs/templates/coprs/detail.html | 17 ++--------
.../coprs/templates/coprs/detail/delete.html | 23 --------------
.../coprs/templates/coprs/detail/edit.html | 18 -----------
.../templates/coprs/detail/settings/delete.html | 17 ++++++++++
.../templates/coprs/detail/settings/edit.html | 12 +++++++
.../templates/coprs/detail/settings/settings.html | 32 ++++++++++++++++++++
.../templates/coprs/detail/settings/webhooks.html | 21 +++++++++++++
.../coprs/templates/coprs/detail/webhooks.html | 24 ---------------
.../coprs/views/coprs_ns/coprs_general.py | 6 ++--
9 files changed, 88 insertions(+), 82 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail.html b/frontend/coprs_frontend/coprs/templates/coprs/detail.html
index 0359501..44598a8 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail.html
@@ -6,16 +6,13 @@
{% set url_builds = url_for('coprs_ns.group_copr_builds', group_name = copr.group.name, coprname = copr.name) %}
{% set url_monitor = url_for('coprs_ns.group_copr_build_monitor', group_name = copr.group.name, coprname = copr.name) %}
{% set url_add_build = url_for('coprs_ns.group_copr_add_build', group_name = copr.group.name, coprname = copr.name) %}
- {% set url_delete = url_for('coprs_ns.group_copr_delete', group_name = copr.group.name, coprname = copr.name) %}
- {% set url_edit = url_for('coprs_ns.group_copr_edit', group_name = copr.group.name, coprname = copr.name) %}
+ {% set url_settings = url_for('coprs_ns.group_copr_edit', group_name = copr.group.name, coprname = copr.name) %}
{% else %}
{% set url_overview = url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name) %}
{% set url_builds = url_for('coprs_ns.copr_builds', username = copr.owner.name, coprname = copr.name) %}
{% set url_monitor = url_for('coprs_ns.copr_build_monitor', username = copr.owner.name, coprname = copr.name) %}
{% set url_add_build = url_for('coprs_ns.copr_add_build', username = copr.owner.name, coprname = copr.name) %}
- {% set url_delete = url_for('coprs_ns.copr_delete', username = copr.owner.name, coprname = copr.name) %}
- {% set url_edit = url_for('coprs_ns.copr_edit', username = copr.owner.name, coprname = copr.name) %}
- {% set url_webhooks = url_for('coprs_ns.copr_webhooks', username = copr.owner.name, coprname = copr.name) %}
+ {% set url_settings = url_for('coprs_ns.copr_edit', username = copr.owner.name, coprname = copr.name) %}
{% endif %}
{% block title %}{{ copr.owner.name }}/{{ copr.name }} Copr{% endblock %}
@@ -74,14 +71,6 @@
{{ nav_element("add_build", "New Build", url_add_build) }}
{% endif %}
- {% if g.user and g.user.can_edit(copr) %}
- {{ nav_element("edit", "Edit", url_edit) }}
- {% endif %}
-
- {% if g.user and g.user.can_edit(copr) %}
- {{ nav_element("webhooks", "Webhooks", url_webhooks) }}
- {% endif %}
-
{% if g.user and not copr.is_a_group_project %}
{{ nav_element("permissions", "Permissions", url_for(
'coprs_ns.copr_permissions', username = copr.owner.name, coprname = copr.name))
@@ -89,7 +78,7 @@
{% endif %}
{% if g.user and g.user.can_edit(copr) %}
- {{ nav_element("delete", "Delete", url_delete) }}
+ {{ nav_element("settings", "Settings", url_settings) }}
{% endif %}
</ul>
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/delete.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/delete.html
deleted file mode 100644
index f165cec..0000000
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/delete.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{% extends "coprs/detail.html" %}
-{% from "coprs/_coprs_forms.html" import copr_delete_form %}
-
-{% set selected_tab = "delete" %}
-
-{% block title %}Delete {{ copr.owner.name }}/{{ copr.name }}?{% endblock %}
-
-{%block project_breadcrumb %}
-<li class="active">
- Delete
-</li>
-{%endblock%}
-
-{% block detail_body %}
-<h2> Delete Project </h2>
- <p>If you really want to delete this Project, you'll have to answer this riddle:</p>
- <p>{{ range(5)|random }}.{{ range(10)|random }} hens lay {{ range(5)|random }}.{{ range(10)|random }} eggs in
- {{ range(5)|random }}.{{ range(10)|random }} days. How many eggs do {{ range(5)|random }}.{{ range(10)|random }}
- hens lay in {{ range(5)|random }}.{{ range(10)|random }} days?</p>
- <p>Ok, kidding, just type "<strong>yes</strong>" into the below box.</p>
- {{ copr_delete_form(form, copr) }}
-
-{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/edit.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/edit.html
deleted file mode 100644
index e5b8c03..0000000
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/edit.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{% extends "coprs/detail.html" %}
-{% from "coprs/_coprs_forms.html" import copr_form, copr_permissions_form with context %}
-
-{% set selected_tab = "edit" %}
-
-{% block title %}Editing {{ copr.owner.name }}/{{ copr.name }}{% endblock %}
-
-{%block project_breadcrumb %}
-<li class="active">
- Edit
-</li>
-{%endblock%}
-
-{% block detail_body %}
- <h2> Edit Project Details</h2>
-
- {{ copr_form(form, view = view, copr = copr) }}
-{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/delete.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/delete.html
new file mode 100644
index 0000000..ddb1a0a
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/delete.html
@@ -0,0 +1,17 @@
+{% extends "coprs/detail/settings/settings.html" %}
+{% from "coprs/_coprs_forms.html" import copr_delete_form %}
+
+{% set selected_monitor_tab = "delete" %}
+
+
+{% block tab_content %}
+
+<h2> Delete Project </h2>
+<p>If you really want to delete this Project, you'll have to answer this riddle:</p>
+<p>{{ range(5)|random }}.{{ range(10)|random }} hens lay {{ range(5)|random }}.{{ range(10)|random }} eggs in
+ {{ range(5)|random }}.{{ range(10)|random }} days. How many eggs do {{ range(5)|random }}.{{ range(10)|random }}
+ hens lay in {{ range(5)|random }}.{{ range(10)|random }} days?</p>
+<p>Ok, kidding, just type "<strong>yes</strong>" into the below box.</p>
+{{ copr_delete_form(form, copr) }}
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/edit.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/edit.html
new file mode 100644
index 0000000..d768ae8
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/edit.html
@@ -0,0 +1,12 @@
+{% extends "coprs/detail/settings/settings.html" %}
+{% from "coprs/_coprs_forms.html" import copr_form %}
+
+{% set selected_monitor_tab = "edit" %}
+
+
+{% block tab_content %}
+
+<h2> Edit Project Details</h2>
+{{ copr_form(form, view=view, copr=copr) }}
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/settings.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/settings.html
new file mode 100644
index 0000000..5da1c96
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/settings.html
@@ -0,0 +1,32 @@
+{% extends "coprs/detail.html" %}
+{% block title %}Settings {{ copr.owner.name }}/{{ copr.name }}{% endblock %}
+
+{% set selected_tab = "settings" %}
+
+
+{% macro tab(tab_name, tab_title, href) %}
+<li class="{% if selected_monitor_tab == tab_name %}active{% endif %}">
+ <a href="{{ href }}">
+ {{ tab_title }}
+ </a>
+</li>
+{% endmacro %}
+
+
+{% block detail_body %}
+
+<ul class="nav nav-tabs nav-tabs-pf">
+ {% if copr.is_a_group_project %}
+ {{ tab("edit", "Edit", url_for('coprs_ns.group_copr_edit', group_name=copr.group.name, coprname=copr.name)) }}
+ {{ tab("webhooks", "Webhooks", url_for('coprs_ns.group_copr_webhooks', group_name=copr.group.name, coprname=copr.name)) }}
+ {{ tab("delete", "Delete", url_for('coprs_ns.group_copr_delete', group_name=copr.group.name, coprname=copr.name)) }}
+ {% else %}
+ {{ tab("edit", "Edit", url_for('coprs_ns.copr_edit', username=copr.owner.name, coprname=copr.name)) }}
+ {{ tab("webhooks", "Webhooks", url_for('coprs_ns.copr_webhooks', username=copr.owner.name, coprname=copr.name)) }}
+ {{ tab("delete", "Delete", url_for('coprs_ns.copr_delete', username=copr.owner.name, coprname=copr.name)) }}
+ {% endif %}
+</ul>
+
+{% block tab_content %}{% endblock %}
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/webhooks.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/webhooks.html
new file mode 100644
index 0000000..b73679e
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/settings/webhooks.html
@@ -0,0 +1,21 @@
+{% extends "coprs/detail/settings/settings.html" %}
+
+{% set selected_monitor_tab = "webhooks" %}
+
+
+{% block tab_content %}
+
+<div class="row">
+ <div class="col-sm-8 col-md-9">
+ <h2> Webhooks </h2>
+ <p> You can set up an automatic builds with webhooks </p>
+
+ <h3> GitHub </h3>
+ <p> We might need to explain here what to do with that... </p>
+ <div class="well well-sm">
+ {{ github_url }}
+ </div>
+ </div>
+</div>
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html
deleted file mode 100644
index 77b2e78..0000000
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html
+++ /dev/null
@@ -1,24 +0,0 @@
-{% extends "coprs/detail.html" %}
-
-{% set selected_tab = "webhooks" %}
-
-{%block project_breadcrumb %}
-<li class="active">
- Webhooks
-</li>
-{%endblock%}
-
-{% block detail_body %}
-<div class="row">
- <div class="col-sm-8 col-md-9">
- <h2> Webhooks </h2>
- <p> You can set up an automatic builds with webhooks </p>
-
- <h3> GitHub </h3>
- <p> We might need to explain here what to do with that... </p>
- <div class="well well-sm">
- {{ github_url }}
- </div>
- </div>
-</div>
-{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index 4a0712f..b689aac 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -362,7 +362,7 @@ def render_copr_webhooks(copr):
copr.webhook_secret)
return flask.render_template(
- "coprs/detail/webhooks.html",
+ "coprs/detail/settings/webhooks.html",
copr=copr, github_url=github_url)
@@ -385,7 +385,7 @@ def render_copr_edit(copr, form, view):
form = forms.CoprFormFactory.create_form_cls(
copr.mock_chroots)(obj=copr)
return flask.render_template(
- "coprs/detail/edit.html",
+ "coprs/detail/settings/edit.html",
copr=copr, form=form, view=view)
@@ -609,7 +609,7 @@ def process_delete(copr, url_on_error, url_on_success):
flask.flash("Project has been deleted successfully.")
return flask.redirect(url_on_success)
else:
- return render_template("coprs/detail/delete.html", form=form, copr=copr)
+ return render_template("coprs/detail/settings/delete.html", form=form, copr=copr)
@coprs_ns.route("/<username>/<coprname>/delete/", methods=["GET", "POST"])
8 years, 4 months
[copr] master: [frontend] add checkbox for 'package.webhook_rebuild' (b9f3fab)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit b9f3fab7d54b06ecb480ade9efd032570b67fd0b
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Nov 30 15:59:32 2015 +0100
[frontend] add checkbox for 'package.webhook_rebuild'
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/forms.py | 3 +++
.../templates/coprs/detail/_package_forms.html | 20 +++++++++++++++++---
.../coprs/views/coprs_ns/coprs_builds.py | 7 +++++--
3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py
index 43c0d87..2abf804 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -571,6 +571,7 @@ class PackageFormTitoFactory(object):
wtforms.validators.Optional()])
tito_test = wtforms.BooleanField(default=False)
+ webhook_rebuild = wtforms.BooleanField(default=False)
return F
@@ -606,6 +607,8 @@ class PackageFormMockFactory(object):
message="RPM spec file must end with .spec"
)])
+ webhook_rebuild = wtforms.BooleanField(default=False)
+
return F
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
index 037dfb2..ef01980 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -24,7 +24,21 @@
{% endmacro %}
-{% macro copr_package_form_end(form) %}
+{% macro copr_package_form_end(form, package, source_type) %}
+ <div class="form-group">
+ <label class="col-sm-2 control-label" for="textInput-markup">
+ Webhook rebuild
+ </label>
+ <div class="col-sm-10">
+ {# @WORKAROUND form.webhook_rebuild(checked=(...)) just didn't work #}
+ {% if package.source_type_text == source_type %}
+ {{ form.webhook_rebuild() }}
+ {% else %}
+ <input type="checkbox" name="webhook_rebuild" />
+ {% endif %}
+ Use webhook to rebuild package? (i.e. every commit in git repository)
+ </div>
+ </div>
{{ form.csrf_token }}
<input class="btn btn-primary pull-right" type="submit" value="Submit">
</form>
@@ -47,7 +61,7 @@
</div>
<input type="hidden" name="source_type" value="git_and_tito" />
- {{ copr_package_form_end(form) }}
+ {{ copr_package_form_end(form, package, 'git_and_tito') }}
{% endmacro %}
@@ -60,5 +74,5 @@
{{ render_field(form.scm_branch, placeholder="Optional - A branch you want to build from.") }}
<input type="hidden" name="source_type" value="mock_scm" />
- {{ copr_package_form_end(form) }}
+ {{ copr_package_form_end(form, package, 'mock_scm') }}
{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
index 78c306b..7704233 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -120,14 +120,16 @@ def group_copr_package_edit(copr, package_name):
def render_package_edit(copr, package_name, view, form_tito=None, form_mock=None):
package = ComplexLogic.get_package_safe(copr, package_name)
+
+ data = package.source_json_dict
+ data["webhook_rebuild"] = package.webhook_rebuild
+
if not form_tito:
- data = package.source_json_dict
if "git_dir" in data:
data["git_directory"] = data["git_dir"] # @FIXME workaround
form_tito = forms.PackageFormTitoFactory.create_form_cls()(data=data)
if not form_mock:
- data = package.source_json_dict
form_mock = forms.PackageFormMockFactory.create_form_cls()(data=data)
return flask.render_template("coprs/detail/package_edit.html", package=package, copr=copr, form_tito=form_tito,
@@ -162,6 +164,7 @@ def process_package_edit(copr, package_name, view):
if form.validate_on_submit():
package = PackagesLogic.get(copr.id, package_name).first()
package.source_type = helpers.BuildSourceEnum(form.source_type.data)
+ package.webhook_rebuild = form.webhook_rebuild.data
if package.source_type == helpers.BuildSourceEnum("git_and_tito"):
package.source_json = json.dumps({
8 years, 4 months
[copr] master: minor (05d6772)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 05d6772c272750a2595fac5593741cdcf6fff194
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 20:39:32 2015 +0100
minor
>---------------------------------------------------------------
python/docs/client_v2/resource_info/project.rst | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/python/docs/client_v2/resource_info/project.rst b/python/docs/client_v2/resource_info/project.rst
index a37a230..0cb48a7 100644
--- a/python/docs/client_v2/resource_info/project.rst
+++ b/python/docs/client_v2/resource_info/project.rst
@@ -50,7 +50,7 @@ Get projects list
# filter by name
>>> plist_2 = cl.project.get_list(name="copr")
# search by string
- >>> plist_2 = cl.project.get_list(name="copr")
+ >>> plist_2 = cl.project.get_list(search_query="copr")
Get one project
8 years, 4 months
[copr] master: [python] updated docs to include project creation method (a94d2b6)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit a94d2b60ef493abf9b66091f6edf539315ac0899
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 19:33:50 2015 +0100
[python] updated docs to include project creation method
>---------------------------------------------------------------
python/docs/client_v2/handlers.rst | 6 +++---
python/docs/client_v2/resource_info/project.rst | 13 ++++++++++++-
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/python/docs/client_v2/handlers.rst b/python/docs/client_v2/handlers.rst
index e49e289..904f8ef 100644
--- a/python/docs/client_v2/handlers.rst
+++ b/python/docs/client_v2/handlers.rst
@@ -4,12 +4,12 @@ Handlers
Project
-------
.. autoclass:: copr.client_v2.handlers.ProjectHandle
- :members: get_list, get_one, update, delete
+ :members:
Project chroot
--------------
.. autoclass:: copr.client_v2.handlers.ProjectChrootHandle
- :members: get_list, get_one, enable, update, disable
+ :members:
Build
@@ -27,7 +27,7 @@ Build task
Mock chroot
-----------
.. autoclass:: copr.client_v2.handlers.MockChrootHandle
- :members: get_list, get_one
+ :members:
diff --git a/python/docs/client_v2/resource_info/project.rst b/python/docs/client_v2/resource_info/project.rst
index 2d29a2c..a37a230 100644
--- a/python/docs/client_v2/resource_info/project.rst
+++ b/python/docs/client_v2/resource_info/project.rst
@@ -78,7 +78,18 @@ Delete project
Create new project
------------------
-.. note:: Not Implemented yet
+.. note::
+ Here you could also provide list of chroots, which should be activated. Use key ``chroots``.
+
+.. sourcecode:: python
+
+ >>> res = cl.projects.create(name="my_cool_project",
+ owner="vgologuz",
+ instructions="don't touch me!",
+ chroots=["fedora-22-x86_64"])
+ >>> print(res)
+ <Project #5384: vgologuz/my_cool_project>
+
Access project chroots
8 years, 4 months
[copr] master: [frontend] removed old api documentation, added link to the rest api documentation at the ReadTheDocs. (0c56339)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 0c5633930a44a1507d572b424d9ef9beb987570c
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 18:34:40 2015 +0100
[frontend] removed old api documentation, added link to the rest api documentation at the ReadTheDocs.
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/templates/api.html | 524 +---------------------
1 files changed, 6 insertions(+), 518 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/api.html b/frontend/coprs_frontend/coprs/templates/api.html
index 9944d0e..51fa4a1 100644
--- a/frontend/coprs_frontend/coprs/templates/api.html
+++ b/frontend/coprs_frontend/coprs/templates/api.html
@@ -19,7 +19,7 @@
<h1>Copr API</h1>
<h2>API Token</h2>
- <p>In order to access the API, you will need to provide an API token.
+ <p>In order to access the restricted parts of the API, you will need to provide an API token.
This token is unique, specific to you and <span style="font-weight:bold;">
should not be shared!</span>.
</p>
@@ -47,522 +47,10 @@ copr_url = {{ ('https://' + config['PUBLIC_COPR_HOSTNAME'])| fix_url_https_front
<h2>The API</h2>
- <p>To make an API call to Copr, make a request to URL corresponding to
- given call (URLs are listed below). Parameters are denoted by angle
- brackets. Result is represented as JSON map with "output": "ok" key-value
- pair on success or "output": "notok" on failure. The rest of the map
- represents result of the call and is described below for individual
- calls.</p>
-
- <h3>List someone's projects</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/</pre>
- <div>or</div>
- <pre style="font-size:120%">/api/coprs/?username="<username>"</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – The name of the user whose projects you'd like
- to list</li>
- </ul>
-
- <h4>Result:</h4>
- <ul>
- <li><b>"repos"</b> – List of projects in given format:
- <ul>
- <li><b>"yum_repos"</b> – Map of chroots to yum repository
- URLs. Chroots are in format
- "<release>-<version>-<architecture>"</li>
- <li><b>"additional_repos"</b> – List of additional
- repositories that are required for this project</li>
- <li><b>"instructions"</b> – Installation instructions
- provided by project's owner </li>
- <li><b>"name"</b> – Name of the project</li>
- <li><b>"description"</b> – Description provided by project's
- owner </li>
- </ul>
- </ul>
-
- <h4>Example call URL</h4>
- <pre style="font-size:120%">https://copr.fedoraproject.org/api/coprs/jdaniels/</pre>
-
- <h4>Example results</h4>
- <pre>
- {
- "output": "ok",
- "repos": [
- {
- "yum_repos": {
- "fedora-19-i686": "https://copr-be.cloud.fedoraproject.org/results/jdaniels/log4j/fedora-19-...",
- "fedora-19-x86_64": "https://copr-be.cloud.fedoraproject.org/results/jdaniels/log4j/fedora-19-..."
- },
- "additional_repos": "",
- "instructions": "",
- "name": "log4j",
- "description": "Java logging package"
- }
- ]
- }
- </pre>
-
- <h3>Detail of project</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<projectname>/detail/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – The name of the user whose projects you'd like
- to show</li>
- <li><b>projectname</b> – The name of the project</li>
-
- </ul>
-
- <h4>Result:</h4>
- <ul>
- <li><b>"detail"</b> – dictionary with following keys:
- <ul>
- <li><b>"yum_repos"</b> – Map of chroots to yum repository
- URLs. Chroots are in format
- "<release>-<version>-<architecture>"</li>
- <li><b>"additional_repos"</b> – List of additional
- repositories that are required for this project</li>
- <li><b>"instructions"</b> – Installation instructions
- provided by project's owner </li>
- <li><b>"name"</b> – Name of the project</li>
- <li><b>"description"</b> – Description provided by project's
- owner </li>
- <li><b>"last_modified"</b> – Datetime (in epoch format) of
- last successfull build.</li>
- </ul>
- </ul>
-
- <h4>Example call URL</h4>
- <pre style="font-size:120%">https://copr.fedoraproject.org/api/coprs/jdaniels/log4j/detail/</pre>
-
- <h4>Example results</h4>
- <pre>
- {
- "output": "ok",
- "repos": [
- {
- "yum_repos": {
- "fedora-19-i686": "https://copr-be.cloud.fedoraproject.org/results/jdaniels/log4j/fedora-19-...",
- "fedora-19-x86_64": "https://copr-be.cloud.fedoraproject.org/results/jdaniels/log4j/fedora-19-..."
- },
- "additional_repos": "",
- "instructions": "",
- "name": "log4j",
- "description": "Java logging package",
- "last_modified": 1386695673
- }
- ]
- }
- </pre>
-
- <h3>Create new project</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/new/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – The name of the user whose project should be
- created</li>
- </ul>
-
- <h4>Parameters sent by POST:</h4>
- <ul>
- <li><b>name</b> – The name of the project to be created</li>
- <li><b>chroots</b> – Chroots to be used in the project, specified as <span style="font-style:italic">chrootname=y</span>
- (e.g.: <span style="font-style:italic">fedora-rawhide-x86_64=y&fedora-20-x86_64=y</span>)</li>
- <li><b>repos</b> – A space separated list of repositories
- that this new project should have access to</li>
- <li><b>initial_pkgs</b> – A space separated list of initial
- packages to build in this new project</li>
- </ul>
-
- <h3>Delete an entire project</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<projectname>/delete/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – Your username </li>
- <li><b>projectname</b> – Name of the project you want to delete.</li>
- </ul>
-
- <h4>Parameters sent by POST:</h4>
- <ul>
- <li><b>verify</b> – This needs to be "yes"</li>
- </ul>
-
-
- <h3>Builds success summary (project monitor)</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<coprname>/monitor/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – Name of the user whose chroot you'd like to know details of</li>
- <li><b>coprname</b> – Name of the copr whose chroot you'd like to know details of</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>builds</b> –
- All builds in project.
- </li>
- <li><b>chroots</b> –
- Chroots used in the project
- </li>
- <li><b>packages</b> –
- Aggregated information about built packages.
- </li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
-{
- "builds": [
- {
- "id": 9578,
- "src_pkg": "https://fedorapeople.org/~vgologuz/python-copr-client-1.43-1.git.0.f84518...",
- "pkg_version": "1.43",
- "state": "failed",
- "submitted_on": 1408462225,
- "started_on": 1408462318,
- "ended_on": 1408462701,
- "results": "http://copr-be-dev.cloud.fedoraproject.org/results/vgologuz/copr/",
- "built_packages": [
- "python-copr-client 1.43",
- "python-copr-client-doc 1.43"
- ],
- }
- ],
- "chroots": ["epel-5-x86_64", "epel-7-x86_64", "fedora-20-x86_64"],
- "packages": [
- {
- "pkg_name": "python-copr-client",
- "pkg_version": null, # not used anymore
- "results": {
- "epel-5-x86_64": {"build_id": 9578, "status": "failed", "pkg_version": "1.2-1.fc20"],
- "epel-7-x86_64": {"build_id": 9578, "status": "failed", "pkg_version": "1.2-1.fc20"],
- "fedora-20-x86_64": null # this chroot was never build,
- }
- }
- ]
-}
-
- </pre>
-
- <h3>Add new build</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<projectname>/new_build/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – The name of given projects's owner</li>
- <li><b>projectname</b> – The name of the project in which the package
- should be built</li>
- </ul>
-
- <h4>Parameters sent by POST:</h4>
- <ul>
- <li><b>pkgs</b> – Space separated list of package URLs (SRPMs) to be built</li>
- <li><b>chroots</b> – (Optional) Chroots for this particular build (in case you do not need all project's chroots), specified as <span style="font-style:italic">chrootname=y</span>
- </ul>
-
- <h4>Example results</h4>
- <pre>
- {
- "output": "ok",
- "message": "Build was added to log4j.",
- "ids": [5]
- }
- </pre>
-
- <h3>Query build status</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/build_status/<build_id>/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>build_id</b> – Build ID returned by the <span style="font-style:italic">new_build</span> call</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>status</b> – Status of the build, one of
- <ul>
- <li>canceled</li>
- <li>failed</li>
- <li>pending</li>
- <li>running</li>
- <li>skipped</li>
- <li>starting</li>
- <li>succeeded</li>
- <li>importing</li>
- </ul>
- </li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "status": "pending",
- "output": "ok"
- }
- </pre>
-
- <h3>Query build detail</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/build_detail/<build_id>/</pre>
- <pre style="font-size:120%">/api/coprs/build/<build_id>/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>build_id</b> – Build ID returned by the <span style="font-style:italic">new_build</span> call</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>status</b> – Status of the build, one of
- <ul>
- <li>canceled</li>
- <li>failed</li>
- <li>pending</li>
- <li>running</li>
- <li>skipped (This package has already been built previously)</li>
- <li>starting</li>
- <li>succeeded</li>
- <li>importing</li>
- </ul>
- </li>
- <li><b>project</b> – Name of the project.</li>
- <li><b>owner</b> – Name of the owner.</li>
- <li><b>results</b>– URL with the results.</li>
- <li><b>built_pkgs</b>– List of built packages.</li>
- <li><b>src_version</b>– Version of the source package.</li>
- <li><b>chroots</b>– Chroots in which the package has been build and their build states.</li>
- <li><b>submitted_on</b>– Datetime when the build was submitted. (in epoch format) </li>
- <li><b>started_on</b>– Datetime when the build process started. (in epoch format)</li>
- <li><b>ended_on</b>– Datetime when the build finished. (in epoch format)</li>
- <li><b>src_pkg</b>– URL of the source rpm package.</li>
- <li><b>submitted_by</b>– User who submitted the build.</li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "status": "pending",
- "project": "myproject",
- "owner": "msuchy",
- "results": "http://copr-be.cloud.fedoraproject.org/results/msuchy/myproject/",
- "built_pkgs": [
- "hello 2.8",
- "hello-gui 2.8",
- "super-lib 5.4"
- ],
- "src_version": "2.8",
- "chroots": {
- "fedora-20-i386": "succeeded",
- "fedora-20-x86_64": "succeeded"
- },
- "submitted_on": 1386695673,
- "started_on": 1386695985,
- "ended_on": 1386696854,
- "src_pkg": "http://asamalik.fedorapeople.org/hello-2.8-1.fc20.src.rpm",
- "submitted_by": "asamalik",
- "output": "ok"
- }
- </pre>
-
- <h3>Cancel build</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/cancel_build/<build_id>/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>build_id</b> – Build ID returned by the <span style="font-style:italic">new_build</span> call</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>status</b> – Status of the task.
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "status": "Build canceled",
- "output": "ok"
- }
- </pre>
-
- <h3>Copr Modification</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<coprname>/modify/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – Name of the user whose copr you'd like to modify</li>
- <li><b>coprname</b> – Name of the copr you'd you'd like to modify</li>
- </ul>
-
- <h4>Parameters sent by POST:</h4>
- <ul>
- <li><b>description</b> – Brief description of the project (Optional)</li>
- <li><b>instructions</b> – Description of how your project can be
- installed, etc. (Optional)</li>
- <li><b>repos</b> – URL to additional yum repos, which can be used
- during build. Space separated. (Optional)</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>description</b> – Same as above</li>
- <li><b>instructions</b> – Same as above</li>
- <li><b>repos</b> – Same as above</li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "output": "ok",
- "repos": "foo",
- "description": "bar",
- "instructions": "baz"
- }
- </pre>
-
- <h3>Chroot Modification</h3>
-
- <p><span style="font-style:italic">Login required</span></p>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<coprname>/modify/<chrootname>/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – Name of the user whose chroot you'd like to modify</li>
- <li><b>coprname</b> – Name of the copr whose chroot you'd like to modify</li>
- <li><b>chrootname</b> – Name of the chroot you'd like to modify</li>
- </ul>
-
- <h4>Parameters sent by POST:</h4>
- <ul>
- <li><b>buildroot_pkgs</b> – Additional packages to be always present in minimal
- buildroot</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>buildroot_pkgs</b> – Same as above</li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "output": "ok",
- "buildroot_pkgs": "scl-utils-build"
- }
- </pre>
-
- <h3>Chroot details</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/<username>/<coprname>/detail/<chrootname>/</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>username</b> – Name of the user whose chroot you'd like to know details of</li>
- <li><b>coprname</b> – Name of the copr whose chroot you'd like to know details of</li>
- <li><b>chrootname</b> – Name of the chroot you'd like to know details of</li>
- </ul>
-
- <h4>Result</h4>
- <ul>
- <li><b>buildroot_pkgs</b> – Additional packages to be always present in minimal
- buildroot</li>
- </ul>
-
- <h4>Example result</h4>
- <pre>
- {
- "output": "ok",
- "buildroot_pkgs": "scl-utils-build"
- }
- </pre>
-
- <h3>Search for project</h3>
-
- <h4>URL:</h4>
- <pre style="font-size:120%">/api/coprs/search/<project>/</pre>
- <div>or</div>
- <pre style="font-size:120%">/api/coprs/?search="<project>"</pre>
-
- <h4>URL parameters:</h4>
- <ul>
- <li><b>project</b> – The text of the project whose you'd like
- to find</li>
- </ul>
-
- <h4>Result:</h4>
- <ul>
- <li><b>"repos"</b> – List of repos in given format:
- <ul>
- <li><b>"username"</b> – Name of the user</li>
- <li><b>"coprname"</b> – Name of the copr</li>
- <li><b>"description"</b> – Description of the copr</li>
- </ul>
- </ul>
-
- <h4>Example call URL</h4>
- <pre style="font-size:120%">https://copr.fedoraproject.org/api/coprs/search/tests/</pre>
-
- <h4>Example results</h4>
- <pre>
- {
- "output": "ok",
- "repos": [
- {
- "username": "ignatenkobrain",
- "coprname": "test",
- "description": "Tests"
- },
- "username": "ignatenkobrain",
- "coprname": "tests",
- "description": ""
- },
- {
- "username": "msuchy",
- "coprname": "tests",
- "description": "Copr testing repository, just for test various builds."
- }
- ]
- }
- </pre>
-
+ <p> Api documentation is available at:
+ <a href="http://copr-rest-api.readthedocs.org/en/latest/index.html">
+ http://copr-rest-api.readthedocs.org/en/latest/index.html
+ </a>
+ </p>
</div>
{% endblock %}
8 years, 4 months
[copr] master: minor (3c6543c)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 3c6543cf39d7bb8a25a8edfec2857d6a29f3d3d2
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 18:03:49 2015 +0100
minor
>---------------------------------------------------------------
python/copr/client_v2/handlers.py | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/python/copr/client_v2/handlers.py b/python/copr/client_v2/handlers.py
index 0a17262..ee745d9 100644
--- a/python/copr/client_v2/handlers.py
+++ b/python/copr/client_v2/handlers.py
@@ -325,7 +325,6 @@ class ProjectHandle(AbstractHandle):
):
""" Creates new project
-
:param name: project name
:param owner: username
:param chroots: list of mock chroot to be used in project
@@ -368,9 +367,6 @@ class ProjectHandle(AbstractHandle):
request_body=request_data, response=response
)
-
-
-
def update(self, project_entity):
""" Updates project.
8 years, 4 months
[copr] master: [python] create new projects now returns newly created project on success (7c3b733)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 7c3b73328e29ac765f8212f657e35c33b2d79a93
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 15:28:35 2015 +0100
[python] create new projects now returns newly created project on success
>---------------------------------------------------------------
python/copr/client_v2/handlers.py | 34 ++++++++++++++++++++++++++++++++--
1 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/python/copr/client_v2/handlers.py b/python/copr/client_v2/handlers.py
index f8f1062..0a17262 100644
--- a/python/copr/client_v2/handlers.py
+++ b/python/copr/client_v2/handlers.py
@@ -323,6 +323,22 @@ class ProjectHandle(AbstractHandle):
homepage=None, contact=None, disable_createrepo=None, build_enable_net=None,
repos=None,
):
+ """ Creates new project
+
+
+ :param name: project name
+ :param owner: username
+ :param chroots: list of mock chroot to be used in project
+ :param description:
+ :param instructions:
+ :param homepage:
+ :param contact:
+ :param bool disable_createrepo:
+ :param bool build_enable_net:
+ :param repos: list of additional repos enabled for builds
+
+ :rtype: :py:class:`~.resources.Project`
+ """
new_entity = ProjectCreateEntity(
owner=owner,
@@ -338,8 +354,22 @@ class ProjectHandle(AbstractHandle):
)
url = self.get_base_url()
- response = self.nc.request(url, method="post", data=new_entity.to_json(), do_auth=True)
- return OperationResult(self, response)
+ request_data = new_entity.to_json()
+ response = self.nc.request(url, method="post", data=request_data, do_auth=True)
+ op_result = OperationResult(self, response, expected_status=201)
+ if op_result.is_successful():
+ response = self.nc.get(op_result.new_location)
+ return Project.from_response(
+ handle=self, response=response, data_dict=response.json)
+ else:
+ raise RequestError(
+ "Got unexpected status code at create build request",
+ url=self.get_base_url(),
+ request_body=request_data, response=response
+ )
+
+
+
def update(self, project_entity):
""" Updates project.
8 years, 4 months
[copr] master: [python] added method to create new projects through ClientV2 (3142df8)
by vgologuz@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 3142df8755475e5069cafb8d4bfb3ac8f0cb31af
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Fri Nov 27 12:17:32 2015 +0100
[python] added method to create new projects through ClientV2
>---------------------------------------------------------------
python/copr/client_v2/client.py | 1 -
python/copr/client_v2/entities.py | 9 ++++++-
python/copr/client_v2/handlers.py | 26 +++++++++++++++++++-
python/copr/client_v2/net_client.py | 6 ++++
python/copr/client_v2/schemas.py | 6 ++++
python/docs/client_v2/resource_info/build_task.rst | 2 +-
6 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/python/copr/client_v2/client.py b/python/copr/client_v2/client.py
index 696f98e..fb1123e 100644
--- a/python/copr/client_v2/client.py
+++ b/python/copr/client_v2/client.py
@@ -176,7 +176,6 @@ class CoprClient(UnicodeMixin, HandlersProvider):
client.post_init()
return client
-
@classmethod
def create_from_file_config(cls, filepath=None, ignore_error=False):
"""
diff --git a/python/copr/client_v2/entities.py b/python/copr/client_v2/entities.py
index a4e54ea..9750338 100644
--- a/python/copr/client_v2/entities.py
+++ b/python/copr/client_v2/entities.py
@@ -1,7 +1,8 @@
# coding: utf-8
from ..util import UnicodeMixin
-from .schemas import ProjectSchema, EmptySchema, ProjectChrootSchema, BuildSchema, BuildTaskSchema, MockChrootSchema
+from .schemas import ProjectSchema, EmptySchema, ProjectChrootSchema, BuildSchema, BuildTaskSchema, MockChrootSchema, \
+ ProjectCreateSchema
class Link(UnicodeMixin):
@@ -48,6 +49,12 @@ class ProjectEntity(Entity):
return "<Project #{}: {}/{}>".format(self.id, self.owner, self.name)
+class ProjectCreateEntity(Entity):
+ _schema = ProjectCreateSchema(strict=True)
+
+ def __unicode__(self):
+ return "<New project {}/{}>".format(self.owner, self.name)
+
class ProjectChrootEntity(Entity):
_schema = ProjectChrootSchema(strict=True)
diff --git a/python/copr/client_v2/handlers.py b/python/copr/client_v2/handlers.py
index b9afddb..f8f1062 100644
--- a/python/copr/client_v2/handlers.py
+++ b/python/copr/client_v2/handlers.py
@@ -4,7 +4,8 @@ import json
import os
from copr.client_v2.net_client import RequestError, MultiPartTuple
-from .entities import ProjectChrootEntity
+from copr.client_v2.schemas import ProjectCreateSchema
+from .entities import ProjectChrootEntity, ProjectEntity, ProjectCreateEntity
from .resources import Project, OperationResult, ProjectList, ProjectChroot, ProjectChrootList, Build, BuildList, \
MockChroot, MockChrootList, BuildTask, BuildTaskList
@@ -317,6 +318,29 @@ class ProjectHandle(AbstractHandle):
options=query_params
)
+ def create(
+ self, name, owner, chroots, description=None, instructions=None,
+ homepage=None, contact=None, disable_createrepo=None, build_enable_net=None,
+ repos=None,
+ ):
+
+ new_entity = ProjectCreateEntity(
+ owner=owner,
+ name=name,
+ chroots=chroots,
+ description=description,
+ instructions=instructions,
+ homepage=homepage,
+ contact=contact,
+ disable_createrepo=disable_createrepo,
+ build_enable_net=build_enable_net,
+ repos=repos
+ )
+
+ url = self.get_base_url()
+ response = self.nc.request(url, method="post", data=new_entity.to_json(), do_auth=True)
+ return OperationResult(self, response)
+
def update(self, project_entity):
""" Updates project.
diff --git a/python/copr/client_v2/net_client.py b/python/copr/client_v2/net_client.py
index 4e68100..f44073d 100644
--- a/python/copr/client_v2/net_client.py
+++ b/python/copr/client_v2/net_client.py
@@ -122,6 +122,12 @@ class NetClient(object):
def request(self, url, method=None, query_params=None, data=None, do_auth=False, headers=None):
"""
+ :param str method: what HTTP method to use, default is GET, allowed methods: GET, POST, PUT, DELETE
+ :param dict query_params: HTTP query parameters
+ :param str data: serialized data, when present set default content type to application/json
+ :param dict headers: dict with headers, takes priority over implicit ones
+ :param bool do_auth: sends auth headers when enabled
+
:raises: RequestError
"""
diff --git a/python/copr/client_v2/schemas.py b/python/copr/client_v2/schemas.py
index 3204cf2..a05f8ab 100644
--- a/python/copr/client_v2/schemas.py
+++ b/python/copr/client_v2/schemas.py
@@ -35,6 +35,12 @@ class ProjectSchema(Schema):
repos = fields.List(fields.Str())
+class ProjectCreateSchema(ProjectSchema):
+
+ id = fields.Int(allow_none=True)
+ chroots = fields.List(fields.Str())
+
+
class ProjectChrootSchema(Schema):
name = fields.Str()
diff --git a/python/docs/client_v2/resource_info/build_task.rst b/python/docs/client_v2/resource_info/build_task.rst
index 3c2f13f..8058309 100644
--- a/python/docs/client_v2/resource_info/build_task.rst
+++ b/python/docs/client_v2/resource_info/build_task.rst
@@ -7,7 +7,7 @@ Build task represents information about individual build tasks. One task is resp
Access to the build tasks is done through :py:meth:`~copr.client_v2.client.CoprClient.build_tasks`.
property of initialized :py:class:`~copr.client_v2.client.CoprClient`. That property is an instance of
-:py:class:`~copr.client_v2.handlers.BuildTasksHandle`.
+:py:class:`~copr.client_v2.handlers.BuildTaskHandle`.
It may be more convenient to access build tasks in context of a build
8 years, 4 months
[copr] master: [frontend] automatic builds from GitHub - initial implementation (91d46e1)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 91d46e1e3b12109b65ca17b6ee9c56ad1148e8ea
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Tue Nov 24 14:00:05 2015 +0100
[frontend] automatic builds from GitHub - initial implementation
Copr is now able to generate a unique URL for every project which can
be used to set up a GitGub project webhook.
Copr is also able to automatically rebuild packages with each commit, if:
1) Webhook URL is saved in the GitHub repository
2) A package exists in a Copr project, that:
a) has its 'Default Source' set to 'Git and Tito' or 'Mock SCM'
b) uses the http(s) clone-URL of the given GitHub repository
c) has a 'Rebuild Automatically' flag set to True. However, setting
this flag *is not implemented* yet.
What needs to be done to achieve full functionality:
- User must be able to set/unset the 'Package.webhook_rebuild' option
Suggested cosmetic changes:
- Create a new 'Settings' view withing a project and move the
'Webhooks', 'Edit', 'Permissions' and 'Delete' views under
that section.
>---------------------------------------------------------------
.../alembic/versions/573044986ee9_.py | 30 +++++++++++++
frontend/coprs_frontend/coprs/__init__.py | 3 +
.../coprs_frontend/coprs/logic/builds_logic.py | 34 +++++++++++++++
.../coprs_frontend/coprs/logic/packages_logic.py | 14 ++++++-
frontend/coprs_frontend/coprs/models.py | 8 ++++
.../coprs/templates/coprs/detail.html | 5 ++
.../coprs/templates/coprs/detail/webhooks.html | 24 +++++++++++
.../coprs/views/coprs_ns/coprs_general.py | 31 ++++++++++++++
.../coprs/views/webhooks_ns/__init__.py | 3 +
.../coprs/views/webhooks_ns/webhooks_general.py | 44 ++++++++++++++++++++
10 files changed, 195 insertions(+), 1 deletions(-)
diff --git a/frontend/coprs_frontend/alembic/versions/573044986ee9_.py b/frontend/coprs_frontend/alembic/versions/573044986ee9_.py
new file mode 100644
index 0000000..fc1f08b
--- /dev/null
+++ b/frontend/coprs_frontend/alembic/versions/573044986ee9_.py
@@ -0,0 +1,30 @@
+"""empty message
+
+Revision ID: 573044986ee9
+Revises: 4b57794e2b5
+Create Date: 2015-11-26 12:36:59.729053
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '573044986ee9'
+down_revision = '4b57794e2b5'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('copr', sa.Column('webhook_secret', sa.String(length=100), nullable=True))
+ op.add_column('package', sa.Column('enable_net', sa.Boolean(), server_default='0', nullable=False))
+ op.add_column('package', sa.Column('webhook_rebuild', sa.Boolean(), nullable=True))
+ ### end Alembic commands ###
+
+
+def downgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('package', 'webhook_rebuild')
+ op.drop_column('package', 'enable_net')
+ op.drop_column('copr', 'webhook_secret')
+ ### end Alembic commands ###
diff --git a/frontend/coprs_frontend/coprs/__init__.py b/frontend/coprs_frontend/coprs/__init__.py
index f763616..785f29a 100644
--- a/frontend/coprs_frontend/coprs/__init__.py
+++ b/frontend/coprs_frontend/coprs/__init__.py
@@ -63,6 +63,8 @@ from coprs.views import tmp_ns
from coprs.views.tmp_ns import tmp_general
from coprs.views.groups_ns import groups_ns
from coprs.views.groups_ns import groups_general
+from coprs.views.webhooks_ns import webhooks_ns
+from coprs.views.webhooks_ns import webhooks_general
from .context_processors import include_banner, inject_fedmenu
@@ -79,6 +81,7 @@ app.register_blueprint(recent_ns.recent_ns)
app.register_blueprint(stats_receiver.stats_rcv_ns)
app.register_blueprint(tmp_ns.tmp_ns)
app.register_blueprint(groups_ns)
+app.register_blueprint(webhooks_ns)
app.add_url_rule("/", "coprs_ns.coprs_show", coprs_general.coprs_show)
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index bda8aeb..02d2aed 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -525,6 +525,40 @@ GROUP BY
return build
+ @classmethod
+ def rebuild_package(cls, package):
+ build = models.Build(
+ user=None,
+ pkgs=None,
+ package_id=package.id,
+ copr=package.copr,
+ repos=package.copr.repos,
+ source_type=package.source_type,
+ source_json=package.source_json,
+ submitted_on=int(time.time()),
+ enable_net=package.enable_net,
+ timeout=DEFAULT_BUILD_TIMEOUT
+ )
+
+ db.session.add(build)
+
+ chroots = package.copr.active_chroots
+
+ status = helpers.StatusEnum("importing")
+
+ for chroot in chroots:
+ buildchroot = models.BuildChroot(
+ build=build,
+ status=status,
+ mock_chroot=chroot,
+ git_hash=None
+ )
+
+ db.session.add(buildchroot)
+
+ return build
+
+
terminal_states = {StatusEnum("failed"), StatusEnum("succeeded"), StatusEnum("canceled")}
@classmethod
diff --git a/frontend/coprs_frontend/coprs/logic/packages_logic.py b/frontend/coprs_frontend/coprs/logic/packages_logic.py
index 4113d10..104c04c 100644
--- a/frontend/coprs_frontend/coprs/logic/packages_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/packages_logic.py
@@ -1,7 +1,8 @@
import json
+import time
from sqlalchemy import or_
from sqlalchemy import and_
-from sqlalchemy.sql import false
+from sqlalchemy.sql import false, true
from coprs import app
from coprs import db
@@ -12,6 +13,8 @@ from coprs import helpers
from coprs.logic import coprs_logic
from coprs.logic import users_logic
+from coprs.constants import DEFAULT_BUILD_TIMEOUT
+
log = app.logger
@@ -27,6 +30,14 @@ class PackagesLogic(object):
models.Package.name == package_name)
@classmethod
+ def get_for_webhook_rebuild(cls, copr_id, webhook_secret, clone_url):
+ return (models.Package.query.join(models.Copr)
+ .filter(models.Copr.webhook_secret == webhook_secret)
+ .filter(models.Package.copr_id == copr_id)
+ .filter(models.Package.webhook_rebuild == true())
+ .filter(models.Package.source_json.contains(clone_url)))
+
+ @classmethod
def add(cls, user, copr, package_name):
users_logic.UsersLogic.raise_if_cant_build_in_copr(
user, copr,
@@ -56,3 +67,4 @@ class PackagesLogic(object):
return (models.Package.query
.filter(models.Package.copr_id == copr_id)
.filter(models.Package.name == package_name))
+
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index 86ec82f..49f55c0 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -196,6 +196,9 @@ class Copr(db.Model, helpers.Serializer):
group = db.relationship("Group", backref=db.backref("groups"))
mock_chroots = association_proxy("copr_chroots", "mock_chroot")
+ # a secret to be used for webhooks authentication
+ webhook_secret = db.Column(db.String(100))
+
# enable networking for the builds by default
build_enable_net = db.Column(db.Boolean, default=True,
server_default="1", nullable=False)
@@ -352,6 +355,11 @@ class Package(db.Model, helpers.Serializer):
source_type = db.Column(db.Integer, default=helpers.BuildSourceEnum("unset"))
# Source of the build: description in json, example: git link, srpm url, etc.
source_json = db.Column(db.Text)
+ # True if the package is built automatically via webhooks
+ webhook_rebuild = db.Column(db.Boolean, default=False)
+ # enable networking during a build process
+ enable_net = db.Column(db.Boolean, default=False,
+ server_default="0", nullable=False)
# relations
copr_id = db.Column(db.Integer, db.ForeignKey("copr.id"))
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail.html b/frontend/coprs_frontend/coprs/templates/coprs/detail.html
index d8866cb..0359501 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail.html
@@ -15,6 +15,7 @@
{% set url_add_build = url_for('coprs_ns.copr_add_build', username = copr.owner.name, coprname = copr.name) %}
{% set url_delete = url_for('coprs_ns.copr_delete', username = copr.owner.name, coprname = copr.name) %}
{% set url_edit = url_for('coprs_ns.copr_edit', username = copr.owner.name, coprname = copr.name) %}
+ {% set url_webhooks = url_for('coprs_ns.copr_webhooks', username = copr.owner.name, coprname = copr.name) %}
{% endif %}
{% block title %}{{ copr.owner.name }}/{{ copr.name }} Copr{% endblock %}
@@ -77,6 +78,10 @@
{{ nav_element("edit", "Edit", url_edit) }}
{% endif %}
+ {% if g.user and g.user.can_edit(copr) %}
+ {{ nav_element("webhooks", "Webhooks", url_webhooks) }}
+ {% endif %}
+
{% if g.user and not copr.is_a_group_project %}
{{ nav_element("permissions", "Permissions", url_for(
'coprs_ns.copr_permissions', username = copr.owner.name, coprname = copr.name))
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html
new file mode 100644
index 0000000..77b2e78
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/webhooks.html
@@ -0,0 +1,24 @@
+{% extends "coprs/detail.html" %}
+
+{% set selected_tab = "webhooks" %}
+
+{%block project_breadcrumb %}
+<li class="active">
+ Webhooks
+</li>
+{%endblock%}
+
+{% block detail_body %}
+<div class="row">
+ <div class="col-sm-8 col-md-9">
+ <h2> Webhooks </h2>
+ <p> You can set up an automatic builds with webhooks </p>
+
+ <h3> GitHub </h3>
+ <p> We might need to explain here what to do with that... </p>
+ <div class="well well-sm">
+ {{ github_url }}
+ </div>
+ </div>
+</div>
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index 86dabcb..4a0712f 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -4,6 +4,7 @@ import os
import time
import os
import re
+import uuid
from six.moves.urllib.parse import urljoin
import flask
@@ -349,6 +350,36 @@ def copr_permissions(copr):
current_user_permissions=user_perm)
+def render_copr_webhooks(copr):
+ if not copr.webhook_secret:
+ copr.webhook_secret = uuid.uuid4()
+ db.session.add(copr)
+ db.session.commit()
+
+ github_url = "https://{}/webhooks/github/{}/{}/".format(
+ app.config["PUBLIC_COPR_HOSTNAME"],
+ copr.id,
+ copr.webhook_secret)
+
+ return flask.render_template(
+ "coprs/detail/webhooks.html",
+ copr=copr, github_url=github_url)
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/webhooks/")
+@login_required
+@req_with_copr
+def group_copr_webhooks(copr):
+ return render_copr_webhooks(copr)
+
+
+(a)coprs_ns.route("/<username>/<coprname>/webhooks/")
+@login_required
+@req_with_copr
+def copr_webhooks(copr):
+ return render_copr_webhooks(copr)
+
+
def render_copr_edit(copr, form, view):
if not form:
form = forms.CoprFormFactory.create_form_cls(
diff --git a/frontend/coprs_frontend/coprs/views/webhooks_ns/__init__.py b/frontend/coprs_frontend/coprs/views/webhooks_ns/__init__.py
new file mode 100644
index 0000000..f7cd433
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/views/webhooks_ns/__init__.py
@@ -0,0 +1,3 @@
+import flask
+
+webhooks_ns = flask.Blueprint("webhooks_ns", __name__, url_prefix="/webhooks")
diff --git a/frontend/coprs_frontend/coprs/views/webhooks_ns/webhooks_general.py b/frontend/coprs_frontend/coprs/views/webhooks_ns/webhooks_general.py
new file mode 100644
index 0000000..6e57f5d
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/views/webhooks_ns/webhooks_general.py
@@ -0,0 +1,44 @@
+import flask
+
+from coprs import db, app
+from coprs import helpers
+
+from coprs.logic.builds_logic import BuildsLogic
+from coprs.logic.complex_logic import ComplexLogic
+from coprs.logic.coprs_logic import CoprsLogic
+from coprs.logic.packages_logic import PackagesLogic
+
+from coprs.exceptions import ObjectNotFound, AccessRestricted
+
+from coprs.views.webhooks_ns import webhooks_ns
+from coprs.views.misc import page_not_found, access_restricted
+
+import logging
+log = logging.getLogger(__name__)
+
+
+(a)webhooks_ns.route("/github/<copr_id>/<uuid>/", methods=["POST"])
+def webhooks_hello(copr_id, uuid):
+ try:
+ copr = ComplexLogic.get_copr_by_id_safe(copr_id)
+ except ObjectNotFound:
+ return page_not_found("Project does not exist")
+
+ if copr.webhook_secret != uuid:
+ return access_restricted("This webhook is not valid")
+
+ try:
+ request_json = flask.request.json
+ clone_url = request_json["repository"]["clone_url"]
+ except KeyError:
+ return "Bad Request", 400
+
+ packages = PackagesLogic.get_for_webhook_rebuild(copr_id, uuid, clone_url)
+
+ for package in packages:
+ BuildsLogic.rebuild_package(package)
+
+ db.session.commit()
+
+ return "OK", 200
+
8 years, 4 months
[copr] master: [frontend] show which default source type is selected (75b472c)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 75b472cdb4a1ccfde2ea3fa3c3df111a55788fa5
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Wed Nov 25 11:57:11 2015 +0100
[frontend] show which default source type is selected
>---------------------------------------------------------------
.../coprs/templates/coprs/detail/package_edit.html | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
index bda05fa..51679c7 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
@@ -13,15 +13,21 @@
<p>You can choose and configure <b>exactly one</b> default source for the {{ package.name }} package.</p>
+{% macro badge(source_type) %}
+ {% if package.source_type_text == source_type %}
+ <span class="badge"><span class="fa fa-check"></span></span>
+ {% endif %}
+{% endmacro %}
+
<div class="clearfix">
- <h3>Tito</h3>
+ <h3>Tito {{ badge('git_and_tito') }}</h3>
{{ copr_package_form_tito(form_tito, view, copr, package) }}
</div>
<hr>
<div class="clearfix">
- <h3>Mock</h3>
+ <h3>Mock {{ badge('mock_scm') }}</h3>
{{ copr_package_form_mock(form_mock, view, copr, package) }}
</div>
8 years, 4 months