diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index e6a81dd..ef2daed 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -18,8 +18,7 @@ from urllib.parse import quote as urlescape import flask_menu as menu -from celery import uuid -from flask import render_template, flash +from flask import render_template from flask_wtf import FlaskForm from flask_login import login_required from sqlalchemy import or_, func @@ -30,11 +29,12 @@ from wtforms.validators import * from app.querybuilder import QueryBuilder from app.rediscache import has_key, set_key -from app.tasks.importtasks import importRepoScreenshot, checkZipRelease +from app.tasks.importtasks import importRepoScreenshot from app.utils import * from . import bp, get_package_tabs from ...logic.LogicError import LogicError from ...logic.packages import do_edit_package +from app.models.packages import PackageProvides @menu.register_menu(bp, ".mods", "Mods", order=11, endpoint_arguments_constructor=lambda: { 'type': 'mod' }) @@ -118,26 +118,36 @@ def getReleases(package): @bp.route("/packages///") @is_package_page def view(package): - alternatives = None - if package.type == PackageType.MOD: - alternatives = Package.query \ - .filter_by(name=package.name, type=PackageType.MOD) \ - .filter(Package.id != package.id, Package.state!=PackageState.DELETED) \ - .order_by(db.desc(Package.score)) \ - .all() + show_similar = not package.approved and ( + current_user in package.maintainers or + package.checkPerm(current_user, Permission.APPROVE_NEW)) + packages_modnames = None + similar_topics = None + if show_similar and package.type != PackageType.TXP: + packages_modnames = Package.query.filter(Package.id != package.id, + Package.state != PackageState.DELETED) \ + .filter(Package.provides.any(PackageProvides.c.metapackage_id.in_([p.id for p in package.provides]))) \ + .order_by(db.desc(Package.score)) \ + .all() - show_similar_topics = current_user == package.author or \ - package.checkPerm(current_user, Permission.APPROVE_NEW) - - similar_topics = None if not show_similar_topics else \ - ForumTopic.query \ + similar_topics = ForumTopic.query \ .filter_by(name=package.name) \ .filter(ForumTopic.topic_id != package.forums) \ .filter(~ db.exists().where(Package.forums==ForumTopic.topic_id)) \ .order_by(db.asc(ForumTopic.name), db.asc(ForumTopic.title)) \ .all() + packages_uses = None + if package.type == PackageType.MOD: + packages_uses = Package.query.filter( + Package.type == PackageType.MOD, + Package.id != package.id, + Package.state != PackageState.DELETED, + Package.dependencies.any( + Dependency.meta_package_id.in_([p.id for p in package.provides]))) \ + .order_by(db.desc(Package.score)).limit(6).all() + releases = getReleases(package) review_thread = package.review_thread @@ -172,8 +182,8 @@ def view(package): has_review = current_user.is_authenticated and PackageReview.query.filter_by(package=package, author=current_user).count() > 0 return render_template("packages/view.html", - package=package, releases=releases, - alternatives=alternatives, similar_topics=similar_topics, + package=package, releases=releases, packages_uses=packages_uses, + packages_modnames=packages_modnames, similar_topics=similar_topics, review_thread=review_thread, topic_error=topic_error, topic_error_lvl=topic_error_lvl, threads=threads.all(), has_review=has_review) diff --git a/app/models/packages.py b/app/models/packages.py index a9da3ad..8bbb1ec 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -143,7 +143,7 @@ class PackagePropertyKey(enum.Enum): return str(value) -provides = db.Table("provides", +PackageProvides = db.Table("provides", db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True), db.Column("metapackage_id", db.Integer, db.ForeignKey("meta_package.id"), primary_key=True) ) @@ -296,7 +296,7 @@ class Package(db.Model): issueTracker = db.Column(db.String(200), nullable=True) forums = db.Column(db.Integer, nullable=True) - provides = db.relationship("MetaPackage", secondary=provides, order_by=db.asc("name"), back_populates="packages") + provides = db.relationship("MetaPackage", secondary=PackageProvides, order_by=db.asc("name"), back_populates="packages") dependencies = db.relationship("Dependency", back_populates="depender", lazy="dynamic", foreign_keys=[Dependency.depender_id]) @@ -615,7 +615,7 @@ class MetaPackage(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=True, nullable=False) dependencies = db.relationship("Dependency", back_populates="meta_package", lazy="dynamic") - packages = db.relationship("Package", lazy="dynamic", back_populates="provides", secondary=provides) + packages = db.relationship("Package", lazy="dynamic", back_populates="provides", secondary=PackageProvides) mp_name_valid = db.CheckConstraint("name ~* '^[a-z0-9_]+$'") diff --git a/app/templates/macros/package_approval.html b/app/templates/macros/package_approval.html index 8d5d7c7..b281ae9 100644 --- a/app/templates/macros/package_approval.html +++ b/app/templates/macros/package_approval.html @@ -1,4 +1,4 @@ -{% macro render_banners(package, current_user, topic_error, topic_error_lvl, similar_topics) -%} +{% macro render_banners(package, current_user, topic_error, topic_error_lvl, show_modname_warning) -%}
@@ -82,13 +82,10 @@
{% endif %} -{% if similar_topics %} +{% if show_modname_warning %}
- Please make sure that this package has the right to - the name '{{ package.name }}'. - See the - Inclusion Policy - for more info. + Please make sure that this package has the right to all the technical names it provides. + See the Inclusion Policy for more info.
{% endif %} diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html index 62821ef..efc1f1a 100644 --- a/app/templates/packages/view.html +++ b/app/templates/packages/view.html @@ -185,7 +185,7 @@
{% from "macros/package_approval.html" import render_banners %} - {{ render_banners(package, current_user, topic_error, topic_error_lvl, similar_topics) }} + {{ render_banners(package, current_user, topic_error, topic_error_lvl, similar_topics or packages_modnames) }} {% if review_thread and review_thread.checkPerm(current_user, "SEE_THREAD") %}

{% if review_thread.private %}🔒{% endif %} {{ review_thread.title }}

@@ -265,26 +265,46 @@ {% endif %} {{ render_reviews(package.reviews, current_user) }} - {% if alternatives %} -

Related

- + {% if packages_uses %} +

Used By

{% from "macros/packagegridtile.html" import render_pkggrid %} - {{ render_pkggrid(alternatives) }} + {{ render_pkggrid(packages_uses) }} {% endif %} - {% if similar_topics %} -

Similar Forum Topics

- + {% if packages_modnames or similar_topics %} +

Modname uniqueness

+ + {% if packages_modnames %} +

Packages sharing provided mods

+

+ This package contains modnames that are present in the following packages: +

+ + {% endif %} + + {% if similar_topics %} +

Similar Forum Topics

+ + {% endif %} {% endif %}