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
similarity index 53%
rename from app/templates/macros/topictable.html
rename to 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) -%}
Id |
@@ -31,3 +31,22 @@
{% endfor %}
{% endmacro %}
+
+
+{% macro render_topics(topics, current_user, show_author=True) -%}
+
+ {% for topic in topics %}
+ -
+ {{ topic.title }}
+ {% if topic.wip %}[WIP]{% endif %}
+ {% if topic.name %}[{{ topic.name }}]{% endif %}
+ {% if show_author %}
+ by {{ topic.author.display_name }}
+ {% endif %}
+ {% if not topic.author.checkPerm(current_user, "CHANGE_AUTHOR") %}
+ Create
+ {% endif %}
+
+ {% endfor %}
+
+{% 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 @@
{{ page }} / {{ page_max }}
{% if next_url %}Next {% endif %}
+
+ {% if topics %}
+ More content from the forums
+
+ {% 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.
- {% 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.
- {% 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) }}
{% 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 + '%'))
+ def buildPackageQuery(self):
+ query = Package.query.filter_by(soft_deleted=False, approved=True)
- query = query.order_by(db.desc(Package.score))
+ if len(self.types) > 0:
+ query = query.filter(Package.type.in_(self.types))
- return query, title
+ if self.search is not None and self.search.strip() != "":
+ query = query.filter(Package.title.ilike('%' + self.search + '%'))
+
+ 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)