Move API to dedicated file, and reduce download size
This commit is contained in:
parent
87af23248e
commit
cfa7654efc
|
@ -376,7 +376,7 @@ class Package(db.Model):
|
||||||
for e in PackagePropertyKey:
|
for e in PackagePropertyKey:
|
||||||
setattr(self, e.name, getattr(package, e.name))
|
setattr(self, e.name, getattr(package, e.name))
|
||||||
|
|
||||||
def getAsDictionary(self, base_url):
|
def getAsDictionaryShort(self, base_url):
|
||||||
tnurl = self.getThumbnailURL()
|
tnurl = self.getThumbnailURL()
|
||||||
return {
|
return {
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
|
@ -384,14 +384,37 @@ class Package(db.Model):
|
||||||
"author": self.author.display_name,
|
"author": self.author.display_name,
|
||||||
"shortDesc": self.shortDesc,
|
"shortDesc": self.shortDesc,
|
||||||
"type": self.type.toName(),
|
"type": self.type.toName(),
|
||||||
"license": self.license.name,
|
|
||||||
"repo": self.repo,
|
|
||||||
"url": base_url + self.getDownloadURL(),
|
|
||||||
"release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None,
|
"release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None,
|
||||||
"screenshots": [base_url + ss.url for ss in self.screenshots],
|
|
||||||
"thumbnail": (base_url + tnurl) if tnurl is not None else None
|
"thumbnail": (base_url + tnurl) if tnurl is not None else None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def getAsDictionary(self, base_url):
|
||||||
|
tnurl = self.getThumbnailURL()
|
||||||
|
return {
|
||||||
|
"author": self.author.display_name,
|
||||||
|
"name": self.name,
|
||||||
|
"title": self.title,
|
||||||
|
"shortDesc": self.shortDesc,
|
||||||
|
"desc": self.desc,
|
||||||
|
"type": self.type.toName(),
|
||||||
|
"createdAt": self.created_at,
|
||||||
|
|
||||||
|
"license": self.license.name,
|
||||||
|
"mediaLicense": self.media_license.name,
|
||||||
|
|
||||||
|
"repo": self.repo,
|
||||||
|
"website": self.website,
|
||||||
|
"issueTracker": self.issueTracker,
|
||||||
|
"forums": self.forums,
|
||||||
|
|
||||||
|
"provides": [x.name for x in self.provides],
|
||||||
|
"thumbnail": (base_url + tnurl) if tnurl is not None else None,
|
||||||
|
"screenshots": [base_url + ss.url for ss in self.screenshots],
|
||||||
|
|
||||||
|
"url": base_url + self.getDownloadURL(),
|
||||||
|
"release": self.getDownloadRelease().id if self.getDownloadRelease() is not None else None
|
||||||
|
}
|
||||||
|
|
||||||
def getThumbnailURL(self):
|
def getThumbnailURL(self):
|
||||||
screenshot = self.screenshots.filter_by(approved=True).first()
|
screenshot = self.screenshots.filter_by(approved=True).first()
|
||||||
return screenshot.getThumbnailURL() if screenshot is not None else None
|
return screenshot.getThumbnailURL() if screenshot is not None else None
|
||||||
|
|
|
@ -51,7 +51,8 @@ def home_page():
|
||||||
packages = query.order_by(db.desc(Package.created_at)).limit(15).all()
|
packages = query.order_by(db.desc(Package.created_at)).limit(15).all()
|
||||||
return render_template("index.html", packages=packages, count=count)
|
return render_template("index.html", packages=packages, count=count)
|
||||||
|
|
||||||
from . import users, githublogin, packages, sass, tasks, admin, notifications, tagseditor, meta, thumbnails, threads
|
from . import users, githublogin, packages, meta, threads, api
|
||||||
|
from . import sass, tasks, admin, notifications, tagseditor, thumbnails
|
||||||
|
|
||||||
@menu.register_menu(app, ".help", "Help", order=19, endpoint_arguments_constructor=lambda: { 'path': 'help' })
|
@menu.register_menu(app, ".help", "Help", order=19, endpoint_arguments_constructor=lambda: { 'path': 'help' })
|
||||||
@app.route('/<path:path>/')
|
@app.route('/<path:path>/')
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Content DB
|
||||||
|
# Copyright (C) 2018 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 app import app
|
||||||
|
from app.models import *
|
||||||
|
from app.utils import is_package_page
|
||||||
|
from .packages import build_packages_query
|
||||||
|
|
||||||
|
@app.route("/api/packages/")
|
||||||
|
def api_packages_page():
|
||||||
|
query = build_packages_query()
|
||||||
|
pkgs = [package.getAsDictionaryShort(app.config["BASE_URL"]) \
|
||||||
|
for package in query.all() if package.getDownloadRelease() is not None]
|
||||||
|
return jsonify(pkgs)
|
||||||
|
|
||||||
|
@app.route("/api/packages/<author>/<name>/")
|
||||||
|
@is_package_page
|
||||||
|
def api_package_page(package):
|
||||||
|
return jsonify(package.getAsDictionary(app.config["BASE_URL"]))
|
|
@ -30,14 +30,7 @@ from wtforms import *
|
||||||
from wtforms.validators import *
|
from wtforms.validators import *
|
||||||
from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
|
from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
|
||||||
|
|
||||||
# TODO: the following could be made into one route, except I"m not sure how
|
def build_packages_query():
|
||||||
# to do the menu
|
|
||||||
|
|
||||||
@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' })
|
|
||||||
@menu.register_menu(app, ".txp", "Texture Packs", order=13, endpoint_arguments_constructor=lambda: { 'type': 'txp' })
|
|
||||||
@app.route("/packages/")
|
|
||||||
def packages_page():
|
|
||||||
type_name = request.args.get("type")
|
type_name = request.args.get("type")
|
||||||
type = None
|
type = None
|
||||||
if type_name is not None:
|
if type_name is not None:
|
||||||
|
@ -54,24 +47,30 @@ def packages_page():
|
||||||
if search is not None and search.strip() != "":
|
if search is not None and search.strip() != "":
|
||||||
query = query.filter(Package.title.ilike('%' + search + '%'))
|
query = query.filter(Package.title.ilike('%' + search + '%'))
|
||||||
|
|
||||||
|
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' })
|
||||||
|
@menu.register_menu(app, ".txp", "Texture Packs", order=13, endpoint_arguments_constructor=lambda: { 'type': 'txp' })
|
||||||
|
@app.route("/packages/")
|
||||||
|
def packages_page():
|
||||||
if shouldReturnJson():
|
if shouldReturnJson():
|
||||||
pkgs = [package.getAsDictionary(app.config["BASE_URL"]) \
|
return redirect(url_for("api_packages_page"))
|
||||||
for package in query.all() if package.getDownloadRelease() is not None]
|
|
||||||
return jsonify(pkgs)
|
|
||||||
else:
|
|
||||||
page = int(request.args.get("page") or 1)
|
|
||||||
num = min(42, int(request.args.get("n") or 100))
|
|
||||||
query = query.paginate(page, num, True)
|
|
||||||
|
|
||||||
next_url = url_for("packages_page", type=type_name, q=search, page=query.next_num) \
|
query = build_packages_query()
|
||||||
if query.has_next else None
|
page = int(request.args.get("page") or 1)
|
||||||
prev_url = url_for("packages_page", type=type_name, q=search, page=query.prev_num) \
|
num = min(42, int(request.args.get("n") or 100))
|
||||||
if query.has_prev else None
|
query = query.paginate(page, num, True)
|
||||||
|
|
||||||
tags = Tag.query.all()
|
next_url = url_for("packages_page", type=type_name, q=search, page=query.next_num) \
|
||||||
return render_template("packages/list.html", title=title, packages=query.items, \
|
if query.has_next else None
|
||||||
query=search, tags=tags, type=type_name, \
|
prev_url = url_for("packages_page", type=type_name, q=search, page=query.prev_num) \
|
||||||
next_url=next_url, prev_url=prev_url, page=page, page_max=query.pages, packages_count=query.total)
|
if query.has_prev else None
|
||||||
|
|
||||||
|
tags = Tag.query.all()
|
||||||
|
return render_template("packages/list.html", title=title, packages=query.items, \
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
def getReleases(package):
|
def getReleases(package):
|
||||||
|
@ -84,41 +83,38 @@ def getReleases(package):
|
||||||
@app.route("/packages/<author>/<name>/")
|
@app.route("/packages/<author>/<name>/")
|
||||||
@is_package_page
|
@is_package_page
|
||||||
def package_page(package):
|
def package_page(package):
|
||||||
if shouldReturnJson():
|
clearNotifications(package.getDetailsURL())
|
||||||
return jsonify(package.getAsDictionary(app.config["BASE_URL"]))
|
|
||||||
else:
|
|
||||||
clearNotifications(package.getDetailsURL())
|
|
||||||
|
|
||||||
alternatives = None
|
alternatives = None
|
||||||
if package.type == PackageType.MOD:
|
if package.type == PackageType.MOD:
|
||||||
alternatives = Package.query \
|
alternatives = Package.query \
|
||||||
.filter_by(name=package.name, type=PackageType.MOD, soft_deleted=False) \
|
.filter_by(name=package.name, type=PackageType.MOD, soft_deleted=False) \
|
||||||
.filter(Package.id != package.id) \
|
.filter(Package.id != package.id) \
|
||||||
.order_by(db.asc(Package.title)) \
|
.order_by(db.asc(Package.title)) \
|
||||||
.all()
|
.all()
|
||||||
|
|
||||||
show_similar_topics = current_user == package.author or \
|
show_similar_topics = current_user == package.author or \
|
||||||
package.checkPerm(current_user, Permission.APPROVE_NEW)
|
package.checkPerm(current_user, Permission.APPROVE_NEW)
|
||||||
|
|
||||||
similar_topics = None if not show_similar_topics else \
|
similar_topics = None if not show_similar_topics else \
|
||||||
KrockForumTopic.query \
|
KrockForumTopic.query \
|
||||||
.filter_by(name=package.name) \
|
.filter_by(name=package.name) \
|
||||||
.filter(KrockForumTopic.topic_id != package.forums) \
|
.filter(KrockForumTopic.topic_id != package.forums) \
|
||||||
.filter(~ db.exists().where(Package.forums==KrockForumTopic.topic_id)) \
|
.filter(~ db.exists().where(Package.forums==KrockForumTopic.topic_id)) \
|
||||||
.order_by(db.asc(KrockForumTopic.name), db.asc(KrockForumTopic.title)) \
|
.order_by(db.asc(KrockForumTopic.name), db.asc(KrockForumTopic.title)) \
|
||||||
.all()
|
.all()
|
||||||
|
|
||||||
releases = getReleases(package)
|
releases = getReleases(package)
|
||||||
requests = [r for r in package.requests if r.status == 0]
|
requests = [r for r in package.requests if r.status == 0]
|
||||||
|
|
||||||
review_thread = Thread.query.filter_by(package_id=package.id, private=True).first()
|
review_thread = Thread.query.filter_by(package_id=package.id, private=True).first()
|
||||||
if review_thread is not None and not review_thread.checkPerm(current_user, Permission.SEE_THREAD):
|
if review_thread is not None and not review_thread.checkPerm(current_user, Permission.SEE_THREAD):
|
||||||
review_thread = None
|
review_thread = None
|
||||||
|
|
||||||
return render_template("packages/view.html", \
|
return render_template("packages/view.html", \
|
||||||
package=package, releases=releases, requests=requests, \
|
package=package, releases=releases, requests=requests, \
|
||||||
alternatives=alternatives, similar_topics=similar_topics, \
|
alternatives=alternatives, similar_topics=similar_topics, \
|
||||||
review_thread=review_thread)
|
review_thread=review_thread)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/packages/<author>/<name>/download/")
|
@app.route("/packages/<author>/<name>/download/")
|
||||||
|
|
Loading…
Reference in New Issue