def view(id): clearNotifications(url_for("threads.view", id=id)) thread = Thread.query.get(id) if thread is None or not thread.checkPerm(current_user, Permission.SEE_THREAD): abort(404) if current_user.is_authenticated and request.method == "POST": comment = request.form["comment"] if not current_user.canCommentRL(): flash("Please wait before commenting again", "danger") if package: return redirect(package.getDetailsURL()) else: return redirect(url_for("homepage.home")) if len(comment) <= 500 and len(comment) > 3: reply = ThreadReply() reply.author = current_user reply.comment = comment db.session.add(reply) thread.replies.append(reply) if not current_user in thread.watchers: thread.watchers.append(current_user) msg = None if thread.package is None: msg = "New comment on '{}'".format(thread.title) else: msg = "New comment on '{}' on package {}".format( thread.title, thread.package.title) for user in thread.watchers: if user != current_user: triggerNotif(user, current_user, msg, url_for("threads.view", id=thread.id)) db.session.commit() return redirect(url_for("threads.view", id=id)) else: flash("Comment needs to be between 3 and 500 characters.") return render_template("threads/view.html", thread=thread)
def admin_page(): if request.method == "POST": action = request.form["action"] if action == "delstuckreleases": PackageRelease.query.filter( PackageRelease.task_id != None).delete() db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "checkreleases": releases = PackageRelease.query.filter( PackageRelease.url.like("/uploads/%")).all() tasks = [] for release in releases: zippath = release.url.replace("/uploads/", app.config["UPLOAD_DIR"]) tasks.append(checkZipRelease.s(release.id, zippath)) result = group(tasks).apply_async() while not result.ready(): import time time.sleep(0.1) return redirect(url_for("todo.view")) elif action == "importmodlist": task = importTopicList.delay() return redirect( url_for("tasks.check", id=task.id, r=url_for("todo.topics"))) elif action == "checkusers": task = checkAllForumAccounts.delay() return redirect( url_for("tasks.check", id=task.id, r=url_for("admin.admin_page"))) elif action == "importscreenshots": packages = Package.query \ .filter_by(soft_deleted=False) \ .outerjoin(PackageScreenshot, Package.id==PackageScreenshot.package_id) \ .filter(PackageScreenshot.id==None) \ .all() for package in packages: importRepoScreenshot.delay(package.id) return redirect(url_for("admin.admin_page")) elif action == "restore": package = Package.query.get(request.form["package"]) if package is None: flash("Unknown package", "danger") else: package.soft_deleted = False db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "importdepends": task = importAllDependencies.delay() return redirect( url_for("tasks.check", id=task.id, r=url_for("admin.admin_page"))) elif action == "modprovides": packages = Package.query.filter_by(type=PackageType.MOD).all() mpackage_cache = {} for p in packages: if len(p.provides) == 0: p.provides.append( MetaPackage.GetOrCreate(p.name, mpackage_cache)) db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "recalcscores": for p in Package.query.all(): p.setStartScore() db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "vcsrelease": for package in Package.query.filter( Package.repo.isnot(None)).all(): if package.releases.count() != 0: continue rel = PackageRelease() rel.package = package rel.title = datetime.date.today().isoformat() rel.url = "" rel.task_id = uuid() rel.approved = True db.session.add(rel) db.session.commit() makeVCSRelease.apply_async((rel.id, "master"), task_id=rel.task_id) msg = "{}: Release {} created".format(package.title, rel.title) triggerNotif(package.author, current_user, msg, rel.getEditURL()) db.session.commit() else: flash("Unknown action: " + action, "danger") deleted_packages = Package.query.filter_by(soft_deleted=True).all() return render_template("admin/list.html", deleted_packages=deleted_packages)
def admin_page(): if request.method == "POST": action = request.form["action"] if action == "delstuckreleases": PackageRelease.query.filter(PackageRelease.task_id != None).delete() db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "checkreleases": releases = PackageRelease.query.filter(PackageRelease.url.like("/uploads/%")).all() tasks = [] for release in releases: zippath = release.url.replace("/uploads/", app.config["UPLOAD_DIR"]) tasks.append(checkZipRelease.s(release.id, zippath)) result = group(tasks).apply_async() while not result.ready(): import time time.sleep(0.1) return redirect(url_for("todo.view")) elif action == "importmodlist": task = importTopicList.delay() return redirect(url_for("tasks.check", id=task.id, r=url_for("todo.topics"))) elif action == "checkusers": task = checkAllForumAccounts.delay() return redirect(url_for("tasks.check", id=task.id, r=url_for("admin.admin_page"))) elif action == "importscreenshots": packages = Package.query \ .filter_by(soft_deleted=False) \ .outerjoin(PackageScreenshot, Package.id==PackageScreenshot.package_id) \ .filter(PackageScreenshot.id==None) \ .all() for package in packages: importRepoScreenshot.delay(package.id) return redirect(url_for("admin.admin_page")) elif action == "restore": package = Package.query.get(request.form["package"]) if package is None: flash("Unknown package", "danger") else: package.soft_deleted = False db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "modprovides": packages = Package.query.filter_by(type=PackageType.MOD).all() mpackage_cache = {} for p in packages: if len(p.provides) == 0: p.provides.append(MetaPackage.GetOrCreate(p.name, mpackage_cache)) db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "recalcscores": for p in Package.query.all(): p.setStartScore() db.session.commit() return redirect(url_for("admin.admin_page")) elif action == "vcsrelease": for package in Package.query.filter(Package.repo.isnot(None)).all(): if package.releases.count() != 0: continue rel = PackageRelease() rel.package = package rel.title = datetime.date.today().isoformat() rel.url = "" rel.task_id = uuid() rel.approved = True db.session.add(rel) db.session.commit() makeVCSRelease.apply_async((rel.id, "master"), task_id=rel.task_id) msg = "{}: Release {} created".format(package.title, rel.title) triggerNotif(package.author, current_user, msg, rel.getEditURL()) db.session.commit() elif action == "cleanuploads": upload_dir = app.config['UPLOAD_DIR'] (_, _, filenames) = next(os.walk(upload_dir)) existing_uploads = set(filenames) if len(existing_uploads) != 0: def getURLsFromDB(column): results = db.session.query(column).filter(column != None, column != "").all() return set([os.path.basename(x[0]) for x in results]) release_urls = getURLsFromDB(PackageRelease.url) screenshot_urls = getURLsFromDB(PackageScreenshot.url) db_urls = release_urls.union(screenshot_urls) unreachable = existing_uploads.difference(db_urls) import sys print("On Disk: ", existing_uploads, file=sys.stderr) print("In DB: ", db_urls, file=sys.stderr) print("Unreachable: ", unreachable, file=sys.stderr) for filename in unreachable: os.remove(os.path.join(upload_dir, filename)) flash("Deleted " + str(len(unreachable)) + " unreachable uploads", "success") else: flash("No downloads to create", "danger") else: flash("Unknown action: " + action, "danger") deleted_packages = Package.query.filter_by(soft_deleted=True).all() return render_template("admin/list.html", deleted_packages=deleted_packages)
def new(): form = ThreadForm(formdata=request.form) package = None if "pid" in request.args: package = Package.query.get(int(request.args.get("pid"))) if package is None: flash("Unable to find that package!", "error") # Don't allow making orphan threads on approved packages for now if package is None: abort(403) def_is_private = request.args.get("private") or False if package is None: def_is_private = True allow_change = package and package.approved is_review_thread = package and not package.approved # Check that user can make the thread if not package.checkPerm(current_user, Permission.CREATE_THREAD): flash("Unable to create thread!", "error") return redirect(url_for("homepage.home")) # Only allow creating one thread when not approved elif is_review_thread and package.review_thread is not None: flash("A review thread already exists!", "error") return redirect(url_for("threads.view", id=package.review_thread.id)) elif not current_user.canOpenThreadRL(): flash("Please wait before opening another thread", "danger") if package: return redirect(package.getDetailsURL()) else: return redirect(url_for("homepage.home")) # Set default values elif request.method == "GET": form.private.data = def_is_private form.title.data = request.args.get("title") or "" # Validate and submit elif request.method == "POST" and form.validate(): thread = Thread() thread.author = current_user thread.title = form.title.data thread.private = form.private.data if allow_change else def_is_private thread.package = package db.session.add(thread) thread.watchers.append(current_user) if package is not None and package.author != current_user: thread.watchers.append(package.author) reply = ThreadReply() reply.thread = thread reply.author = current_user reply.comment = form.comment.data db.session.add(reply) thread.replies.append(reply) db.session.commit() if is_review_thread: package.review_thread = thread notif_msg = None if package is not None: notif_msg = "New thread '{}' on package {}".format( thread.title, package.title) triggerNotif(package.author, current_user, notif_msg, url_for("threads.view", id=thread.id)) else: notif_msg = "New thread '{}'".format(thread.title) for user in User.query.filter(User.rank >= UserRank.EDITOR).all(): triggerNotif(user, current_user, notif_msg, url_for("threads.view", id=thread.id)) db.session.commit() return redirect(url_for("threads.view", id=thread.id)) return render_template("threads/new.html", form=form, allow_private_change=allow_change, package=package)
def admin_page(): if request.method == "POST": action = request.form["action"] if action == "importmodlist": task = importTopicList.delay() return redirect( url_for("check_task", id=task.id, r=url_for("todo_topics_page"))) elif action == "importscreenshots": packages = Package.query \ .filter_by(soft_deleted=False) \ .outerjoin(PackageScreenshot, Package.id==PackageScreenshot.package_id) \ .filter(PackageScreenshot.id==None) \ .all() for package in packages: importRepoScreenshot.delay(package.id) return redirect(url_for("admin_page")) elif action == "restore": package = Package.query.get(request.form["package"]) if package is None: flash("Unknown package", "error") else: package.soft_deleted = False db.session.commit() return redirect(url_for("admin_page")) elif action == "importdepends": task = importAllDependencies.delay() return redirect( url_for("check_task", id=task.id, r=url_for("admin_page"))) elif action == "modprovides": packages = Package.query.filter_by(type=PackageType.MOD).all() mpackage_cache = {} for p in packages: if len(p.provides) == 0: p.provides.append( MetaPackage.GetOrCreate(p.name, mpackage_cache)) db.session.commit() return redirect(url_for("admin_page")) elif action == "recalcscores": for p in Package.query.all(): p.recalcScore() db.session.commit() return redirect(url_for("admin_page")) elif action == "vcsrelease": for package in Package.query.filter( Package.repo.isnot(None)).all(): if package.releases.count() != 0: continue rel = PackageRelease() rel.package = package rel.title = datetime.date.today().isoformat() rel.url = "" rel.task_id = uuid() rel.approved = True db.session.add(rel) db.session.commit() makeVCSRelease.apply_async((rel.id, "master"), task_id=rel.task_id) msg = "{}: Release {} created".format(package.title, rel.title) triggerNotif(package.author, current_user, msg, rel.getEditURL()) db.session.commit() else: flash("Unknown action: " + action, "error") deleted_packages = Package.query.filter_by(soft_deleted=True).all() return render_template("admin/list.html", deleted_packages=deleted_packages)