aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models.py33
-rw-r--r--app/templates/macros/forms.html19
-rw-r--r--app/templates/packages/create_edit.html3
-rw-r--r--app/views/packages/__init__.py10
4 files changed, 64 insertions, 1 deletions
diff --git a/app/models.py b/app/models.py
index d715994..ea8bb18 100644
--- a/app/models.py
+++ b/app/models.py
@@ -410,6 +410,39 @@ class MetaPackage(db.Model):
def __str__(self):
return self.name
+ @staticmethod
+ def ListToSpec(list):
+ return ",".join([str(x) for x in list])
+
+ @staticmethod
+ def SpecToList(spec, cache={}):
+ retval = []
+ arr = spec.split(",")
+
+ import re
+ pattern = re.compile("^([a-z0-9_]+)$")
+
+ for x in arr:
+ x = x.strip()
+ if x == "":
+ continue
+
+ if not pattern.match(x):
+ continue
+
+ mp = cache.get(x)
+ if mp is None:
+ mp = MetaPackage.query.filter_by(name=x).first()
+
+ if mp is None:
+ mp = MetaPackage(x)
+ db.session.add(mp)
+
+ cache[x] = mp
+ retval.append(mp)
+
+ return retval
+
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True, nullable=False)
diff --git a/app/templates/macros/forms.html b/app/templates/macros/forms.html
index b23711a..e0ad2de 100644
--- a/app/templates/macros/forms.html
+++ b/app/templates/macros/forms.html
@@ -39,6 +39,25 @@
</div>
{% endmacro %}
+{% macro render_mpackage_field(field, label=None, label_visible=true, right_url=None, right_label=None) -%}
+ <div class="form-group {% if field.errors %}has-error{% endif %} {{ kwargs.pop('class_', '') }}">
+ {% if field.type != 'HiddenField' and label_visible %}
+ {% if not label %}{% set label=field.label.text %}{% endif %}
+ <label for="{{ field.id }}" class="control-label">{{ label|safe }}</label>
+ {% endif %}
+ <div class="metapackage_selector">
+ <input type="text" placeholder="Start typing to see suggestions">
+ <div class="clearboth"></div>
+ </div>
+ {{ field(class_='form-control', **kwargs) }}
+ {% if field.errors %}
+ {% for e in field.errors %}
+ <p class="help-block">{{ e }}</p>
+ {% endfor %}
+ {% endif %}
+ </div>
+{% endmacro %}
+
{% macro render_checkbox_field(field, label=None) -%}
{% if not label %}{% set label=field.label.text %}{% endif %}
<div class="checkbox">
diff --git a/app/templates/packages/create_edit.html b/app/templates/packages/create_edit.html
index 4f053dd..8eb7213 100644
--- a/app/templates/packages/create_edit.html
+++ b/app/templates/packages/create_edit.html
@@ -10,7 +10,7 @@
{% block content %}
<h2>Create Package</h2>
- {% from "macros/forms.html" import render_field, render_submit_field, form_includes, render_multiselect_field %}
+ {% from "macros/forms.html" import render_field, render_submit_field, form_includes, render_multiselect_field, render_mpackage_field %}
{{ form_includes() }}
<form method="POST" action="" class="tableform">
@@ -22,6 +22,7 @@
{{ render_field(form.desc, class_="pkg_meta") }}
{{ render_field(form.type, class_="pkg_meta") }}
{{ render_field(form.license, class_="pkg_meta") }}
+ {{ render_mpackage_field(form.provides_str, class_="pkg_meta", placeholder="Comma separated list") }}
{{ render_multiselect_field(form.tags, class_="pkg_meta") }}
<div class="pkg_wiz_1">
diff --git a/app/views/packages/__init__.py b/app/views/packages/__init__.py
index 5735d5a..e5a515d 100644
--- a/app/views/packages/__init__.py
+++ b/app/views/packages/__init__.py
@@ -106,6 +106,7 @@ class PackageForm(FlaskForm):
desc = TextAreaField("Long Description", [Optional(), Length(0,10000)])
type = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
license = QuerySelectField("License", [InputRequired()], query_factory=lambda: License.query, get_pk=lambda a: a.id, get_label=lambda a: a.name)
+ provides_str = StringField("Provides", [InputRequired(), Length(1,1000)])
tags = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query.order_by(db.asc(Tag.name)), get_pk=lambda a: a.id, get_label=lambda a: a.title)
repo = StringField("Repo URL", [Optional(), URL()])
website = StringField("Website URL", [Optional(), URL()])
@@ -144,6 +145,9 @@ def create_edit_package_page(author=None, name=None):
form = PackageForm(formdata=request.form, obj=package)
# Initial form class from post data and default data
+ if request.method == "GET" and package is not None:
+ form.provides_str.data = MetaPackage.ListToSpec(package.provides)
+
if request.method == "POST" and form.validate():
wasNew = False
if not package:
@@ -164,6 +168,12 @@ def create_edit_package_page(author=None, name=None):
form.populate_obj(package) # copy to row
+ mpackage_cache = {}
+ package.provides.clear()
+ mpackages = MetaPackage.SpecToList(form.provides_str.data, mpackage_cache)
+ for m in mpackages:
+ package.provides.append(m)
+
package.tags.clear()
for tag in form.tags.raw_data:
package.tags.append(Tag.query.get(tag))