diff --git a/app/blueprints/collections/__init__.py b/app/blueprints/collections/__init__.py index 8397d610..1965bd87 100644 --- a/app/blueprints/collections/__init__.py +++ b/app/blueprints/collections/__init__.py @@ -22,7 +22,7 @@ from flask_babel import lazy_gettext, gettext from flask_login import current_user, login_required from flask_wtf import FlaskForm from wtforms import StringField, BooleanField, SubmitField, FieldList, HiddenField -from wtforms.validators import InputRequired, Length, Optional +from wtforms.validators import InputRequired, Length, Optional, Regexp from app.models import Collection, db, Package, Permission, CollectionPackage, User, UserRank, AuditSeverity from app.utils import is_package_page, nonempty_or_none, add_audit_log @@ -70,6 +70,8 @@ def view(author, name): class CollectionForm(FlaskForm): title = StringField(lazy_gettext("Title"), [InputRequired(), Length(3, 100)]) + name = StringField("URL", [Optional(), Length(1, 20), Regexp("^[a-z0-9_]", 0, + "Lower case letters (a-z), digits (0-9), and underscores (_) only")]) short_description = StringField(lazy_gettext("Short Description"), [Optional(), Length(0, 200)]) private = BooleanField(lazy_gettext("Private")) descriptions = FieldList( @@ -113,6 +115,8 @@ def create_edit(author=None, name=None): for item in collection.items: form.descriptions.append_entry(item.description) form.package_ids.append_entry(item.package.id) + else: + form.name = None if form.validate_on_submit(): ret = handle_create_edit(collection, form, initial_package, author) @@ -127,9 +131,9 @@ def handle_create_edit(collection: Collection, form: CollectionForm, initial_package: typing.Optional[Package], author: User): severity = AuditSeverity.NORMAL if author == current_user else AuditSeverity.EDITOR - name = collection.name if collection else regex_invalid_chars.sub("", form.title.data.lower().replace(" ", "_")) + name = form.name.data if collection else regex_invalid_chars.sub("", form.title.data.lower().replace(" ", "_")) - if collection is None: + if collection is None or name != collection.name: if Collection.query \ .filter(Collection.name == name, Collection.author == author) \ .count() > 0: @@ -142,6 +146,7 @@ def handle_create_edit(collection: Collection, form: CollectionForm, flash(gettext("Unable to create collection as a package with that name already exists"), "danger") return + if collection is None: collection = Collection() collection.name = name collection.author = author diff --git a/app/templates/collections/create_edit.html b/app/templates/collections/create_edit.html index a0eac13e..b9da6d8c 100644 --- a/app/templates/collections/create_edit.html +++ b/app/templates/collections/create_edit.html @@ -9,13 +9,22 @@ {% endblock %} {% block content %} - {% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field %} + {% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field, render_field_prefix_button %}
{{ render_submit_field(form.submit, class_="btn btn-primary float-right") }}

{{ self.title() }}

{{ form.hidden_tag() }} - {{ render_field(form.title) }} + +
+ {{ render_field(form.title, class_="col-sm-6") }} + {% if form.name %} + {{ render_field_prefix_button(form.name, class_="col-sm-6", pattern="[a-z0-9_]+", + prefix="/collections/" + collection.author.username + "/", + hint=_("Users won't be redirected when going to the old URL")) }} + {% endif %} +
+ {{ render_field(form.short_description) }} {{ render_checkbox_field(form.private, class_="my-3") }} diff --git a/app/templates/macros/forms.html b/app/templates/macros/forms.html index 3dd946cd..b0fa983e 100644 --- a/app/templates/macros/forms.html +++ b/app/templates/macros/forms.html @@ -36,24 +36,29 @@ {%- endmacro %} -{% macro render_field_prefix_button(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None) -%} +{% macro render_field_prefix_button(field, label=None, prefix="@", label_visible=true, right_url=None, right_label=None, fieldclass=None, has_view=False, hint=None) -%}
{% if field.type != 'HiddenField' and label_visible %} {% if not label and label != "" %}{% set label=field.label.text %}{% endif %} {% if label %}{% endif %} {% endif %} -
+
{{ prefix }}
{{ field(class_=fieldclass or 'form-control', **kwargs) }} - - {{ _("View") }} - + {% if has_view %} + + {{ _("View") }} + + {% endif %}
{{ render_errors(field) }} + {% if hint %} + {{ hint | safe }} + {% endif %}
{%- endmacro %} diff --git a/app/templates/packages/create_edit.html b/app/templates/packages/create_edit.html index 2302634e..6633ccd2 100644 --- a/app/templates/packages/create_edit.html +++ b/app/templates/packages/create_edit.html @@ -116,7 +116,8 @@ {{ render_field_prefix_button(form.forums, class_="pkg_meta", pattern="[0-9]+", prefix="forum.minetest.net/viewtopic.php?t=", - placeholder=_("Tip: paste in a forum topic URL")) }} + placeholder=_("Tip: paste in a forum topic URL"), + has_view=True) }} {{ render_field(form.video_url, class_="pkg_meta", hint=_("YouTube videos will be shown in an embed.")) }} {{ render_field(form.donate_url, class_="pkg_meta", hint=_("If blank, the author's donation URL will be used instead.")) }}