]> git.lizzy.rs Git - cheatdb.git/blobdiff - app/utils.py
Redirect to correct URL when _game is missing from package name
[cheatdb.git] / app / utils.py
index c302622ae8209755056b8ed0cf1426d9f4d5b4df..a47f6d0472e2689f334a4bbbeb26bd4246219cc6 100644 (file)
@@ -1,4 +1,4 @@
-# Content DB
+# ContentDB
 # Copyright (C) 2018  rubenwardy
 #
 # This program is free software: you can redistribute it and/or modify
@@ -20,8 +20,11 @@ from flask_user import *
 from flask_login import login_user, logout_user
 from .models import *
 from . import app
-import random, string, os, imghdr
+import random, string, os, imghdr, user_agents
 from urllib.parse import urljoin
+from werkzeug.datastructures import MultiDict
+
+# These are given to Jinja in template_filters.py
 
 def abs_url_for(path, **kwargs):
        scheme = "https" if app.config["BASE_URL"][:5] == "https" else "http"
@@ -30,6 +33,28 @@ def abs_url_for(path, **kwargs):
 def abs_url(path):
        return urljoin(app.config["BASE_URL"], path)
 
+def url_set_query(**kwargs):
+       args = MultiDict(request.args)
+
+       for key, value in kwargs.items():
+               if key == "_add":
+                       for key2, value_to_add in value.items():
+                               values = set(args.getlist(key2))
+                               values.add(value_to_add)
+                               args.setlist(key2, list(values))
+               elif key == "_remove":
+                       for key2, value_to_remove in value.items():
+                               values = set(args.getlist(key2))
+                               values.discard(value_to_remove)
+                               args.setlist(key2, list(values))
+               else:
+                       args.setlist(key, [ value ])
+
+
+       dargs = dict(args.lists())
+
+       return url_for(request.endpoint, **dargs)
+
 def get_int_or_abort(v, default=None):
        if v is None:
                return default
@@ -39,6 +64,10 @@ def get_int_or_abort(v, default=None):
        except ValueError:
                abort(400)
 
+def is_user_bot():
+       user_agent = user_agents.parse(request.headers.get('User-Agent'))
+       return user_agent.is_bot
+
 def getExtension(filename):
        return filename.rsplit(".", 1)[1].lower() if "." in filename else None
 
@@ -165,11 +194,11 @@ def rank_required(rank):
 def getPackageByInfo(author, name):
        user = User.query.filter_by(username=author).first()
        if user is None:
-               abort(404)
+               return None
 
        package = Package.query.filter_by(name=name, author_id=user.id, soft_deleted=False).first()
        if package is None:
-               abort(404)
+               return None
 
        return package
 
@@ -179,7 +208,18 @@ def is_package_page(f):
                if not ("author" in kwargs and "name" in kwargs):
                        abort(400)
 
-               package = getPackageByInfo(kwargs["author"], kwargs["name"])
+               author = kwargs["author"]
+               name = kwargs["name"]
+
+               package = getPackageByInfo(author, name)
+               if package is None:
+                       package = getPackageByInfo(author, name + "_game")
+                       if package is None or package.type != PackageType.GAME:
+                               abort(404)
+
+                       args = dict(kwargs)
+                       args["name"] = name + "_game"
+                       return redirect(url_for(request.endpoint, **args))
 
                del kwargs["author"]
                del kwargs["name"]
@@ -188,12 +228,27 @@ def is_package_page(f):
 
        return decorated_function
 
-def triggerNotif(owner, causer, title, url):
-       if owner.rank.atLeast(UserRank.NEW_MEMBER) and owner != causer:
-               Notification.query.filter_by(user=owner, url=url).delete()
-               notif = Notification(owner, causer, title, url)
+
+def addNotification(target, causer, title, url, package=None):
+       try:
+               iter(target)
+               for x in target:
+                       addNotification(x, causer, title, url, package)
+               return
+       except TypeError:
+               pass
+
+       if target.rank.atLeast(UserRank.NEW_MEMBER) and target != causer:
+               Notification.query.filter_by(user=target, causer=causer, title=title, url=url, package=package).delete()
+               notif = Notification(target, causer, title, url, package)
                db.session.add(notif)
 
+
+def addAuditLog(severity, causer, title, url, package=None, description=None):
+       entry = AuditLogEntry(causer, severity, title, url, package, description)
+       db.session.add(entry)
+
+
 def clearNotifications(url):
        if current_user.is_authenticated:
                Notification.query.filter_by(user=current_user, url=url).delete()
@@ -208,3 +263,9 @@ def isYes(val):
 
 def isNo(val):
        return val and not isYes(val)
+
+def nonEmptyOrNone(str):
+       if str is None or str == "":
+               return None
+
+       return str