diff --git a/.gitignore b/.gitignore index 1f899e76..4b6ab215 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.pyc +*,orig bin/ config.ini alembic.ini diff --git a/SpaceDock/blueprints/anonymous.py b/SpaceDock/blueprints/anonymous.py index 684f72f9..c1935d4d 100644 --- a/SpaceDock/blueprints/anonymous.py +++ b/SpaceDock/blueprints/anonymous.py @@ -35,7 +35,7 @@ def game(gameshort): new = Mod.query.filter(Mod.published,Mod.game_id == ga.id).order_by(desc(Mod.created)).limit(6)[:6] recent = Mod.query.filter(Mod.published,Mod.game_id == ga.id, ModVersion.query.filter(ModVersion.mod_id == Mod.id).count() > 1).order_by(desc(Mod.updated)).limit(6)[:6] user_count = User.query.count() - mod_count = Mod.query.count() + mod_count = Mod.query.filter(Mod.game_id == ga.id).count() yours = list() if current_user: yours = sorted(current_user.following, key=lambda m: m.updated, reverse=True)[:6] @@ -120,7 +120,7 @@ def browse_top(): page = int(page) else: page = 1 - mods, total_pages = search_mods(False,"", page, 30) + mods, total_pages = search_mods(None, "", page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages,\ url="/browse/top", name="Popular Mods", site_name=_cfg('site-name'), support_mail=_cfg('support-mail')) @@ -163,7 +163,7 @@ def browse_all(): page = int(page) else: page = 1 - mods, total_pages = search_mods(False,"", page, 30) + mods, total_pages = search_mods(None, "", page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages,\ url="/browse/all", name="All Mods", site_name=_cfg('site-name'), support_mail=_cfg('support-mail')) @@ -336,7 +336,7 @@ def singlegame_browse_top(gameshort): page = int(page) else: page = 1 - mods, total_pages = search_mods(ga,"", page, 30) + mods, total_pages = search_mods(ga, "", page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages,ga = ga,\ url="/browse/top", name="Popular Mods", site_name=_cfg('site-name'), support_mail=_cfg('support-mail')) @@ -400,7 +400,7 @@ def singlegame_browse_all(gameshort): page = int(page) else: page = 1 - mods, total_pages = search_mods(False,"", page, 30) + mods, total_pages = search_mods(ga, "", page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages,ga = ga,\ url="/browse/all", name="All Mods", site_name=_cfg('site-name'), support_mail=_cfg('support-mail')) @@ -442,7 +442,7 @@ def search(): page = int(page) else: page = 1 - mods, total_pages = search_mods(False,query, page, 30) + mods, total_pages = search_mods(None, query, page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages, search=True, query=query) @anonymous.route("//search") @@ -462,5 +462,5 @@ def singlegame_search(gameshort): page = int(page) else: page = 1 - mods, total_pages = search_mods(ga,query, page, 30) + mods, total_pages = search_mods(ga, query, page, 30) return render_template("mods/mod_view_browse.html", mods=mods, page=page, total_pages=total_pages, search=True, query=query,ga=ga) diff --git a/SpaceDock/blueprints/api.py b/SpaceDock/blueprints/api.py index cfefa480..bb6db103 100644 --- a/SpaceDock/blueprints/api.py +++ b/SpaceDock/blueprints/api.py @@ -7,6 +7,7 @@ from SpaceDock.common import * from SpaceDock.config import _cfg from SpaceDock.email import send_update_notification, send_grant_notice +from KerbalStuff.celery import notify_ckan from datetime import datetime from functools import wraps from SpaceDock.app import cache @@ -268,7 +269,7 @@ def search_mod(): query = '' if not query else query page = 1 if not page or not page.isdigit() else int(page) results = list() - for m in search_mods(False,query, page, 30)[0]: + for m in search_mods(None, query, page, 30)[0]: a = mod_info(m) a['versions'] = list() for v in m.versions: @@ -836,6 +837,7 @@ def create_mod(): session['gamename'] = ga.name; session['gameshort'] = ga.short; session['gameid'] = ga.id; + notify_ckan.delay(mod.id, 'create') return { 'url': url_for("mods.mod", id=mod.id, mod_name=mod.name), "id": mod.id, "name": mod.name } @api.route('/api/mod//update', methods=['POST']) @@ -907,4 +909,5 @@ def update_mod(mod_id): db.commit() mod.default_version_id = version.id db.commit() + notify_ckan.delay(mod_id, 'update') return { 'url': url_for("mods.mod", id=mod.id, mod_name=mod.name), "id": version.id } diff --git a/SpaceDock/blueprints/mods.py b/SpaceDock/blueprints/mods.py index d7435f7c..828a40df 100644 --- a/SpaceDock/blueprints/mods.py +++ b/SpaceDock/blueprints/mods.py @@ -8,6 +8,7 @@ from SpaceDock.config import _cfg from SpaceDock.blueprints.api import default_description from SpaceDock.ckan import send_to_ckan +from KerbalStuff.celery import notify_ckan from werkzeug.utils import secure_filename from datetime import datetime, timedelta from shutil import rmtree, copyfile @@ -76,21 +77,12 @@ def mod_rss(id, mod_name): @mods.route("/mod//") @with_session def mod(id, mod_name): - games = Game.query.filter(Game.active == True).order_by(desc(Game.id)).all() - if session.get('gameid'): - if session['gameid']: - ga = Game.query.filter(Game.id == session['gameid']).order_by(desc(Game.id)).first() - else: - ga = Game.query.filter(Game.short == 'kerbal-space-program').order_by(desc(Game.id)).first() - else: - ga = Game.query.filter(Game.short == 'kerbal-space-program').order_by(desc(Game.id)).first() + mod = Mod.query.filter(Mod.id == id).first() + ga = mod.game session['game'] = ga.id; session['gamename'] = ga.name; session['gameshort'] = ga.short; session['gameid'] = ga.id; - mod = Mod.query.filter(Mod.id == id,Mod.game_id == ga.id).first() - if not mod: - abort(404) if not mod or not ga: abort(404) editable = False @@ -378,6 +370,7 @@ def delete(mod_id): base_path = os.path.join(secure_filename(mod.user.username) + '_' + str(mod.user.id), secure_filename(mod.name)) full_path = os.path.join(_cfg('storage'), base_path) db.commit() + notify_ckan.delay(mod_id, 'delete') rmtree(full_path) return redirect("/profile/" + current_user.username) @@ -569,7 +562,7 @@ def publish(mod_id, mod_name): mod.published = True mod.updated = datetime.now() send_to_ckan(mod) - return redirect(url_for("mods.mod", id=mod.id, mod_name=mod.name,ga=game)) + return redirect(url_for("mods.mod", id=mod.id, mod_name=mod.name)) @mods.route('/mod//download/', defaults={ 'mod_name': None }) @mods.route('/mod///download/') @@ -764,4 +757,5 @@ def autoupdate(mod_id): default = mod.default_version() default.gameversion_id = GameVersion.query.filter(GameVersion.game_id == mod.game_id).order_by(desc(GameVersion.id)).first().id send_autoupdate_notification(mod) + notify_ckan.delay(mod_id, 'version-update') return redirect(url_for("mods.mod", id=mod.id, mod_name=mod.name,ga=game)) diff --git a/SpaceDock/celery.py b/SpaceDock/celery.py index c1fc2676..66e6a06f 100644 --- a/SpaceDock/celery.py +++ b/SpaceDock/celery.py @@ -1,3 +1,4 @@ +import requests import smtplib from celery import Celery from email.mime.text import MIMEText @@ -42,6 +43,13 @@ def send_mail(sender, recipients, subject, message, important=False): smtp.sendmail(sender, group, message.as_string()) smtp.quit() +@app.task +def notify_ckan(mod_id, event_type): + if _cfg("notify-url") == "": + return + send_data = { 'mod_id': mod_id, 'event_type': event_type } + requests.post(_cfg("notify-url"), send_data) + @app.task def update_patreon(): donation_cache.set('patreon_update_time', time.time()) diff --git a/SpaceDock/ckan.py b/SpaceDock/ckan.py index 67fae50b..906f66dc 100644 --- a/SpaceDock/ckan.py +++ b/SpaceDock/ckan.py @@ -43,10 +43,10 @@ def send_to_ckan(mod): Mod details: name = {2} author = {0} - description = {5} abstract = {6} license = {7} Homepage = {8} + description = {5} Please direct questions about this pull request to [{0}]({4}{3}). """.format(mod.user.username, mod.name,\ diff --git a/config.ini.example b/config.ini.example index 68c1ae4f..7bd2f1a8 100644 --- a/config.ini.example +++ b/config.ini.example @@ -100,6 +100,9 @@ github_pass= # Thumbnail size in WxH format, leave blank to disable screenshots thumbnail_size=320x320 +# SpaceDock-Notify dispatcher +notify-url= + # Patreon details patreon_user_id= patreon_campaign= diff --git a/db_initialize.py b/db_initialize.py index 850f8122..083a072b 100644 --- a/db_initialize.py +++ b/db_initialize.py @@ -12,6 +12,7 @@ if not User.query.filter(User.username.ilike("admin")).first(): admin = User("admin", "admin@example.com", "development") admin.admin = True + user.public = True admin.confirmation = None db.add(admin) db.commit() @@ -19,6 +20,23 @@ # Create normal user if doesn't exist if not User.query.filter(User.username.ilike("user")).first(): user = User("user", "user@example.com", "development") + user.public = True user.confirmation = None db.add(user) db.commit() + +if not Publisher.query.first(): + pub = Publisher("Squad") + db.add(pub) + db.commit() + +if not Game.query.first(): + game = Game("Kerbal Space Program", 1, "kerbal-space-program") + game.active = True + db.add(game) + db.commit() + +if not GameVersion.query.first(): + gameversion = GameVersion('1.0', 1) + db.add(gameversion) + db.commit()