示例#1
0
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)
示例#2
0
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)
示例#3
0
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)
示例#4
0
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)
示例#5
0
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)