Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit a2da078a7a0fd6433a271d7dcbcf5730c839124b
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Nov 23 19:14:02 2015 +0100
[frontend] possibility to set default source for the package
---------------------------------------------------------------
frontend/coprs_frontend/coprs/forms.py | 63 ++++++++++++++++
.../templates/coprs/detail/_package_forms.html | 64 ++++++++++++++++
.../coprs/templates/coprs/detail/package.html | 5 +
.../coprs/templates/coprs/detail/package_edit.html | 24 ++++++
.../coprs/views/coprs_ns/coprs_builds.py | 78 +++++++++++++++++++-
5 files changed, 233 insertions(+), 1 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/forms.py
b/frontend/coprs_frontend/coprs/forms.py
index f0aa6bc..43c0d87 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -546,6 +546,69 @@ class BuildFormRebuildFactory(object):
return F
+class PackageFormTitoFactory(object):
+ @staticmethod
+ def create_form_cls():
+ class F(wtf.Form):
+ source_type = wtforms.HiddenField(
+ "Source Type",
+ validators=[wtforms.validators.AnyOf(["git_and_tito"])])
+
+ git_url = wtforms.StringField(
+ "Git URL",
+ validators=[
+ wtforms.validators.DataRequired(),
+ wtforms.validators.URL()])
+
+ git_directory = wtforms.StringField(
+ "Git Directory",
+ validators=[
+ wtforms.validators.Optional()])
+
+ git_branch = wtforms.StringField(
+ "Git Branch",
+ validators=[
+ wtforms.validators.Optional()])
+
+ tito_test = wtforms.BooleanField(default=False)
+
+ return F
+
+
+class PackageFormMockFactory(object):
+ @staticmethod
+ def create_form_cls():
+ class F(wtf.Form):
+ source_type = wtforms.HiddenField(
+ "Source Type",
+ validators=[wtforms.validators.AnyOf(["mock_scm"])])
+
+ scm_type = wtforms.SelectField(
+ "SCM Type",
+ choices=[("git", "Git"), ("svn",
"SVN")])
+
+ scm_url = wtforms.StringField(
+ "SCM URL",
+ validators=[
+ wtforms.validators.DataRequired(),
+ wtforms.validators.URL()])
+
+ scm_branch = wtforms.StringField(
+ "Git Branch",
+ validators=[
+ wtforms.validators.Optional()])
+
+ spec = wtforms.StringField(
+ "Spec File",
+ validators=[
+ wtforms.validators.Regexp(
+ "^.+\.spec$",
+ message="RPM spec file must end with .spec"
+ )])
+
+ return F
+
+
class ChrootForm(wtf.Form):
"""
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
new file mode 100644
index 0000000..037dfb2
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -0,0 +1,64 @@
+{% from "_helpers.html" import render_field, render_form_errors %}
+
+{% macro copr_package_form_begin(form, view, copr, package) %}
+ {{ render_form_errors(form) }}
+ {% if not build %}
+ <form class="form-horizontal"
+ action="
+ {% if copr.is_a_group_project %}
+ {{ url_for(view, group_name=copr.group.name, coprname=copr.name,
package_name=package.name) }}
+ {% else %}
+ {{ url_for(view, username=copr.owner.name, coprname=copr.name,
package_name=package.name) }}
+ {% endif %}"
+ method="post" enctype="multipart/form-data">
+ {% else %}
+ <form class="form-horizontal"
+ action="
+ {% if copr.is_a_group_project %}
+ {{ url_for(view, group_name=copr.group.name, coprname=copr.name,
package_name=package.name) }}
+ {% else %}
+ {{ url_for(view, username=copr.owner.name, coprname=copr.name,
package_name=package.name) }}
+ {% endif %}"
+ method="post" enctype="multipart/form-data">
+ {% endif %}
+{% endmacro %}
+
+
+{% macro copr_package_form_end(form) %}
+ {{ form.csrf_token }}
+ <input class="btn btn-primary pull-right" type="submit"
value="Submit">
+</form>
+{% endmacro %}
+
+
+{% macro copr_package_form_tito(form, view, copr, package) %}
+ {{ copr_package_form_begin(form, view, copr, package) }}
+
+ {{ render_field(form.git_url, placeholder="Public clone URL of your git
repository.") }}
+ {{ render_field(form.git_directory, placeholder="Optional - A directory in the git
containing the spec file.") }}
+ {{ render_field(form.git_branch, placeholder="Optional - A Git branch you want to
build from.") }}
+ <div class="form-group">
+ <label class="col-sm-2 control-label"
for="textInput-markup">
+ Tito Options
+ </label>
+ <div class="col-sm-10">
+ {{ form.tito_test() }} Build with the --test option. (build the last commit instead
of the last release tag)
+ </div>
+ </div>
+ <input type="hidden" name="source_type"
value="git_and_tito" />
+
+ {{ copr_package_form_end(form) }}
+{% endmacro %}
+
+
+{% macro copr_package_form_mock(form, view, copr, package) %}
+ {{ copr_package_form_begin(form, view, copr, package) }}
+
+ {{ render_field(form.scm_type) }}
+ {{ render_field(form.scm_url, placeholder="URL to your Git or SVN
repository") }}
+ {{ render_field(form.spec, placeholder="Path from repository root directory to
your .spec file") }}
+ {{ 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) }}
+{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
b/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
index fcbaf01..6464f44 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
@@ -28,6 +28,11 @@
</a>
</dd>
{% endif %}
+ <dt>Default source type:</dt>
+ <dd>
+ {{ package.source_type_text | build_source_description }}
+ <a href="{{ url_for('coprs_ns.copr_package_edit',
username=package.copr.owner.name, coprname=package.copr.name, package_name=package.name)
}}">[edit]</a>
+ </dd>
</dl>
{#
<h3> Default Package Source </h3>
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
new file mode 100644
index 0000000..e35f020
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
@@ -0,0 +1,24 @@
+{% extends "coprs/detail.html" %}
+{% from "coprs/detail/_package_forms.html" import copr_package_form_tito,
copr_package_form_mock with context %}
+
+{% block title %}Package {{ package.name }} in {{ package.copr.owner.name }}/{{
package.copr.name }}{% endblock %}
+
+{% block detail_body %}
+
+<h2> Package: {{ package.name }} </h2>
+
+<p>You can choose and configure <b>exactly one</b> default source for
the {{ package.name }} package.</p>
+
+<div class="clearfix">
+ <h3>Tito</h3>
+ {{ copr_package_form_tito(form_tito, 'coprs_ns.copr_package_edit_post', copr,
package) }}
+</div>
+
+<hr>
+
+<div class="clearfix">
+ <h3>Mock</h3>
+ {{ copr_package_form_mock(form_mock, 'coprs_ns.copr_package_edit_post', copr,
package) }}
+</div>
+
+{% endblock %}
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 96187b2..3762843 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -15,7 +15,7 @@ from coprs import helpers
from coprs.logic import builds_logic
from coprs.logic import coprs_logic
-from coprs.logic import packages_logic
+from coprs.logic.packages_logic import PackagesLogic
from coprs.logic.builds_logic import BuildsLogic
from coprs.logic.complex_logic import ComplexLogic
@@ -106,6 +106,82 @@ def render_package(copr, package_name):
return flask.render_template("coprs/detail/package.html", package=package,
copr=copr)
+@coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit")
+@req_with_copr
+def copr_package_edit(copr, package_name):
+ return render_package_edit(copr, package_name)
+
+
+@coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit")
+@req_with_copr
+def group_copr_package_edit(copr, package_name):
+ return render_package_edit(copr, package_name)
+
+
+def render_package_edit(copr, package_name, form_tito=None, form_mock=None):
+ package = ComplexLogic.get_package_safe(copr, package_name)
+ 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,
+ form_mock=form_mock)
+
+
+@coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit",
methods=["POST"])
+@login_required
+@req_with_copr
+def copr_package_edit_post(copr, package_name):
+ return process_package_edit(copr, package_name)
+
+
+@coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit",
methods=["POST"])
+@login_required
+@req_with_copr
+def group_package_edit_post(copr, package_name): # @TODO Merge with
copr_package_edit_post ?
+ return process_package_edit(copr, package_name)
+
+
+def process_package_edit(copr, package_name):
+ if request.form["source_type"] == "git_and_tito":
+ form = forms.PackageFormTitoFactory
+ form_var = "form_tito"
+ elif request.form["source_type"] == "mock_scm":
+ form = forms.PackageFormMockFactory
+ form_var = "form_mock"
+ else:
+ raise Exception("Wrong source type")
+ form = form.create_form_cls()()
+
+ if form.validate_on_submit():
+ package = PackagesLogic.get(copr.id, package_name).first()
+ package.source_type = helpers.BuildSourceEnum(form.source_type.data)
+
+ if package.source_type == helpers.BuildSourceEnum("git_and_tito"):
+ package.source_json = json.dumps({
+ "git_url": form.git_url.data,
+ "git_branch": form.git_branch.data,
+ "git_dir": form.git_directory.data,
+ "tito_test": form.tito_test.data})
+ elif package.source_type == helpers.BuildSourceEnum("mock_scm"):
+ package.source_json = json.dumps({
+ "scm_type": form.scm_type.data,
+ "scm_url": form.scm_url.data,
+ "scm_branch": form.scm_branch.data,
+ "spec": form.spec.data})
+
+ db.session.add(package)
+ db.session.commit()
+
+ return render_package_edit(copr, package_name, **{form_var: form})
+
+
@coprs_ns.route("/<username>/<coprname>/add_build/")
@login_required
@req_with_copr