[copr] master: use https for gravatar urls (f5dfd1d)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit f5dfd1da52fda1f333440567eff4dd60f35dc963
Author: Miroslav Suchý <miroslav(a)suchy.cz>
Date: Tue Apr 1 19:02:05 2014 +0200
use https for gravatar urls
to avoid browser warnings about some resources not being secure since we will default to https
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/models.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index b4ac6ed..db4968a 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -120,7 +120,7 @@ class User(db.Model, helpers.Serializer):
"""
try:
- return libravatar_url(email=self.mail)
+ return libravatar_url(email=self.mail, https=True)
except IOError:
return ""
10 years
[copr] master: We can choose chroots for new builds (3c82230)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 3c8223055db261296d038dbcd03ee66f66287cc8
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Mon Mar 31 10:13:35 2014 +0200
We can choose chroots for new builds
>---------------------------------------------------------------
cli/copr_cli/main.py | 4 +-
cli/copr_cli/subcommands.py | 6 ++-
frontend/coprs_frontend/coprs/forms.py | 65 +++++++++++++------
.../coprs_frontend/coprs/logic/builds_logic.py | 9 ++-
frontend/coprs_frontend/coprs/static/copr.css | 6 ++
.../templates/coprs/detail/_builds_forms.html | 25 +++++++-
.../coprs/views/api_ns/api_general.py | 11 +++-
.../coprs/views/coprs_ns/coprs_builds.py | 18 ++++-
8 files changed, 111 insertions(+), 33 deletions(-)
diff --git a/cli/copr_cli/main.py b/cli/copr_cli/main.py
index f20cf18..35cf03f 100644
--- a/cli/copr_cli/main.py
+++ b/cli/copr_cli/main.py
@@ -19,7 +19,7 @@ def action_build(args):
"""
subcommands.build(args.copr, args.pkgs,
- args.memory, args.timeout, not args.nowait)
+ args.memory, args.timeout, not args.nowait, chroots=args.chroots)
def action_create(args):
@@ -106,6 +106,8 @@ def setup_parser():
)
parser_build.add_argument("pkgs", nargs="+",
help="URL of packages to build")
+ parser_build.add_argument("--chroot", dest="chroots", action="append",
+ help="If you don't need this build for all the project's chroots - you can use it several times for each chroot.")
parser_build.add_argument("--memory", dest="memory",
help="")
parser_build.add_argument("--timeout", dest="timeout",
diff --git a/cli/copr_cli/subcommands.py b/cli/copr_cli/subcommands.py
index 2bf0f34..36c681e 100644
--- a/cli/copr_cli/subcommands.py
+++ b/cli/copr_cli/subcommands.py
@@ -200,7 +200,7 @@ def cancel(build_id):
else:
return (False, output["error"])
-def build(copr, pkgs, memory, timeout, wait=True, result=None):
+def build(copr, pkgs, memory, timeout, wait=True, result=None, chroots=[]):
""" Build a new package into a given copr.
Result is dictionary where is returned "errmsg" in case of error.
@@ -226,6 +226,10 @@ def build(copr, pkgs, memory, timeout, wait=True, result=None):
"timeout": timeout
}
+ if chroots:
+ for chroot in chroots:
+ data[chroot] = "y"
+
req = requests.post(URL,
auth=(user["login"], user["token"]),
data=data)
diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py
index 6d77974..691610a 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -167,29 +167,52 @@ class CoprDeleteForm(wtf.Form):
])
-class BuildForm(wtf.Form):
- pkgs = wtforms.TextAreaField(
- "Pkgs",
- validators=[
- wtforms.validators.Required(),
- UrlListValidator()],
- filters=[StringListFilter()])
+class BuildFormFactory(object):
+ @staticmethod
+ def create_form_cls(active_chroots):
+ class F(wtf.Form):
+ @property
+ def selected_chroots(self):
+ selected = []
+ for ch in self.chroots_list:
+ if getattr(self, ch).data:
+ selected.append(ch)
+ return selected
- memory_reqs = wtforms.IntegerField(
- "Memory requirements",
- validators=[
- wtforms.validators.NumberRange(
- min=constants.MIN_BUILD_MEMORY,
- max=constants.MAX_BUILD_MEMORY)],
- default=constants.DEFAULT_BUILD_MEMORY)
+ pkgs = wtforms.TextAreaField(
+ "Pkgs",
+ validators=[
+ wtforms.validators.Required(),
+ UrlListValidator()],
+ filters=[StringListFilter()])
- timeout = wtforms.IntegerField(
- "Timeout",
- validators=[
- wtforms.validators.NumberRange(
- min=constants.MIN_BUILD_TIMEOUT,
- max=constants.MAX_BUILD_TIMEOUT)],
- default=constants.DEFAULT_BUILD_TIMEOUT)
+ memory_reqs = wtforms.IntegerField(
+ "Memory requirements",
+ validators=[
+ wtforms.validators.NumberRange(
+ min=constants.MIN_BUILD_MEMORY,
+ max=constants.MAX_BUILD_MEMORY)],
+ default=constants.DEFAULT_BUILD_MEMORY)
+
+ timeout = wtforms.IntegerField(
+ "Timeout",
+ validators=[
+ wtforms.validators.NumberRange(
+ min=constants.MIN_BUILD_TIMEOUT,
+ max=constants.MAX_BUILD_TIMEOUT)],
+ default=constants.DEFAULT_BUILD_TIMEOUT)
+
+ F.chroots_list = map(lambda x: x.name, active_chroots)
+ F.chroots_list.sort()
+ F.chroots_sets = {}
+ for ch in F.chroots_list:
+ setattr(F, ch, wtforms.BooleanField(ch, default=True))
+ if ch[0] in F.chroots_sets:
+ F.chroots_sets[ch[0]].append(ch)
+ else:
+ F.chroots_sets[ch[0]] = [ch]
+
+ return F
class ChrootForm(wtf.Form):
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index a6e234c..ba6dac7 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -68,7 +68,7 @@ class BuildsLogic(object):
@classmethod
def add(cls, user, pkgs, copr,
- repos=None, memory_reqs=None, timeout=None):
+ repos=None, memory_reqs=None, timeout=None, chroots=[]):
coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action(
user, copr,
@@ -95,9 +95,12 @@ class BuildsLogic(object):
db.session.add(build)
- # add BuildChroot object for each active chroot
+ # add BuildChroot object for each active (or selected) chroot
# this copr is assigned to
- for chroot in copr.active_chroots:
+ if not chroots:
+ chroots = copr.active_chroots
+
+ for chroot in chroots:
buildchroot = models.BuildChroot(
build=build,
mock_chroot=chroot)
diff --git a/frontend/coprs_frontend/coprs/static/copr.css b/frontend/coprs_frontend/coprs/static/copr.css
index 4262b64..9607491 100644
--- a/frontend/coprs_frontend/coprs/static/copr.css
+++ b/frontend/coprs_frontend/coprs/static/copr.css
@@ -242,6 +242,12 @@ dt.field-label {
font-weight: bold;
}
+dl.field-label-help {
+ margin-top: -15px;
+ margin-bottom: 15px;
+ color: #777;
+}
+
input.rounded {
padding-left: 4px;
border-radius: 10px;
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
index f6b7bd2..7331575 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
@@ -3,12 +3,35 @@
{% macro copr_build_form(form, view, copr) %}
<form action="{{ url_for(view, username=copr.owner.name, coprname=copr.name) }}" method="post">
<dl>
+ <dt class="field-label">Build for all project's chroots?</dt>
+ <dl class="field-label-help"> Applies just to these builds and will not cause any change to your project. </dl>
+
+ {% if form._mock_chroots_error %}
+ <p class="form-error">{{ form._mock_chroots_error }}</p>
+ {% endif %}
+
+ {% for group_set, chs in form.chroots_sets.items() %}
+ <table class="chroots-set">
+ {% for ch in chs %}
+ <tr>
+ <td>
+ {{ form|attr(ch)|attr('label') }}
+ {% if form|attr(ch)|attr('label') %}
+ {% else %}
+ {{ form|attr(ch)|attr('label') }}
+ {% endif %}
+ </td><td>{{ form|attr(ch) }}
+ </td>
+ </tr>
+ {% endfor %}
+ </table>
+ {% endfor %}
{{ form.csrf_token }}
{{ render_field(form.pkgs, label='URLs of packages to build', rows = 10, cols = 50) }}
{% if g.user.proven %}
{{ render_field(form.memory_reqs) }}
{{ render_field(form.timeout) }}
- {% else %} {# once we pass the hidden attribute, the field will just be hidden, it seems #}
+ {% else %} {# once we pass the hidden attribute, the field will just be hidden, it seems #}
{{ render_field(form.memory_reqs, hidden = True) }}
{{ render_field(form.timeout, hidden = True) }}
{% endif %}
diff --git a/frontend/coprs_frontend/coprs/views/api_ns/api_general.py b/frontend/coprs_frontend/coprs/views/api_ns/api_general.py
index 417b7fb..d50cc3d 100644
--- a/frontend/coprs_frontend/coprs/views/api_ns/api_general.py
+++ b/frontend/coprs_frontend/coprs/views/api_ns/api_general.py
@@ -198,7 +198,6 @@ def api_coprs_by_owner_detail(username, coprname):
@api_ns.route("/coprs/<username>/<coprname>/new_build/", methods=["POST"])
@api_login_required
def copr_new_build(username, coprname):
- form = forms.BuildForm(csrf_enabled=False)
copr = coprs_logic.CoprsLogic.get(flask.g.user, username,
coprname).first()
httpcode = 200
@@ -208,16 +207,24 @@ def copr_new_build(username, coprname):
httpcode = 500
else:
+ form = forms.BuildFormFactory.create_form_cls(
+ copr.active_chroots)(csrf_enabled=False)
if form.validate_on_submit() and flask.g.user.can_build_in(copr):
# we're checking authorization above for now
# and also creating separate build for each package
pkgs=form.pkgs.data.replace('\n', ' ').split(" ")
ids = []
+ chroots = []
+ for chroot in copr.active_chroots:
+ if chroot.name in form.selected_chroots:
+ chroots.append(chroot)
+
for pkg in pkgs:
build = builds_logic.BuildsLogic.add(
user=flask.g.user,
pkgs=pkg,
- copr=copr)
+ copr=copr,
+ chroots=chroots)
if flask.g.user.proven:
build.memory_reqs = form.memory_reqs.data
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 8231050..e6a2fa5 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -45,7 +45,7 @@ def copr_add_build(username, coprname, form=None):
"Copr with name {0} does not exist.".format(coprname))
if not form:
- form = forms.BuildForm()
+ form = forms.BuildFormFactory.create_form_cls(copr.active_chroots)()
return flask.render_template("coprs/detail/add_build.html",
copr=copr,
@@ -55,18 +55,28 @@ def copr_add_build(username, coprname, form=None):
@coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
@login_required
def copr_new_build(username, coprname):
- form = forms.BuildForm()
copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
if not copr:
return page_not_found(
"Copr with name {0} does not exist.".format(coprname))
+ form = forms.BuildFormFactory.create_form_cls(copr.active_chroots)()
+
if form.validate_on_submit():
try:
pkgs = pkgs=form.pkgs.data.replace("\n", " ").split(" ")
+ chroots = []
+ for chroot in copr.active_chroots:
+ if chroot.name in form.selected_chroots:
+ chroots.append(chroot)
+
for pkg in pkgs:
- build = builds_logic.BuildsLogic.add(user=flask.g.user,
- pkgs=pkg, copr=copr)
+ build = builds_logic.BuildsLogic.add(
+ user=flask.g.user,
+ pkgs=pkg,
+ copr=copr,
+ chroots = chroots)
+
if flask.g.user.proven:
build.memory_reqs = form.memory_reqs.data
build.timeout = form.timeout.data
10 years