aboutsummaryrefslogtreecommitdiff
path: root/app/blueprints
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2020-07-17 20:48:51 +0100
committerrubenwardy <rw@rubenwardy.com>2020-07-17 20:48:51 +0100
commit6a674c3c79437c7b4829947c67dd7f14b32c1941 (patch)
tree0830107ee78e80e61312c90c35a84c6154f6970a /app/blueprints
parent0ac2827468a5d18536a9066033e0ad4a4767edbb (diff)
downloadcheatdb-6a674c3c79437c7b4829947c67dd7f14b32c1941.tar.xz
Add Content Warnings
Diffstat (limited to 'app/blueprints')
-rw-r--r--app/blueprints/admin/__init__.py2
-rw-r--r--app/blueprints/admin/warningseditor.py59
-rw-r--r--app/blueprints/packages/packages.py39
3 files changed, 83 insertions, 17 deletions
diff --git a/app/blueprints/admin/__init__.py b/app/blueprints/admin/__init__.py
index c48f97c..1aa06c3 100644
--- a/app/blueprints/admin/__init__.py
+++ b/app/blueprints/admin/__init__.py
@@ -19,4 +19,4 @@ from flask import Blueprint
bp = Blueprint("admin", __name__)
-from . import admin, licenseseditor, tagseditor, versioneditor, audit
+from . import admin, audit, licenseseditor, tagseditor, versioneditor, warningseditor
diff --git a/app/blueprints/admin/warningseditor.py b/app/blueprints/admin/warningseditor.py
new file mode 100644
index 0000000..418d052
--- /dev/null
+++ b/app/blueprints/admin/warningseditor.py
@@ -0,0 +1,59 @@
+# ContentDB
+# Copyright (C) 2020 rubenwardy
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+
+from flask import *
+from flask_user import *
+from . import bp
+from app.models import *
+from flask_wtf import FlaskForm
+from wtforms import *
+from wtforms.validators import *
+from app.utils import rank_required
+
+@bp.route("/admin/warnings/")
+@rank_required(UserRank.ADMIN)
+def warning_list():
+ return render_template("admin/warnings/list.html", warnings=ContentWarning.query.order_by(db.asc(ContentWarning.title)).all())
+
+class WarningForm(FlaskForm):
+ 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")
+
+@bp.route("/admin/warnings/new/", methods=["GET", "POST"])
+@bp.route("/admin/warnings/<name>/edit/", methods=["GET", "POST"])
+@rank_required(UserRank.ADMIN)
+def create_edit_warning(name=None):
+ warning = None
+ if name is not None:
+ warning = ContentWarning.query.filter_by(name=name).first()
+ if warning is None:
+ abort(404)
+
+ form = WarningForm(formdata=request.form, obj=warning)
+ if request.method == "POST" and form.validate():
+ if warning is None:
+ warning = ContentWarning(form.title.data, form.description.data)
+ db.session.add(warning)
+ else:
+ form.populate_obj(warning)
+ db.session.commit()
+
+ return redirect(url_for("admin.warning_list"))
+
+ return render_template("admin/warnings/edit.html", warning=warning, form=form)
diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py
index 716e79e..5a775b2 100644
--- a/app/blueprints/packages/packages.py
+++ b/app/blueprints/packages/packages.py
@@ -198,22 +198,24 @@ def download(package):
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")])
- title = StringField("Title (Human-readable)", [InputRequired(), Length(3, 100)])
- short_desc = StringField("Short Description (Plaintext)", [InputRequired(), Length(1,200)])
- desc = TextAreaField("Long Description (Markdown)", [Optional(), Length(0,10000)])
- type = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
- 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)
- 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)
- harddep_str = StringField("Hard Dependencies", [Optional()])
- softdep_str = StringField("Soft Dependencies", [Optional()])
- repo = StringField("VCS Repository URL", [Optional(), URL()], filters = [lambda x: x or None])
- website = StringField("Website URL", [Optional(), URL()], filters = [lambda x: x or None])
- issueTracker = StringField("Issue Tracker URL", [Optional(), URL()], filters = [lambda x: x or None])
- forums = IntegerField("Forum Topic ID", [Optional(), NumberRange(0,999999)])
- submit = SubmitField("Save")
+ 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)])
+ short_desc = StringField("Short Description (Plaintext)", [InputRequired(), Length(1,200)])
+ desc = TextAreaField("Long Description (Markdown)", [Optional(), Length(0,10000)])
+ type = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
+ 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)
+ 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)
+ 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)
+ harddep_str = StringField("Hard Dependencies", [Optional()])
+ softdep_str = StringField("Soft Dependencies", [Optional()])
+ repo = StringField("VCS Repository URL", [Optional(), URL()], filters = [lambda x: x or None])
+ website = StringField("Website URL", [Optional(), URL()], filters = [lambda x: x or None])
+ issueTracker = StringField("Issue Tracker URL", [Optional(), URL()], filters = [lambda x: x or None])
+ forums = IntegerField("Forum Topic ID", [Optional(), NumberRange(0,999999)])
+ submit = SubmitField("Save")
+
@bp.route("/packages/new/", methods=["GET", "POST"])
@bp.route("/packages/<author>/<name>/edit/", methods=["GET", "POST"])
@@ -259,6 +261,7 @@ def create_edit(author=None, name=None):
form.softdep_str.data = ",".join([str(x) for x in package.getSortedOptionalDependencies() ])
form.provides_str.data = MetaPackage.ListToSpec(package.provides)
form.tags.data = list(package.tags)
+ form.content_warnings.data = list(package.content_warnings)
if request.method == "POST" and form.validate():
wasNew = False
@@ -320,6 +323,10 @@ def create_edit(author=None, name=None):
for tag in form.tags.raw_data:
package.tags.append(Tag.query.get(tag))
+ package.content_warnings.clear()
+ for warning in form.content_warnings.raw_data:
+ package.content_warnings.append(ContentWarning.query.get(warning))
+
db.session.commit() # save
next_url = package.getDetailsURL()