[copr] master: [frontend] display link to webhooks settings (3685d6f)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 3685d6fc1500812382a29d6a4a43209e988f8af1
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Dec 21 11:36:12 2015 +0100
[frontend] display link to webhooks settings
>---------------------------------------------------------------
.../templates/coprs/detail/_package_forms.html | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
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 244e8b8..144ddeb 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -26,6 +26,7 @@
<input type="checkbox" name="webhook_rebuild" />
{% endif %}
Use webhook to rebuild package? (i.e. every commit in git repository)
+ | See <a href="{{ copr_url('coprs_ns.copr_webhooks', copr) }}">Webhooks Settings</a>
</div>
</div>
{{ form.csrf_token }}
8 years, 4 months
[copr] master: [frontend] merge group/user views for package routes (b7c5a76)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit b7c5a76848587629cc9358fe45258a2f1af884e7
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Thu Dec 17 17:23:54 2015 +0100
[frontend] merge group/user views for package routes
>---------------------------------------------------------------
.../coprs_frontend/coprs/templates/_helpers.html | 7 +-
.../coprs/templates/coprs/detail/package_edit.html | 6 +-
.../coprs/views/coprs_ns/coprs_packages.py | 206 ++++++++------------
3 files changed, 84 insertions(+), 135 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/_helpers.html b/frontend/coprs_frontend/coprs/templates/_helpers.html
index b810198..82c5182 100644
--- a/frontend/coprs_frontend/coprs/templates/_helpers.html
+++ b/frontend/coprs_frontend/coprs/templates/_helpers.html
@@ -160,7 +160,12 @@
{% if not copr.is_a_group_project %}
{{ url_for(view, username=copr.owner.name, coprname=copr.name, **kwargs) }}
{% else %}
- {% set group_view = view.split(".")[0] + ".group_" + view.split(".")[-1] %}
+ {# Only the listed views have merged functions for regular and group projects. Once all views have it, @TODO remove the workaround #}
+ {% if view in ["coprs_ns.copr_add_package", "coprs_ns.copr_new_package", "coprs_ns.copr_rebuild_package", "coprs_ns.copr_packages", "coprs_ns.copr_package", "coprs_ns.copr_edit_package"] %}
+ {% set group_view = view %}
+ {% else %}
+ {% set group_view = view.split(".")[0] + ".group_" + view.split(".")[-1] %}
+ {% endif %}
{{ url_for(group_view, group_name=copr.group.name, coprname=copr.name, **kwargs) }}
{% endif %}
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 59ec338..798d2bb 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
@@ -10,11 +10,7 @@
{% block detail_body %}
-{% if not copr.is_a_group_project %}
- <h2> Package: <a href="{{ url_for('coprs_ns.copr_package', username=package.copr.owner.name, coprname=copr.name, package_name=package.name) }}">{{ package.name }}</a></h2>
-{% else %}
- <h2> Package: <a href="{{ url_for('coprs_ns.group_copr_package', group_name=package.copr.group.name, coprname=copr.name, package_name=package.name) }}">{{ package.name }}</a></h2>
-{% endif %}
+<h2> Package: <a href="{{ copr_url('coprs_ns.copr_package', copr, package_name=package.name) }}">{{ package.name }}</a></h2>
<p>You can choose and configure <b>exactly one</b> default source for the {{ package.name }} package.</p>
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index 05bfd92..3ab9026 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -16,101 +16,111 @@ from coprs.exceptions import (ActionInProgressException,
@coprs_ns.route("/<username>/<coprname>/packages/")
-@req_with_copr
-def copr_packages(copr):
- return render_packages(copr)
-
-
@coprs_ns.route("/g/<group_name>/<coprname>/packages/")
@req_with_copr
-def group_copr_packages(copr):
- return render_packages(copr)
-
-
-def render_packages(copr):
+def copr_packages(copr):
packages = PackagesLogic.get_all(copr.id)
return flask.render_template("coprs/detail/packages.html", packages=packages, copr=copr, empty_build=Build())
@coprs_ns.route("/<username>/<coprname>/package/<package_name>/")
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/")
@req_with_copr
def copr_package(copr, package_name):
- return render_package(copr, package_name)
+ package = ComplexLogic.get_package_safe(copr, package_name)
+ return flask.render_template("coprs/detail/package.html", package=package, copr=copr)
-(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/")
+(a)coprs_ns.route("/<username>/<coprname>/package/<package_name>/rebuild")
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/rebuild")
@req_with_copr
-def group_copr_package(copr, package_name):
- return render_package(copr, package_name)
+def copr_rebuild_package(copr, package_name):
+ package = ComplexLogic.get_package_safe(copr, package_name)
+ data = package.source_json_dict
+ if package.source_type_text == "git_and_tito":
+ data["git_directory"] = data["git_dir"] # @FIXME workaround
+ form = forms.BuildFormTitoFactory
+ f = render_add_build_tito
+ view_suffix = "_tito"
+ elif package.source_type_text == "mock_scm":
+ form = forms.BuildFormMockFactory
+ f = render_add_build_mock
+ view_suffix = "_mock"
-def render_package(copr, package_name):
- package = ComplexLogic.get_package_safe(copr, package_name)
- return flask.render_template("coprs/detail/package.html", package=package, copr=copr)
+ form = form(copr.active_chroots)(data=data)
+ return f(copr, form, view="coprs_ns.copr_new_build" + view_suffix, package=package)
-(a)coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit")
+(a)coprs_ns.route("/<username>/<coprname>/package/add")
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/add")
+@login_required
@req_with_copr
-def copr_edit_package(copr, package_name):
- return render_edit_package(copr, package_name, view="coprs_ns.copr_edit_package")
+def copr_add_package(copr, package_name=None):
+ form = {
+ "git_and_tito": forms.PackageFormTito(),
+ "mock_scm": forms.PackageFormMock()
+ }
+ if flask.request.form:
+ form[flask.request.form["source_type"]].validate()
-(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit")
+ return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None,
+ view="coprs_ns.copr_new_package", form_tito=form["git_and_tito"],
+ form_mock=form["mock_scm"])
+
+
+(a)coprs_ns.route("/<username>/<coprname>/package/new", methods=["POST"])
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/new", methods=["POST"])
+@login_required
@req_with_copr
-def group_copr_edit_package(copr, package_name):
- return render_edit_package(copr, package_name, view="coprs_ns.copr_edit_package")
+def copr_new_package(copr):
+ url_on_success = copr_url("coprs_ns.copr_packages", copr)
+ return process_save_package(copr, package_name=None, view="coprs_ns.copr_new_package",
+ view_method=copr_add_package, url_on_success=url_on_success)
-def render_edit_package(copr, package_name, view, form_tito=None, form_mock=None):
+(a)coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit")
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit")
+@req_with_copr
+def copr_edit_package(copr, package_name):
package = ComplexLogic.get_package_safe(copr, package_name)
-
data = package.source_json_dict
data["webhook_rebuild"] = package.webhook_rebuild
- if not form_tito:
- if "git_dir" in data:
- data["git_directory"] = data["git_dir"] # @FIXME workaround
- form_tito = forms.PackageFormTito(data=data)
+ form_classes = {
+ "git_and_tito": forms.PackageFormTito,
+ "mock_scm": forms.PackageFormMock,
+ }
+ form = {k: v(formdata=None) for k, v in form_classes.items()}
- if not form_mock:
- form_mock = forms.PackageFormMock(data=data)
+ if "form" in kwargs:
+ form[kwargs["form"].source_type.data] = kwargs["form"]
+ elif package.source_type:
+ if package.source_type_text == "git_and_tito" and "git_dir" in data:
+ data["git_directory"] = data["git_dir"] # @FIXME workaround
+ form[package.source_type_text] = form_classes[package.source_type_text](data=data)
- return flask.render_template("coprs/detail/package_edit.html", package=package, copr=copr, form_tito=form_tito,
- form_mock=form_mock, view=view)
+ return flask.render_template("coprs/detail/package_edit.html", package=package, copr=copr,
+ form_tito=form["git_and_tito"], form_mock=form["mock_scm"],
+ view="coprs_ns.copr_edit_package")
@coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit", methods=["POST"])
-@login_required
-@req_with_copr
-def copr_edit_package_post(copr, package_name):
- url_on_success = url_for("coprs_ns.copr_packages",
- username=copr.owner_name,
- coprname=copr.name)
- return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package", url_on_success=url_on_success)
-
-
@coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit", methods=["POST"])
@login_required
@req_with_copr
-def group_copr_edit_package_post(copr, package_name):
- url_on_success = url_for("coprs_ns.group_copr_packages",
- group_name=copr.group.name,
- coprname=copr.name)
- return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package", url_on_success=url_on_success)
-
-
-def process_edit_package(copr, package_name, view, url_on_success):
- return process_save_package(copr, package_name, view, view_method=render_edit_package,
- url_on_success=url_on_success)
+def copr_edit_package_post(copr, package_name):
+ url_on_success = copr_url("coprs_ns.copr_packages", copr)
+ return process_save_package(copr, package_name, view="coprs_ns.copr_edit_package",
+ view_method=copr_edit_package, url_on_success=url_on_success)
def process_save_package(copr, package_name, view, view_method, url_on_success):
if flask.request.form["source_type"] == "git_and_tito":
form = forms.PackageFormTito()
- form_var = "form_tito"
elif flask.request.form["source_type"] == "mock_scm":
form = forms.PackageFormMock()
- form_var = "form_mock"
else:
raise Exception("Wrong source type")
@@ -147,82 +157,20 @@ def process_save_package(copr, package_name, view, view_method, url_on_success):
return flask.redirect(url_on_success)
- return view_method(copr, package_name, view, **{form_var: form})
-
-
-(a)coprs_ns.route("/<username>/<coprname>/package/<package_name>/rebuild")
-@req_with_copr
-def copr_rebuild_package(copr, package_name):
- return render_copr_rebuild_package(copr, package_name, view="coprs_ns.copr_new_build")
-
-
-(a)coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/rebuild")
-@req_with_copr
-def group_copr_rebuild_package(copr, package_name):
- return render_copr_rebuild_package(copr, package_name, view="coprs_ns.copr_new_build")
-
-
-def render_copr_rebuild_package(copr, package_name, view):
- package = ComplexLogic.get_package_safe(copr, package_name)
- data = package.source_json_dict
+ return view_method(username=copr.owner.name, coprname=copr.name, package_name=package_name)
- if package.source_type_text == "git_and_tito":
- data["git_directory"] = data["git_dir"] # @FIXME workaround
- form = forms.BuildFormTitoFactory
- f = render_add_build_tito
- view_suffix = "_tito"
- elif package.source_type_text == "mock_scm":
- form = forms.BuildFormMockFactory
- f = render_add_build_mock
- view_suffix = "_mock"
- form = form(copr.active_chroots)(data=data)
- return f(copr, form, view=view + view_suffix, package=package)
-
-
-(a)coprs_ns.route("/<username>/<coprname>/package/add")
-@login_required
-@req_with_copr
-def copr_add_package(copr):
- return render_add_package(copr, view="coprs_ns.copr_new_package")
-
-
-(a)coprs_ns.route("/g/<group_name>/<coprname>/package/add")
-@login_required
-@req_with_copr
-def group_copr_add_package(copr):
- return render_add_package(copr, view="coprs_ns.copr_new_package")
-
-
-def render_add_package(copr, package_name=None, view=None, form_tito=None, form_mock=None):
- if not form_tito:
- form_tito = forms.PackageFormTito()
-
- if not form_mock:
- form_mock = forms.PackageFormMock()
- return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None, view=view,
- form_tito=form_tito, form_mock=form_mock)
-
-
-(a)coprs_ns.route("/<username>/<coprname>/package/new", methods=["POST"])
-@login_required
-@req_with_copr
-def copr_new_package(copr):
- url_on_success = url_for("coprs_ns.copr_packages",
- username=copr.owner_name,
- coprname=copr.name)
- return process_new_package(copr, view="coprs_ns.copr_new_package", url_on_success=url_on_success)
-
-
-(a)coprs_ns.route("/g/<group_name>/<coprname>/package/new", methods=["POST"])
-@login_required
-@req_with_copr
-def group_copr_new_package(copr):
- url_on_success = url_for("coprs_ns.group_copr_packages",
- group_name=copr.group.name,
- coprname=copr.name)
- return process_new_package(copr, view="coprs_ns.copr_new_package", url_on_success=url_on_success)
+def copr_url(view, copr, **kwargs):
+ """
+ Examine given copr and generate proper URL for the `view`
+ Values of `username/group_name` and `coprname` are automatically passed as the first two URL parameters,
+ and therefore you should *not* pass them manually.
-def process_new_package(copr, view, url_on_success):
- return process_save_package(copr, None, view, view_method=render_add_package, url_on_success=url_on_success)
+ Usage:
+ copr_url("coprs_ns.foo", copr)
+ copr_url("coprs_ns.foo", copr, arg1='bar', arg2='baz)
+ """
+ if copr.is_a_group_project:
+ return url_for(view, group_name=copr.group.name, coprname=copr.name, **kwargs)
+ return url_for(view, username=copr.owner.name, coprname=copr.name, **kwargs)
8 years, 4 months
[copr] master: [frontend] fix checkboxes in package adding (bd2920b)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit bd2920b593e9058f1c15f7bd41837cec21a47739
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Thu Dec 17 11:06:28 2015 +0100
[frontend] fix checkboxes in package adding
>---------------------------------------------------------------
.../templates/coprs/detail/_package_forms.html | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
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 64b2917..244e8b8 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -20,7 +20,7 @@
</label>
<div class="col-sm-10">
{# @WORKAROUND form.webhook_rebuild(checked=(...)) just didn't work #}
- {% if package.source_type_text == source_type %}
+ {% if source_type in [form.source_type.data, package.source_type_text] %}
{{ form.webhook_rebuild() }}
{% else %}
<input type="checkbox" name="webhook_rebuild" />
8 years, 4 months
[copr] master: fix packaging issues in epel-7+ (c31b3f5)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit c31b3f587e411676482e33492f842f45c0ffe2f6
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Mon Dec 21 01:40:30 2015 +0100
fix packaging issues in epel-7+
>---------------------------------------------------------------
backend/copr-backend.spec | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/backend/copr-backend.spec b/backend/copr-backend.spec
index 50f350f..559a97b 100644
--- a/backend/copr-backend.spec
+++ b/backend/copr-backend.spec
@@ -1,4 +1,4 @@
-%if 0%{?rhel} < 7 && 0%{?rhel} > 0
+%if 0%{?rhel} <= 7 && 0%{?rhel} > 0
%global _pkgdocdir %{_docdir}/%{name}-%{version}
%endif
8 years, 4 months
[copr] master: fixes for epel-6+ and fedora-22+ (875931a)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 875931a8c5efea6f808a35009de8acdb2e03e3a9
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Mon Dec 21 01:40:29 2015 +0100
fixes for epel-6+ and fedora-22+
- missing @pytest.yield_fixture in epel-6
- portable (Python 2.6) format strings
- to_json() hashes do not guarantee item order
>---------------------------------------------------------------
python/copr/client/client.py | 6 ++--
python/copr/client_v2/common.py | 6 ++--
python/copr/client_v2/entities.py | 25 +++++++--------
python/copr/client_v2/handlers.py | 32 ++++++++++----------
python/copr/client_v2/net_client.py | 10 +++---
python/copr/client_v2/resources.py | 4 +-
python/copr/test/client_v2/test_entities.py | 4 +-
python/copr/test/client_v2/test_handlers.py | 2 +-
python/copr/test/client_v2/test_net_client.py | 40 +++++++++++-------------
python/docs/client_v1/Examples.rst | 10 +++---
python/run_tmp.py | 6 ++--
11 files changed, 70 insertions(+), 75 deletions(-)
diff --git a/python/copr/client/client.py b/python/copr/client/client.py
index 01929b1..79f233f 100644
--- a/python/copr/client/client.py
+++ b/python/copr/client/client.py
@@ -93,7 +93,7 @@ class CoprClient(UnicodeMixin):
def __unicode__(self):
return (
- u"<Copr client. username: {}, api url: {}, login presents: {}, token presents: {}>"
+ u"<Copr client. username: {0}, api url: {1}, login presents: {2}, token presents: {3}>"
.format(self.username, self.api_url, bool(self.login), bool(self.token))
)
@@ -211,8 +211,8 @@ class CoprClient(UnicodeMixin):
output = json.loads(response.text)
except ValueError:
raise CoprUnknownResponseException(
- "Unknown response from the server. Code: {}, raw response:"
- " \n {}".format(response.status_code, response.text))
+ "Unknown response from the server. Code: {0}, raw response:"
+ " \n {1}".format(response.status_code, response.text))
if response.status_code != 200:
raise CoprRequestException(output["error"])
diff --git a/python/copr/client_v2/common.py b/python/copr/client_v2/common.py
index 2ccd3ec..bdfe0ba 100644
--- a/python/copr/client_v2/common.py
+++ b/python/copr/client_v2/common.py
@@ -19,7 +19,7 @@ class BuiltPackage(UnicodeMixin):
self.version = version
def __unicode__(self):
- return u"{} {}".format(self.name, self.version)
+ return u"{0} {1}".format(self.name, self.version)
class BuildStateValues(object):
@@ -33,7 +33,7 @@ class BuildStateValues(object):
IMPORTING = "importing"
UNKNOWN = "unknown"
-ALLOWED_BUILD_STATES = {
+ALLOWED_BUILD_STATES = set([
BuildStateValues.FAILED,
BuildStateValues.SUCCEEDED,
BuildStateValues.CANCELED,
@@ -43,4 +43,4 @@ ALLOWED_BUILD_STATES = {
BuildStateValues.STARTING,
BuildStateValues.IMPORTING,
BuildStateValues.UNKNOWN,
-}
+])
diff --git a/python/copr/client_v2/entities.py b/python/copr/client_v2/entities.py
index 9750338..de0ae49 100644
--- a/python/copr/client_v2/entities.py
+++ b/python/copr/client_v2/entities.py
@@ -11,15 +11,14 @@ class Link(UnicodeMixin):
self.href = href
def __unicode__(self):
- return u"<Link: role: {}, href: {}".format(self.role, self.href)
+ return u"<Link: role: {0}, href: {1}".format(self.role, self.href)
@classmethod
def from_dict(cls, data_dict):
- return {
- role_name:
- cls(role_name, definition["href"])
- for role_name, definition in data_dict.items()
- }
+ retval = {}
+ for role_name, definition in data_dict.items():
+ retval[role_name] = cls(role_name, definition["href"])
+ return retval
# pylint: disable=E1101
@@ -46,21 +45,21 @@ class ProjectEntity(Entity):
_schema = ProjectSchema(strict=True)
def __unicode__(self):
- return "<Project #{}: {}/{}>".format(self.id, self.owner, self.name)
+ return "<Project #{0}: {1}/{2}>".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)
+ return "<New project {0}/{1}>".format(self.owner, self.name)
class ProjectChrootEntity(Entity):
_schema = ProjectChrootSchema(strict=True)
def __unicode__(self):
- return "<Project chroot: {}, additional " \
- "packages: {}, comps size if any: {}>"\
+ return "<Project chroot: {0}, additional " \
+ "packages: {1}, comps size if any: {2}>"\
.format(self.name, self.buildroot_pkgs, self.comps_len,)
@@ -68,7 +67,7 @@ class BuildEntity(Entity):
_schema = BuildSchema(strict=True)
def __unicode__(self):
- return "<Build #{} state: {}>".format(self.id, self.state)
+ return "<Build #{0} state: {1}>".format(self.id, self.state)
def is_finished(self):
"""
@@ -87,7 +86,7 @@ class BuildTaskEntity(Entity):
_schema = BuildTaskSchema(strict=True)
def __unicode__(self):
- return "<Build task #{}-{}, state: {}>".format(
+ return "<Build task #{0}-{1}, state: {2}>".format(
self.build_id, self.chroot_name, self.state
)
@@ -96,6 +95,6 @@ class MockChrootEntity(Entity):
_schema = MockChrootSchema(strict=True)
def __unicode__(self):
- return "<Mock chroot: {} is active: {}>".format(
+ return "<Mock chroot: {0} is active: {1}>".format(
self.name, self.is_active
)
diff --git a/python/copr/client_v2/handlers.py b/python/copr/client_v2/handlers.py
index ee745d9..da9fa07 100644
--- a/python/copr/client_v2/handlers.py
+++ b/python/copr/client_v2/handlers.py
@@ -32,7 +32,7 @@ class BuildHandle(AbstractHandle):
def __init__(self, client, nc, root_url, builds_href):
super(BuildHandle, self).__init__(client, nc, root_url)
self.builds_href = builds_href
- self._base_url = "{}{}".format(self.root_url, builds_href)
+ self._base_url = "{0}{1}".format(self.root_url, builds_href)
def get_base_url(self):
return self._base_url
@@ -45,7 +45,7 @@ class BuildHandle(AbstractHandle):
"""
options = {"build_id": build_id}
- url = "{}/{}".format(self.get_base_url(), build_id)
+ url = "{0}/{1}".format(self.get_base_url(), build_id)
response = self.nc.request(url)
return Build.from_response(
handle=self,
@@ -85,7 +85,7 @@ class BuildHandle(AbstractHandle):
build_id = build_entity.id
build_entity.state = "canceled"
- url = "{}/{}".format(self.get_base_url(), build_id)
+ url = "{0}/{1}".format(self.get_base_url(), build_id)
response = self.nc.request(url, data=build_entity.to_json(), method="PUT", do_auth=True)
return OperationResult(self, response)
@@ -97,7 +97,7 @@ class BuildHandle(AbstractHandle):
:rtype: :py:class:`.OperationResult`
"""
- url = "{}/{}".format(self.get_base_url(), build_id)
+ url = "{0}/{1}".format(self.get_base_url(), build_id)
response = self.nc.request(url, method="delete", do_auth=True)
return OperationResult(self, response, expected_status=204)
@@ -212,7 +212,7 @@ class BuildTaskHandle(AbstractHandle):
def __init__(self, client, nc, root_url, build_tasks_href):
super(BuildTaskHandle, self).__init__(client, nc, root_url)
self.build_tasks_href = build_tasks_href
- self._base_url = "{}{}".format(self.root_url, build_tasks_href)
+ self._base_url = "{0}{1}".format(self.root_url, build_tasks_href)
def get_base_url(self):
return self._base_url
@@ -256,7 +256,7 @@ class BuildTaskHandle(AbstractHandle):
:rtype: :py:class:`~.resources.BuildTask`
"""
- url = "{}/{}/{}".format(self.get_base_url(), build_id, chroot_name)
+ url = "{0}/{1}/{2}".format(self.get_base_url(), build_id, chroot_name)
response = self.nc.request(url)
return BuildTask.from_response(
handle=self,
@@ -270,7 +270,7 @@ class ProjectHandle(AbstractHandle):
def __init__(self, client, nc, root_url, projects_href):
super(ProjectHandle, self).__init__(client, nc, root_url)
self.projects_href = projects_href
- self._base_url = "{}{}".format(self.root_url, projects_href)
+ self._base_url = "{0}{1}".format(self.root_url, projects_href)
def get_base_url(self):
return self._base_url
@@ -309,7 +309,7 @@ class ProjectHandle(AbstractHandle):
# "show_chroots": show_chroots
}
- url = "{}/{}".format(self.get_base_url(), project_id)
+ url = "{0}/{1}".format(self.get_base_url(), project_id)
response = self.nc.request(url, query_params=query_params)
return Project.from_response(
handle=self,
@@ -374,7 +374,7 @@ class ProjectHandle(AbstractHandle):
:type project_entity: :py:class:`~.ProjectEntity`
:rtype: OperationResult
"""
- url = "{}/{}".format(self.get_base_url(), project_entity.id)
+ url = "{0}/{1}".format(self.get_base_url(), project_entity.id)
data = project_entity.to_json()
response = self.nc.request(url, method="put", data=data, do_auth=True)
@@ -386,7 +386,7 @@ class ProjectHandle(AbstractHandle):
:param int project_id: project identifier
:rtype: OperationResult
"""
- url = "{}/{}".format(self.get_base_url(), project_id)
+ url = "{0}/{1}".format(self.get_base_url(), project_id)
response = self.nc.request(url, method="delete", do_auth=True)
return OperationResult(self, response, expected_status=204)
@@ -415,7 +415,7 @@ class ProjectChrootHandle(AbstractHandle):
"""
:type project: copr.client_v2.resources.Project
"""
- return "{}{}".format(self.root_url, project.get_href_by_name("chroots"))
+ return "{0}{1}".format(self.root_url, project.get_href_by_name("chroots"))
def get_one(self, project, name):
""" Retrieves project chroot object.
@@ -427,7 +427,7 @@ class ProjectChrootHandle(AbstractHandle):
:rtype: :py:class:`~copr.client_v2.resources.ProjectChroot`
"""
- url = "{}/{}".format(self.get_base_url(project), name)
+ url = "{0}/{1}".format(self.get_base_url(project), name)
response = self.nc.request(url)
return ProjectChroot.from_response(
@@ -460,7 +460,7 @@ class ProjectChrootHandle(AbstractHandle):
:param str name: chroot name to disable
"""
- url = "{}/{}".format(self.get_base_url(project), name)
+ url = "{0}/{1}".format(self.get_base_url(project), name)
response = self.nc.request(url, method="DELETE", do_auth=True)
return OperationResult(self, response)
@@ -498,7 +498,7 @@ class ProjectChrootHandle(AbstractHandle):
:rtype: :py:class:`.OperationResult`
"""
- url = "{}/{}".format(self.get_base_url(project), chroot_entity.name)
+ url = "{0}/{1}".format(self.get_base_url(project), chroot_entity.name)
response = self.nc.request(
url,
method="PUT",
@@ -513,7 +513,7 @@ class MockChrootHandle(AbstractHandle):
def __init__(self, client, nc, root_url, href):
super(MockChrootHandle, self).__init__(client, nc, root_url)
self._href = href
- self._base_url = "{}{}".format(self.root_url, href)
+ self._base_url = "{0}{1}".format(self.root_url, href)
def get_base_url(self):
return self._base_url
@@ -525,7 +525,7 @@ class MockChrootHandle(AbstractHandle):
:rtype: :py:class:`~copr.client_v2.resources.MockChroot`
"""
- url = "{}/{}".format(self.get_base_url(), name)
+ url = "{0}/{1}".format(self.get_base_url(), name)
response = self.nc.get(url)
return MockChroot.from_response(
handle=self,
diff --git a/python/copr/client_v2/net_client.py b/python/copr/client_v2/net_client.py
index f44073d..369b651 100644
--- a/python/copr/client_v2/net_client.py
+++ b/python/copr/client_v2/net_client.py
@@ -34,7 +34,7 @@ class RequestError(Exception, UnicodeMixin):
except (ValueError, AttributeError):
raise ValueError(
"Malformed response, couldn't "
- "get json content, raw:\n{}"
+ "get json content, raw:\n{0}"
.format(self.response.text)
)
@@ -43,10 +43,10 @@ class RequestError(Exception, UnicodeMixin):
return None
def __unicode__(self):
- res = "Error occurred while accessing {}: {}\n".format(
+ res = "Error occurred while accessing {0}: {1}\n".format(
self.url, self.msg)
if self.response is not None:
- res += "code {}: {}\n".format(self.response.status_code, self.response_json["message"])
+ res += "code {0}: {1}\n".format(self.response.status_code, self.response_json["message"])
return res
@@ -58,7 +58,7 @@ class NetworkError(RequestError):
def __unicode__(self):
res = super(NetworkError, self).__unicode__()
- res += u"Original error: {}\n".format(self.requests_error)
+ res += u"Original error: {0}\n".format(self.requests_error)
return res
@@ -134,7 +134,7 @@ class NetClient(object):
if method is None:
method = "get"
elif method.lower() not in ["get", "post", "delete", "put"]:
- raise RequestError("Method {} not allowed".format(method), url)
+ raise RequestError("Method {0} not allowed".format(method), url)
kwargs = {}
headers = headers or {}
diff --git a/python/copr/client_v2/resources.py b/python/copr/client_v2/resources.py
index b4abcc4..b60f207 100644
--- a/python/copr/client_v2/resources.py
+++ b/python/copr/client_v2/resources.py
@@ -116,7 +116,7 @@ class Root(IndividualResource):
"""
:param str resource_name:
"""
- return "{}{}".format(self.root_url, self.get_href_by_name(resource_name))
+ return "{0}{1}".format(self.root_url, self.get_href_by_name(resource_name))
@classmethod
def from_response(cls, response, root_url):
@@ -412,7 +412,7 @@ class OperationResult(IndividualResource):
def __unicode__(self):
out = u"<Result: "
if self._response:
- out += u" status: {}".format(self._response.status_code)
+ out += u" status: {0}".format(self._response.status_code)
out += u">"
return out
diff --git a/python/copr/test/client_v2/test_entities.py b/python/copr/test/client_v2/test_entities.py
index 44b008d..ff00c79 100644
--- a/python/copr/test/client_v2/test_entities.py
+++ b/python/copr/test/client_v2/test_entities.py
@@ -35,6 +35,6 @@ class TestEntities(object):
set([("foo", "baz"), ("bar", 123)])
def test_to_json(self):
- assert self.entity.to_json() == \
- '{"foo": "baz", "bar": 123}'
+ assert self.entity.to_json() == '{"foo": "baz", "bar": 123}' \
+ or self.entity.to_json() == '{"bar": 123, "foo": "baz"}'
diff --git a/python/copr/test/client_v2/test_handlers.py b/python/copr/test/client_v2/test_handlers.py
index 8af03ba..73a4fe3 100644
--- a/python/copr/test/client_v2/test_handlers.py
+++ b/python/copr/test/client_v2/test_handlers.py
@@ -210,4 +210,4 @@ class TestProjectHandle(TestHandleBase):
ca = self.nc.request.call_args
assert ca[1]["method"] == "delete"
- assert ca[0][0] == self.root_url + "/api_2/projects/{}".format(self.project_1_id)
+ assert ca[0][0] == self.root_url + "/api_2/projects/{0}".format(self.project_1_id)
diff --git a/python/copr/test/client_v2/test_net_client.py b/python/copr/test/client_v2/test_net_client.py
index 826452f..80470a1 100644
--- a/python/copr/test/client_v2/test_net_client.py
+++ b/python/copr/test/client_v2/test_net_client.py
@@ -14,12 +14,6 @@ import pytest
from copr.client_v2.net_client import NetClient, RequestError
-(a)pytest.yield_fixture
-def mc_request():
- with mock.patch('copr.client_v2.net_client.request') as handle:
- yield handle
-
-
class TestNetClient(object):
def setup_method(self, method):
@@ -42,20 +36,22 @@ class TestNetClient(object):
self.nc = NetClient()
self.nc_with_auth = NetClient(self.login, self.password)
- def test_get_simple(self, mc_request):
- mc_request.return_value = self.base_response
- res = self.nc.request(self.base_url)
- # import ipdb; ipdb.set_trace()
- assert res.status_code == self.base_response.status_code
- assert res.json == self.content
- assert res.headers == self.base_response.headers
-
- def test_unsupported_method(self, mc_request):
- with pytest.raises(RequestError) as exc_info:
- self.nc.request(self.base_url, method="non_existing_method")
-
- # some coverage for Request error
- assert str(exc_info.value) is not None
- with pytest.raises(ValueError):
+ def test_get_simple(self):
+ with mock.patch('copr.client_v2.net_client.request') as mc_request:
+ mc_request.return_value = self.base_response
+ res = self.nc.request(self.base_url)
# import ipdb; ipdb.set_trace()
- assert exc_info.value.response_json
+ assert res.status_code == self.base_response.status_code
+ assert res.json == self.content
+ assert res.headers == self.base_response.headers
+
+ def test_unsupported_method(self):
+ with mock.patch('copr.client_v2.net_client.request') as mc_request:
+ with pytest.raises(RequestError) as exc_info:
+ self.nc.request(self.base_url, method="non_existing_method")
+
+ # some coverage for Request error
+ assert str(exc_info.value) is not None
+ with pytest.raises(ValueError):
+ # import ipdb; ipdb.set_trace()
+ assert exc_info.value.response_json
diff --git a/python/docs/client_v1/Examples.rst b/python/docs/client_v1/Examples.rst
index 37171e2..d298a8b 100644
--- a/python/docs/client_v1/Examples.rst
+++ b/python/docs/client_v1/Examples.rst
@@ -73,7 +73,7 @@ Work with builds
# retrieve build statuses
for bw in result.builds_list:
- print("{}:{}".format(bw.build_id, bw.handle.get_build_details().status))
+ print("{0}:{1}".format(bw.build_id, bw.handle.get_build_details().status))
# cancel all created build
for bw in result.builds_list:
@@ -81,21 +81,21 @@ Work with builds
# get build status for each chroot
for bw in result.builds_list:
- print("build: {}".format(bw.build_id))
+ print("build: {0}".format(bw.build_id))
for ch, status in bw.handle.get_build_details().data["chroots"].items():
- print("\t chroot {}:\t {}".format(ch, status))
+ print("\t chroot {0}:\t {1}".format(ch, status))
# simple build progress:
import time, datetime
watched = set(result.builds_list)
done = set()
while watched != done:
- print("time: {}".format(datetime.datetime.now()))
+ print("time: {0}".format(datetime.datetime.now()))
for bw in watched:
if bw in done:
continue
status = bw.handle.get_build_details().status
- print("{}: {}".format(bw.build_id, status))
+ print("{0}: {1}".format(bw.build_id, status))
if status in ["skipped", "failed", "succeeded"]:
done.add(bw)
time.sleep(10)
diff --git a/python/run_tmp.py b/python/run_tmp.py
index 780db44..de0d827 100644
--- a/python/run_tmp.py
+++ b/python/run_tmp.py
@@ -23,7 +23,7 @@ def main():
)
def pp(project):
- print("Project: {} id {}, {}\n {}\n{}".format(
+ print("Project: {0} id {1}, {2}\n {3}\n{4}".format(
project.name,
project.id,
project.description,
@@ -145,9 +145,9 @@ if __name__ == "__main__":
main()
except RequestError as err:
log.exception(err)
- log.error("error occurred while fetching: {}, with params: {}"
+ log.error("error occurred while fetching: {0}, with params: {1}"
.format(err.url, err.request_kwargs))
- log.error("status code: {}, message: {} {}"
+ log.error("status code: {0}, message: {1} {2}"
.format(err.response.status_code, err.msg, err.response_json))
except Exception:
log.exception("something went wrong")
8 years, 4 months
[copr] master: fix packaging for epel-6+ and fedora-22+ (e436300)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit e43630081f90f614258e44d123da1ae6627081e0
Author: Pavel Raiskup <praiskup(a)redhat.com>
Date: Mon Dec 21 01:40:28 2015 +0100
fix packaging for epel-6+ and fedora-22+
>---------------------------------------------------------------
cli/copr-cli.spec | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/cli/copr-cli.spec b/cli/copr-cli.spec
index 2b9c6ed..3a38bb5 100644
--- a/cli/copr-cli.spec
+++ b/cli/copr-cli.spec
@@ -1,7 +1,11 @@
-%if 0%{?rhel} < 7 && 0%{?rhel} > 0
+%if 0%{?rhel} > 0
+%if 0%{?rhel} <= 7
%global _pkgdocdir %{_docdir}/%{name}-%{version}
+%endif
+%if 0%{?rhel} <= 6
%global __python2 %{__python}
%endif
+%endif
Name: copr-cli
Version: 1.46
@@ -76,6 +80,7 @@ install -p -m 644 man/copr-cli.1 %{buildroot}/%{_mandir}/man1/
install -p man/copr.1 %{buildroot}/%{_mandir}/man1/
%files
+%{!?_licensedir:%global license %doc}
%license LICENSE
%doc README.rst
%{_bindir}/copr-cli
@@ -86,8 +91,9 @@ install -p man/copr.1 %{buildroot}/%{_mandir}/man1/
%if 0%{?fedora}
-%license LICENSE
%files doc
+%{!?_licensedir:%global license %doc}
+%license LICENSE
%endif
%changelog
8 years, 4 months
[copr] master: fix 1286797 - failing validation on project edit (11f9497)
by clime@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 11f9497dab2900d94e7ebea118e910ba95337aa0
Author: clime <clime(a)redhat.com>
Date: Sun Dec 20 02:23:51 2015 +0100
fix 1286797 - failing validation on project edit
>---------------------------------------------------------------
.../coprs/views/coprs_ns/coprs_general.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
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 b523427..63ee45f 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -461,7 +461,7 @@ def copr_update(copr):
process_copr_update(copr, form)
return flask.redirect(url_for_copr_details(copr))
else:
- return copr_edit(copr.owner.username, copr.name, form)
+ return render_copr_edit(copr, form, 'coprs_ns.copr_update')
@coprs_ns.route("/<username>/<coprname>/permissions_applier_change/",
8 years, 4 months
[copr] master: [frontend] show flash messages when editing packages (fb9b43a)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit fb9b43aadee67319542172749451b8c57f4a9057
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Wed Dec 16 18:17:55 2015 +0100
[frontend] show flash messages when editing packages
>---------------------------------------------------------------
.../coprs/views/coprs_ns/coprs_packages.py | 28 ++++++++++++++++---
1 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index de185a1..55f3639 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -1,6 +1,7 @@
import flask
import json
+from flask import url_for
from coprs import db
from coprs import forms
from coprs import helpers
@@ -9,6 +10,8 @@ from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_
from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr
from coprs.logic.complex_logic import ComplexLogic
from coprs.logic.packages_logic import PackagesLogic
+from coprs.exceptions import (ActionInProgressException,
+ InsufficientRightsException,)
@coprs_ns.route("/<username>/<coprname>/packages/")
@@ -79,14 +82,21 @@ def render_edit_package(copr, package_name, view, form_tito=None, form_mock=None
@login_required
@req_with_copr
def copr_edit_package_post(copr, package_name):
- return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package")
+ url_on_success = url_for("coprs_ns.copr_packages",
+ username=copr.owner_name,
+ coprname=copr.name)
+ return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package", url_on_success=url_on_success)
@coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit", methods=["POST"])
@login_required
@req_with_copr
def group_copr_edit_package_post(copr, package_name):
- return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package")
+ url_on_success = url_for("coprs_ns.group_copr_packages",
+ group_name=copr.group.name,
+ coprname=copr.name)
+ return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package", url_on_success=url_on_success)
+
def process_edit_package(copr, package_name, view):
@@ -117,10 +127,18 @@ def process_edit_package(copr, package_name, view):
"scm_branch": form.scm_branch.data,
"spec": form.spec.data})
- db.session.add(package)
- db.session.commit()
+ try:
+ db.session.add(package)
+ db.session.commit()
+ except (ActionInProgressException, InsufficientRightsException) as e:
+ db.session.rollback()
+ flask.flash(str(e), "error")
+ else:
+ flask.flash("Package successfully saved" if package_name else "New package has been created.")
+
+ return flask.redirect(url_on_success)
- return render_edit_package(copr, package_name, view, **{form_var: form})
+ return view_method(copr, package_name, view, **{form_var: form})
@coprs_ns.route("/<username>/<coprname>/package/<package_name>/rebuild")
8 years, 4 months
[copr] master: [frontend] implement packages adding (8e19dca)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 8e19dca8e30ab50d726535c978323f75895e8c83
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Wed Dec 16 18:10:45 2015 +0100
[frontend] implement packages adding
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/forms.py | 3 +
.../templates/coprs/detail/_package_forms.html | 10 +++-
.../coprs/templates/coprs/detail/add_package.html | 34 +++++++++++
.../coprs/templates/coprs/detail/packages.html | 5 ++
.../coprs/views/coprs_ns/coprs_packages.py | 60 +++++++++++++++++++-
5 files changed, 108 insertions(+), 4 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py
index 0093909..506e90b 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -315,6 +315,9 @@ class BuildFormRebuildFactory(object):
class BasePackageForm(wtf.Form):
+ package_name = wtforms.StringField(
+ "Package Name",
+ validators=[wtforms.validators.DataRequired()])
webhook_rebuild = wtforms.BooleanField(default=False)
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 4fa7f3a..64b2917 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -2,8 +2,14 @@
{% macro copr_package_form_begin(form, view, copr, package) %}
{{ render_form_errors(form) }}
- <form class="form-horizontal"
- action="{{ copr_url(view, copr, package_name=package.name) }}" method="post" enctype="multipart/form-data">
+ {% if not package.name %} {# Add package #}
+ <form class="form-horizontal" action="{{ copr_url(view, copr) }}" method="post" enctype="multipart/form-data">
+ {{ render_field(form.package_name) }}
+ {% else %} {# Edit package #}
+ <form class="form-horizontal" action="{{ copr_url(view, copr, package_name=package.name) }}"
+ method="post" enctype="multipart/form-data">
+ <input type="hidden" name="package_name" value="{{ package.name }}" />
+ {% endif %}
{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html
new file mode 100644
index 0000000..b12f00b
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html
@@ -0,0 +1,34 @@
+{% extends "coprs/detail.html" %}
+{% from "coprs/detail/_package_forms.html" import copr_package_form_tito, copr_package_form_mock with context %}
+
+{% block title %}New package in {{ copr.owner.name }}/{{ copr.name }}{% endblock %}
+{%block project_breadcrumb %}
+ <li><a href="{{ copr_url('coprs_ns.copr_packages', copr) }}">Packages</a></li>
+ <li class="active">New</li>
+{%endblock%}
+
+{% block detail_body %}
+
+<h2>Add Package</h2>
+
+<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 {{ badge('git_and_tito') }}</h3>
+ {{ copr_package_form_tito(form_tito, view, copr, package) }}
+</div>
+
+<hr>
+
+<div class="clearfix">
+ <h3>Mock {{ badge('mock_scm') }}</h3>
+ {{ copr_package_form_mock(form_mock, view, copr, package) }}
+</div>
+
+{% endblock %}
\ No newline at end of file
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/packages.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/packages.html
index 1c62628..3e1e250 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/packages.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/packages.html
@@ -15,6 +15,11 @@
{% block detail_body %}
<h2>Project Packages</h2>
+{% if g.user and g.user.can_edit(copr) %}
+ <a class="btn btn-primary pull-right" href="{{ copr_url('coprs_ns.copr_add_package', copr) }}">New package</a>
+{% endif %}
+
+<p>This view shows all packages in the project</p>
{{ packages_table(packages) }}
{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index 55f3639..70aa034 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -98,8 +98,12 @@ def group_copr_edit_package_post(copr, package_name):
return process_edit_package(copr, package_name, view="coprs_ns.copr_edit_package", url_on_success=url_on_success)
+def process_edit_package(copr, package_name, view, url_on_success):
+ return process_save_package(copr, package_name, view, view_method=render_edit_package,
+ url_on_success=url_on_success)
-def process_edit_package(copr, package_name, view):
+
+def process_save_package(copr, package_name, view, view_method, url_on_success):
if flask.request.form["source_type"] == "git_and_tito":
form = forms.PackageFormTito()
form_var = "form_tito"
@@ -110,7 +114,11 @@ def process_edit_package(copr, package_name, view):
raise Exception("Wrong source type")
if form.validate_on_submit():
- package = PackagesLogic.get(copr.id, package_name).first()
+ if package_name:
+ package = PackagesLogic.get(copr.id, package_name).first()
+ else:
+ package = PackagesLogic.add(flask.app.g.user, copr, form.package_name.data)
+
package.source_type = helpers.BuildSourceEnum(form.source_type.data)
package.webhook_rebuild = form.webhook_rebuild.data
@@ -169,3 +177,51 @@ def render_copr_rebuild_package(copr, package_name, view):
form = form(copr.active_chroots)(data=data)
return f(copr, form, view=view + view_suffix, package=package)
+
+
+(a)coprs_ns.route("/<username>/<coprname>/package/add")
+@login_required
+@req_with_copr
+def copr_add_package(copr):
+ return render_add_package(copr, view="coprs_ns.copr_new_package")
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/add")
+@login_required
+@req_with_copr
+def group_copr_add_package(copr):
+ return render_add_package(copr, view="coprs_ns.copr_new_package")
+
+
+def render_add_package(copr, package_name=None, view=None, form_tito=None, form_mock=None):
+ if not form_tito:
+ form_tito = forms.PackageFormTito()
+
+ if not form_mock:
+ form_mock = forms.PackageFormMock()
+ return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None, view=view,
+ form_tito=form_tito, form_mock=form_mock)
+
+
+(a)coprs_ns.route("/<username>/<coprname>/package/new", methods=["POST"])
+@login_required
+@req_with_copr
+def copr_new_package(copr):
+ url_on_success = url_for("coprs_ns.copr_packages",
+ username=copr.owner_name,
+ coprname=copr.name)
+ return process_new_package(copr, view="coprs_ns.copr_new_package", url_on_success=url_on_success)
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/package/new", methods=["POST"])
+@login_required
+@req_with_copr
+def group_copr_new_package(copr):
+ url_on_success = url_for("coprs_ns.group_copr_packages",
+ group_name=copr.group.name,
+ coprname=copr.name)
+ return process_new_package(copr, view="coprs_ns.copr_new_package", url_on_success=url_on_success)
+
+
+def process_new_package(copr, view, url_on_success):
+ return process_save_package(copr, None, view, view_method=render_add_package, url_on_success=url_on_success)
8 years, 4 months
[copr] master: [frontend] be able to print packages without builds (950941e)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 950941e03dc8c00e1617d5038963842ac3c963e9
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Wed Dec 16 18:19:06 2015 +0100
[frontend] be able to print packages without builds
>---------------------------------------------------------------
.../templates/coprs/detail/_packages_table.html | 23 +++++++++++++-------
.../coprs/views/coprs_ns/coprs_packages.py | 3 +-
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_packages_table.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_packages_table.html
index 0275871..a5d71df 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_packages_table.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_packages_table.html
@@ -15,28 +15,35 @@
</thead>
<tbody>
{% for package in packages %}
+ {% set build = package.builds[-1] if package.builds else empty_build %}
<tr>
<td data-order="{{ package.name }}">
<a href="{{ copr_url('coprs_ns.copr_package', copr, package_name=package.name) }}">{{ package.name }}</a>
</td>
- <td data-order="{{ package.builds[-1].version }}">
- {% if package.builds[-1].pkg_version %}
- {{ build.pkg_version}}
+ <td data-order="{{ build.pkg_version }}">
+ {% if build.pkg_version %}
+ {{ build.pkg_version }}
{% else %}
-
{% endif %}
</td>
- <td data-order="{{ package.builds[-1].submitted_on }}">
- {{ package.builds[-1].submitted_on|time_ago() }} ago
+ <td data-order="{{ build.submitted_on }}">
+ {% if build.submitted_on %}
+ {{ build['submitted_on']|time_ago() }} ago
+ {% else %}
+ -
+ {% endif %}
</td>
- {% if package.builds[-1].canceled %}
+ {% if build.canceled %}
<td class="build-canceled">canceled</td>
+ {% elif not build.status %}
+ <td>-</td>
{% else %}
- <td class="build-{{ package.builds[-1].status | state_from_num }}"
- abbr="{{package.builds[-1].status | state_from_num | build_state_description}}">{{ package.builds[-1].status | state_from_num }}</td>
+ <td class="build-{{ build.status | state_from_num }}"
+ abbr="{{ build.status | state_from_num | build_state_description}}">{{ build.status | state_from_num }}</td>
{% endif %}
<td data-order="{{ package.webhook_rebuild }}">
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index 70aa034..05bfd92 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -5,6 +5,7 @@ from flask import url_for
from coprs import db
from coprs import forms
from coprs import helpers
+from coprs.models import Package, Build
from coprs.views.coprs_ns import coprs_ns
from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_build_mock
from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr
@@ -28,7 +29,7 @@ def group_copr_packages(copr):
def render_packages(copr):
packages = PackagesLogic.get_all(copr.id)
- return flask.render_template("coprs/detail/packages.html", packages=packages, copr=copr)
+ return flask.render_template("coprs/detail/packages.html", packages=packages, copr=copr, empty_build=Build())
@coprs_ns.route("/<username>/<coprname>/package/<package_name>/")
8 years, 4 months