diff options
author | rubenwardy <rw@rubenwardy.com> | 2018-08-25 18:20:45 +0100 |
---|---|---|
committer | rubenwardy <rw@rubenwardy.com> | 2018-08-25 18:20:45 +0100 |
commit | 36000b159273d06aba3fb56eab2cd78099b7e54a (patch) | |
tree | 57a7289704b2cb9d455deb10862dfd146b20c0b2 | |
parent | b296b9b299fa4d07bedc25c791d1a039d4b9fb72 (diff) | |
download | cheatdb-36000b159273d06aba3fb56eab2cd78099b7e54a.tar.xz |
Add list of relevant forum topics to last page of results
-rw-r--r-- | app/tasks/phpbbparser.py | 2 | ||||
-rw-r--r-- | app/templates/macros/topics.html (renamed from app/templates/macros/topictable.html) | 21 | ||||
-rw-r--r-- | app/templates/packages/list.html | 8 | ||||
-rw-r--r-- | app/templates/todo/topics.html | 4 | ||||
-rw-r--r-- | app/templates/users/user_profile_page.html | 4 | ||||
-rw-r--r-- | app/views/api.py | 6 | ||||
-rw-r--r-- | app/views/packages/__init__.py | 63 |
7 files changed, 83 insertions, 25 deletions
diff --git a/app/tasks/phpbbparser.py b/app/tasks/phpbbparser.py index 9984ad0..a945531 100644 --- a/app/tasks/phpbbparser.py +++ b/app/tasks/phpbbparser.py @@ -133,7 +133,7 @@ def parseForumListPage(id, page, out, extra=None): out[id] = row - return True + return False def getTopicsFromForum(id, out={}, extra=None): print("Fetching all topics from forum {}".format(id)) diff --git a/app/templates/macros/topictable.html b/app/templates/macros/topics.html index 8a6b31c..0e01185 100644 --- a/app/templates/macros/topictable.html +++ b/app/templates/macros/topics.html @@ -1,4 +1,4 @@ -{% macro render_topictable(topics, show_author=True) -%} +{% macro render_topics_table(topics, show_author=True) -%} <table> <tr> <th>Id</th> @@ -31,3 +31,22 @@ {% endfor %} </table> {% endmacro %} + + +{% macro render_topics(topics, current_user, show_author=True) -%} +<ul> + {% for topic in topics %} + <li{% if topic.wip %} class="wiptopic"{% endif %}> + <a href="https://forum.minetest.net/viewtopic.php?t={{ topic.topic_id}}">{{ topic.title }}</a> + {% if topic.wip %}[WIP]{% endif %} + {% if topic.name %}[{{ topic.name }}]{% endif %} + {% if show_author %} + by <a href="{{ url_for('user_profile_page', username=topic.author.username) }}">{{ topic.author.display_name }}</a> + {% endif %} + {% if not topic.author.checkPerm(current_user, "CHANGE_AUTHOR") %} + <a href="{{ url_for('create_edit_package_page', author=topic.author.username, repo=topic.getRepoURL(), forums=topic.topic_id, title=topic.title, bname=topic.name) }}">Create</a> + {% endif %} + </li> + {% endfor %} +</ul> +{% endmacro %} diff --git a/app/templates/packages/list.html b/app/templates/packages/list.html index 0ce5c90..53ffac0 100644 --- a/app/templates/packages/list.html +++ b/app/templates/packages/list.html @@ -37,4 +37,12 @@ <li>{{ page }} / {{ page_max }}</li> {% if next_url %}<li><a href="{{ next_url }}">Next</a></li> {% endif %} </ul> + + {% if topics %} + <h2 style="margin-top:2em;">More content from the forums</h2> + + {% from "macros/topics.html" import render_topics %} + {{ render_topics(topics, current_user) }} + {% endif %} + {% endblock %} diff --git a/app/templates/todo/topics.html b/app/templates/todo/topics.html index f53c4eb..74a9381 100644 --- a/app/templates/todo/topics.html +++ b/app/templates/todo/topics.html @@ -12,6 +12,6 @@ Topics to be Added {{ topics | count }} remaining. </p> - {% from "macros/topictable.html" import render_topictable %} - {{ render_topictable(topics) }} + {% from "macros/topics.html" import render_topics_table %} + {{ render_topics_table(topics) }} {% endblock %} diff --git a/app/templates/users/user_profile_page.html b/app/templates/users/user_profile_page.html index 81b5934..1120849 100644 --- a/app/templates/users/user_profile_page.html +++ b/app/templates/users/user_profile_page.html @@ -107,8 +107,8 @@ List of your forum topics which do not have a matching package. </p> - {% from "macros/topictable.html" import render_topictable %} - {{ render_topictable(topics_to_add, show_author=False) }} + {% from "macros/topics.html" import render_topics_table %} + {{ render_topics_table(topics_to_add, show_author=False) }} </div> </div> {% endif %} diff --git a/app/views/api.py b/app/views/api.py index 2ec46f8..9223c8b 100644 --- a/app/views/api.py +++ b/app/views/api.py @@ -20,11 +20,13 @@ from flask_user import * from app import app from app.models import * from app.utils import is_package_page -from .packages import build_packages_query +from .packages import QueryBuilder @app.route("/api/packages/") def api_packages_page(): - query, _ = build_packages_query() + qb = QueryBuilder() + query = qb.buildPackageQuery() + pkgs = [package.getAsDictionaryShort(app.config["BASE_URL"]) \ for package in query.all() if package.getDownloadRelease() is not None] return jsonify(pkgs) diff --git a/app/views/packages/__init__.py b/app/views/packages/__init__.py index f227b19..62170f5 100644 --- a/app/views/packages/__init__.py +++ b/app/views/packages/__init__.py @@ -31,28 +31,39 @@ from wtforms.validators import * from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField from sqlalchemy import or_, any_ -def build_packages_query(): - title = "Packages" - query = Package.query.filter_by(soft_deleted=False, approved=True) +class QueryBuilder: + title = None + types = None + search = None - # Filter by requested type(s) - types = request.args.getlist("type") - types = [PackageType.get(tname) for tname in types] - types = [type for type in types if type is not None] - if len(types) > 0: - title = ", ".join([type.value + "s" for type in types]) + def __init__(self): + title = "Packages" - query = query.filter(Package.type.in_(types)) + # Get request types + types = request.args.getlist("type") + types = [PackageType.get(tname) for tname in types] + types = [type for type in types if type is not None] + if len(types) > 0: + title = ", ".join([type.value + "s" for type in types]) + self.title = title + self.types = types + self.search = request.args.get("q") - search = request.args.get("q") - if search is not None and search.strip() != "": - query = query.filter(Package.title.ilike('%' + search + '%')) - query = query.order_by(db.desc(Package.score)) + def buildPackageQuery(self): + query = Package.query.filter_by(soft_deleted=False, approved=True) + + if len(self.types) > 0: + query = query.filter(Package.type.in_(self.types)) + + if self.search is not None and self.search.strip() != "": + query = query.filter(Package.title.ilike('%' + self.search + '%')) - return query, title + query = query.order_by(db.desc(Package.score)) + + return query @menu.register_menu(app, ".mods", "Mods", order=11, endpoint_arguments_constructor=lambda: { 'type': 'mod' }) @menu.register_menu(app, ".games", "Games", order=12, endpoint_arguments_constructor=lambda: { 'type': 'game' }) @@ -62,7 +73,10 @@ def packages_page(): if shouldReturnJson(): return redirect(url_for("api_packages_page")) - query, title = build_packages_query() + qb = QueryBuilder() + query = qb.buildPackageQuery() + title = qb.title + page = int(request.args.get("page") or 1) num = min(42, int(request.args.get("n") or 100)) query = query.paginate(page, num, True) @@ -75,8 +89,23 @@ def packages_page(): prev_url = url_for("packages_page", type=type_name, q=search, page=query.prev_num) \ if query.has_prev else None + topics = None + + search = request.args.get("q") + if search and not query.has_next: + topics = ForumTopic.query \ + .filter(~ db.exists().where(Package.forums==ForumTopic.topic_id)) \ + .order_by(db.asc(ForumTopic.wip), db.asc(ForumTopic.name), db.asc(ForumTopic.title)) \ + .filter(ForumTopic.title.ilike('%' + search + '%')) + + if len(qb.types) > 0: + topics = topics.filter(ForumTopic.type.in_(qb.types)) + + topics = topics.all() + tags = Tag.query.all() - return render_template("packages/list.html", title=title, packages=query.items, \ + return render_template("packages/list.html", \ + title=title, packages=query.items, topics=topics, \ query=search, tags=tags, type=type_name, \ next_url=next_url, prev_url=prev_url, page=page, page_max=query.pages, packages_count=query.total) |