Add descriptions to tags, and show in multiselect

This commit is contained in:
rubenwardy 2020-07-17 22:08:34 +01:00
parent b067fd2e77
commit 2a7318eca2
8 changed files with 59 additions and 10 deletions

@ -33,9 +33,10 @@ def tag_list():
return render_template("admin/tags/list.html", tags=Tag.query.order_by(db.asc(Tag.title)).all()) return render_template("admin/tags/list.html", tags=Tag.query.order_by(db.asc(Tag.title)).all())
class TagForm(FlaskForm): class TagForm(FlaskForm):
title = StringField("Title", [InputRequired(), Length(3,100)]) title = StringField("Title", [InputRequired(), Length(3,100)])
name = StringField("Name", [Optional(), Length(1, 20), Regexp("^[a-z0-9_]", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")]) description = TextAreaField("Description", [InputRequired(), Length(0, 500)])
submit = SubmitField("Save") name = StringField("Name", [Optional(), Length(1, 20), Regexp("^[a-z0-9_]", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")])
submit = SubmitField("Save")
@bp.route("/tags/new/", methods=["GET", "POST"]) @bp.route("/tags/new/", methods=["GET", "POST"])
@bp.route("/tags/<name>/edit/", methods=["GET", "POST"]) @bp.route("/tags/<name>/edit/", methods=["GET", "POST"])
@ -54,6 +55,7 @@ def create_edit_tag(name=None):
if request.method == "POST" and form.validate(): if request.method == "POST" and form.validate():
if tag is None: if tag is None:
tag = Tag(form.title.data) tag = Tag(form.title.data)
tag.description = form.description.data
db.session.add(tag) db.session.add(tag)
else: else:
form.populate_obj(tag) form.populate_obj(tag)

@ -197,6 +197,12 @@ def download(package):
return redirect(release.getDownloadURL(), code=302) return redirect(release.getDownloadURL(), code=302)
def makeLabel(obj):
if obj.description:
return "{}: {}".format(obj.title, obj.description)
else:
return obj.title
class PackageForm(FlaskForm): class PackageForm(FlaskForm):
name = StringField("Name (Technical)", [InputRequired(), Length(1, 100), Regexp("^[a-z0-9_]+$", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")]) name = StringField("Name (Technical)", [InputRequired(), Length(1, 100), Regexp("^[a-z0-9_]+$", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")])
title = StringField("Title (Human-readable)", [InputRequired(), Length(3, 100)]) title = StringField("Title (Human-readable)", [InputRequired(), Length(3, 100)])
@ -206,8 +212,8 @@ class PackageForm(FlaskForm):
license = QuerySelectField("License", [DataRequired()], allow_blank=True, query_factory=lambda: License.query.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name) license = QuerySelectField("License", [DataRequired()], allow_blank=True, query_factory=lambda: License.query.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name)
media_license = QuerySelectField("Media License", [DataRequired()], allow_blank=True, query_factory=lambda: License.query.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name) media_license = QuerySelectField("Media License", [DataRequired()], allow_blank=True, query_factory=lambda: License.query.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name)
provides_str = StringField("Provides (mods included in package)", [Optional()]) provides_str = StringField("Provides (mods included in package)", [Optional()])
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) tags = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query.order_by(db.asc(Tag.name)), get_pk=lambda a: a.id, get_label=makeLabel)
content_warnings = QuerySelectMultipleField('Content Warnings', query_factory=lambda: ContentWarning.query.order_by(db.asc(ContentWarning.name)), get_pk=lambda a: a.id, get_label=lambda a: a.title) content_warnings = QuerySelectMultipleField('Content Warnings', query_factory=lambda: ContentWarning.query.order_by(db.asc(ContentWarning.name)), get_pk=lambda a: a.id, get_label=makeLabel)
harddep_str = StringField("Hard Dependencies", [Optional()]) harddep_str = StringField("Hard Dependencies", [Optional()])
softdep_str = StringField("Soft Dependencies", [Optional()]) softdep_str = StringField("Soft Dependencies", [Optional()])
repo = StringField("VCS Repository URL", [Optional(), URL()], filters = [lambda x: x or None]) repo = StringField("VCS Repository URL", [Optional(), URL()], filters = [lambda x: x or None])

@ -840,11 +840,11 @@ class ContentWarning(db.Model):
self.name = regex.sub("", self.title.lower().replace(" ", "_")) self.name = regex.sub("", self.title.lower().replace(" ", "_"))
class Tag(db.Model): class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True, nullable=False) name = db.Column(db.String(100), unique=True, nullable=False)
title = db.Column(db.String(100), nullable=False) title = db.Column(db.String(100), nullable=False)
description = db.Column(db.String(500), nullable=True, default=None)
backgroundColor = db.Column(db.String(6), nullable=False) backgroundColor = db.Column(db.String(6), nullable=False)
textColor = db.Column(db.String(6), nullable=False) textColor = db.Column(db.String(6), nullable=False)
views = db.Column(db.Integer, nullable=False, default=0) views = db.Column(db.Integer, nullable=False, default=0)

@ -30,6 +30,11 @@
}); });
function addTag(id, text) { function addTag(id, text) {
const idx = text.indexOf(':');
if (idx > 0) {
text = text.substr(0, idx);
}
$('<span class="badge badge-pill badge-primary"/>') $('<span class="badge badge-pill badge-primary"/>')
.text(text + ' ') .text(text + ' ')
.data("id", id) .data("id", id)

@ -17,6 +17,7 @@
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{{ render_field(form.title) }} {{ render_field(form.title) }}
{{ render_field(form.description) }}
{% if tag %} {% if tag %}
{{ render_field(form.name) }} {{ render_field(form.name) }}
{% endif %} {% endif %}

@ -14,13 +14,16 @@
</p> </p>
<div class="list-group"> <div class="list-group">
<div class="list-group-item"> <div class="list-group-item">
<div class="row text-muted"> <div class="row text-muted">
<div class="col-sm"> <div class="col-sm-2">
{{ _("Name") }} {{ _("Name") }}
</div> </div>
<div class="col-sm">
{{ _("Description") }}
</div>
<span class="col-sm-1 text-center"> <span class="col-sm-1 text-center">
{{ _("Views") }} {{ _("Views") }}
</span> </span>
@ -35,10 +38,14 @@
<a class="list-group-item list-group-item-action" <a class="list-group-item list-group-item-action"
href="{{ url_for('admin.create_edit_tag', name=t.name) }}"> href="{{ url_for('admin.create_edit_tag', name=t.name) }}">
<div class="row"> <div class="row">
<div class="col-sm"> <div class="col-sm-2">
{{ t.title }} {{ t.title }}
</div> </div>
<div class="col-sm">
{{ t.description or "" }}
</div>
<div class="col-sm-1 text-center"> <div class="col-sm-1 text-center">
{{ t.views }} {{ t.views }}
</div> </div>

@ -16,7 +16,7 @@
{% macro form_scripts() -%} {% macro form_scripts() -%}
<link href="/static/jquery-ui.min.css" rel="stylesheet" type="text/css"> <link href="/static/jquery-ui.min.css" rel="stylesheet" type="text/css">
<script src="/static/jquery-ui.min.js"></script> <script src="/static/jquery-ui.min.js"></script>
<script src="/static/tagselector.js?v=2"></script> <script src="/static/tagselector.js?v=3"></script>
{% endmacro %} {% endmacro %}
{% macro package_lists() -%} {% macro package_lists() -%}

@ -0,0 +1,28 @@
"""empty message
Revision ID: 3a24fc02365e
Revises: b370c3eb4227
Create Date: 2020-07-17 20:58:31.130449
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '3a24fc02365e'
down_revision = 'b370c3eb4227'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('tag', sa.Column('description', sa.String(length=500), nullable=True, server_default=None))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('tag', 'description')
# ### end Alembic commands ###