]> git.lizzy.rs Git - cheatdb.git/commitdiff
Remove dependencies, add meta packages
authorrubenwardy <rw@rubenwardy.com>
Sun, 27 May 2018 15:37:54 +0000 (16:37 +0100)
committerrubenwardy <rw@rubenwardy.com>
Sun, 27 May 2018 17:01:27 +0000 (18:01 +0100)
app/models.py
app/templates/packages/create_edit.html
app/templates/packages/editrequest_create_edit.html
app/templates/packages/view.html
app/views/packages/__init__.py
migrations/versions/900758871713_.py [new file with mode: 0644]
setup.py

index 142b61cdfb8d9631b85b5b4a8fa25416c36743c7..d715994b11acd8d9f9b94445fd9cebb849fc478e 100644 (file)
@@ -219,8 +219,7 @@ class PackagePropertyKey(enum.Enum):
        type         = "Type"
        license      = "License"
        tags         = "Tags"
-       harddeps     = "Hard Dependencies"
-       softdeps     = "Soft Dependencies"
+       provides     = "Provides"
        repo         = "Repository"
        website      = "Website"
        issueTracker = "Issue Tracker"
@@ -229,25 +228,20 @@ class PackagePropertyKey(enum.Enum):
        def convert(self, value):
                if self == PackagePropertyKey.tags:
                        return ",".join([t.title for t in value])
-               elif self == PackagePropertyKey.harddeps or self == PackagePropertyKey.softdeps:
-                       return ",".join([t.author.username + "/" + t.name for t in value])
-
+               elif self == PackagePropertyKey.provides:
+                       return ",".join([t.name for t in value])
                else:
                        return str(value)
 
-tags = db.Table("tags",
-    db.Column("tag_id", db.Integer, db.ForeignKey("tag.id"), primary_key=True),
-    db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
-)
 
-harddeps = db.Table("harddeps",
+provides = db.Table("provides",
        db.Column("package_id",    db.Integer, db.ForeignKey("package.id"), primary_key=True),
-    db.Column("dependency_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
+    db.Column("metapackage_id", db.Integer, db.ForeignKey("meta_package.id"), primary_key=True)
 )
 
-softdeps = db.Table("softdeps",
-       db.Column("package_id",    db.Integer, db.ForeignKey("package.id"), primary_key=True),
-    db.Column("dependency_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
+tags = db.Table("tags",
+    db.Column("tag_id", db.Integer, db.ForeignKey("tag.id"), primary_key=True),
+    db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
 )
 
 class Package(db.Model):
@@ -273,20 +267,11 @@ class Package(db.Model):
        issueTracker = db.Column(db.String(200), nullable=True)
        forums       = db.Column(db.Integer,     nullable=True)
 
-       tags = db.relationship("Tag", secondary=tags, lazy="subquery",
+       provides = db.relationship("MetaPackage", secondary=provides, lazy="subquery",
                        backref=db.backref("packages", lazy=True))
 
-       harddeps = db.relationship("Package",
-                               secondary=harddeps,
-                               primaryjoin=id==harddeps.c.package_id,
-                               secondaryjoin=id==harddeps.c.dependency_id,
-                               backref="dependents")
-
-       softdeps = db.relationship("Package",
-                               secondary=softdeps,
-                               primaryjoin=id==softdeps.c.package_id,
-                               secondaryjoin=id==softdeps.c.dependency_id,
-                               backref="softdependents")
+       tags = db.relationship("Tag", secondary=tags, lazy="subquery",
+                       backref=db.backref("packages", lazy=True))
 
        releases = db.relationship("PackageRelease", backref="package",
                        lazy="dynamic", order_by=db.desc("package_release_releaseDate"))
@@ -415,6 +400,16 @@ class Package(db.Model):
                else:
                        raise Exception("Permission {} is not related to packages".format(perm.name))
 
+class MetaPackage(db.Model):
+       id           = db.Column(db.Integer, primary_key=True)
+       name         = db.Column(db.String(100), unique=True, nullable=False)
+
+       def __init__(self, name=None):
+               self.name = name
+
+       def __str__(self):
+               return self.name
+
 class Tag(db.Model):
        id              = db.Column(db.Integer,    primary_key=True)
        name            = db.Column(db.String(100), unique=True, nullable=False)
@@ -552,42 +547,6 @@ class EditRequestChange(db.Model):
                                tag = Tag.query.filter_by(title=tagTitle.strip()).first()
                                package.tags.append(tag)
 
-               elif self.key == PackagePropertyKey.harddeps:
-                       package.harddeps.clear()
-                       for pair in self.newValue.split(","):
-                               key, value = pair.split("/")
-                               if key is None or value is None:
-                                       continue
-
-                               user = User.query.filter_by(username=key).first()
-                               if user is None:
-                                       continue
-
-                               dep = Package.query.filter_by(author=user, name=value, soft_deleted=False).first()
-                               if dep is None:
-                                       continue
-
-                               package.harddeps.append(dep)
-
-               elif self.key == PackagePropertyKey.softdeps:
-                       package.softdeps.clear()
-                       for pair in self.newValue.split(","):
-                               key, value = pair.split("/")
-                               if key is None or value is None:
-                                       continue
-
-                               user = User.query.filter_by(username=key).first()
-                               if user is None:
-                                       raise Exception("No such user!")
-                                       continue
-
-                               dep = Package.query.filter_by(author=user, name=value).first()
-                               if dep is None:
-                                       raise Exception("No such package!")
-                                       continue
-
-                               package.softdeps.append(dep)
-
                else:
                        setattr(package, self.key.name, self.newValue)
 
index fc3715aa03600b912f93294633acf0f65b53b47b..4f053dde5068cb8d566b2dd83c5d0c9106679313 100644 (file)
@@ -23,8 +23,6 @@
                {{ render_field(form.type, class_="pkg_meta") }}
                {{ render_field(form.license, class_="pkg_meta") }}
                {{ render_multiselect_field(form.tags, class_="pkg_meta") }}
-               {{ render_multiselect_field(form.harddeps, class_="pkg_meta") }}
-               {{ render_multiselect_field(form.softdeps, class_="pkg_meta") }}
 
                <div class="pkg_wiz_1">
                        <p>Enter the repo URL for the package.
index 987a29227ccca53aa2beff18cd300d2dad8b250b..d2452064aeb3cd968a08fdfa9b4f724f60d3e2e3 100644 (file)
@@ -18,8 +18,6 @@
                {{ render_field(form.type) }}
                {{ render_field(form.license) }}
                {{ render_multiselect_field(form.tags) }}
-               {{ render_multiselect_field(form.harddeps) }}
-               {{ render_multiselect_field(form.softdeps) }}
                {{ render_field(form.repo) }}
                {{ render_field(form.website) }}
                {{ render_field(form.issueTracker) }}
index d6b74a680f6e9af395839882d1e86c6ef240b4ce..1f6ada554f4db9fcad00a7fe546088ac95ffd981 100644 (file)
                                        <td>Name</td>
                                        <td>{{ package.name }}</td>
                                </tr>
+                               <tr>
+                                       <td>Provides</td>
+                                       <td>{{ package.provides | join(', ') }}</td>
+                               </tr>
                                <tr>
                                        <td>Author</td>
                                        <td class="{{ package.author.rank }}">
                {% endfor %}
        </ul>
 
-       <table class="table-topalign">
+       <!-- <table class="table-topalign">
                <tr>
                        <td>
                                <h3>Dependencies</h3>
                                </ul>
                        </td>
                </tr>
-       </table>
+       </table> -->
 
        {% if current_user.is_authenticated or requests %}
                <h3>Edit Requests</h3>
index c60d68d69fc2fffada771e06cf86a35011e3a11a..5735d5a2bebd5d38ee682936d0fea9170f3bf7d0 100644 (file)
@@ -107,8 +107,6 @@ class PackageForm(FlaskForm):
        type          = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
        license       = QuerySelectField("License", [InputRequired()], query_factory=lambda: License.query, get_pk=lambda a: a.id, get_label=lambda a: a.name)
        tags          = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query.order_by(db.asc(Tag.name)), get_pk=lambda a: a.id, get_label=lambda a: a.title)
-       harddeps      = QuerySelectMultipleField('Dependencies', query_factory=lambda: Package.query.filter_by(soft_deleted=False,approved=True).join(User).order_by(db.asc(Package.title), db.asc(User.display_name)), get_pk=lambda a: a.id, get_label=lambda a: a.title + " by " + a.author.display_name)
-       softdeps      = QuerySelectMultipleField('Soft Dependencies', query_factory=lambda: Package.query.filter_by(soft_deleted=False,approved=True).join(User).order_by(db.asc(Package.title), db.asc(User.display_name)), get_pk=lambda a: a.id, get_label=lambda a: a.title + " by " + a.author.display_name)
        repo          = StringField("Repo URL", [Optional(), URL()])
        website       = StringField("Website URL", [Optional(), URL()])
        issueTracker  = StringField("Issue Tracker URL", [Optional(), URL()])
diff --git a/migrations/versions/900758871713_.py b/migrations/versions/900758871713_.py
new file mode 100644 (file)
index 0000000..ed1ce98
--- /dev/null
@@ -0,0 +1,57 @@
+"""empty message
+
+Revision ID: 900758871713
+Revises: ea5a023711e0
+Create Date: 2018-05-27 16:36:44.258935
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '900758871713'
+down_revision = 'ea5a023711e0'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table('meta_package',
+        sa.Column('id', sa.Integer(), nullable=False),
+        sa.Column('name', sa.String(length=100), nullable=False),
+        sa.PrimaryKeyConstraint('id'),
+        sa.UniqueConstraint('name')
+    )
+    op.create_table('provides',
+        sa.Column('package_id', sa.Integer(), nullable=False),
+        sa.Column('metapackage_id', sa.Integer(), nullable=False),
+        sa.ForeignKeyConstraint(['metapackage_id'], ['meta_package.id'], ),
+        sa.ForeignKeyConstraint(['package_id'], ['package.id'], ),
+        sa.PrimaryKeyConstraint('package_id', 'metapackage_id')
+    )
+    op.drop_table('harddeps')
+    op.drop_table('softdeps')
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table('softdeps',
+        sa.Column('package_id', sa.INTEGER(), nullable=False),
+        sa.Column('dependency_id', sa.INTEGER(), nullable=False),
+        sa.ForeignKeyConstraint(['dependency_id'], ['package.id'], ),
+        sa.ForeignKeyConstraint(['package_id'], ['package.id'], ),
+        sa.PrimaryKeyConstraint('package_id', 'dependency_id')
+    )
+    op.create_table('harddeps',
+        sa.Column('package_id', sa.INTEGER(), nullable=False),
+        sa.Column('dependency_id', sa.INTEGER(), nullable=False),
+        sa.ForeignKeyConstraint(['dependency_id'], ['package.id'], ),
+        sa.ForeignKeyConstraint(['package_id'], ['package.id'], ),
+        sa.PrimaryKeyConstraint('package_id', 'dependency_id')
+    )
+    op.drop_table('provides')
+    op.drop_table('meta_package')
+    # ### end Alembic commands ###
index d910db74b0601a89450307f28e61923da4fd2c7b..22b80cf03e6058d75e00d4142743077b6e02091b 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -255,7 +255,6 @@ No warranty is provided, express or implied, for any part of the project.
        mod.title = "Sweet Foods"
        mod.license = licenses["CC0"]
        mod.type = PackageType.MOD
-       mod.harddeps.append(food)
        mod.author = ruben
        mod.tags.append(tags["player_effects"])
        mod.repo = "https://github.com/rubenwardy/food_sweet/"
@@ -314,6 +313,19 @@ Uses the CTF PvP Engine.
        rel.approved = True
        db.session.add(rel)
 
+       db.session.commit()
+
+       metas = {}
+       for package in Package.query.filter_by(type=PackageType.MOD).all():
+               meta = None
+               try:
+                       meta = metas[package.name]
+               except KeyError:
+                       meta = MetaPackage(package.name)
+                       db.session.add(meta)
+                       metas[package.name] = meta
+               package.provides.append(meta)
+
 
 delete_db = len(sys.argv) >= 2 and sys.argv[1].strip() == "-d"
 if delete_db and os.path.isfile("db.sqlite"):