diff --git a/aurweb/git/update.py b/aurweb/git/update.py index 1118340d..70b20b48 100755 --- a/aurweb/git/update.py +++ b/aurweb/git/update.py @@ -5,6 +5,7 @@ import re import subprocess import sys import time +from datetime import datetime import pygit2 import srcinfo.parse @@ -92,7 +93,7 @@ def save_metadata(metadata, conn, user): # noqa: C901 user_id = int(cur.fetchone()[0]) # Update package base details and delete current packages. - now = int(time.time()) + now = int(datetime.utcnow().timestamp()) conn.execute( "UPDATE PackageBases SET ModifiedTS = ?, " + "PackagerUID = ?, OutOfDateTS = NULL WHERE ID = ?", @@ -230,6 +231,14 @@ def save_metadata(metadata, conn, user): # noqa: C901 [pkgbase_id, user_id], ) + # Update timestamp, set MetaModifiedTS after all the record + # updates we just made. + now = int(datetime.utcnow().timestamp()) + conn.execute( + "UPDATE PackageBases SET MetaModifiedTS = ? WHERE ID = ?", + [now, pkgbase_id], + ) + conn.commit() diff --git a/aurweb/models/package_base.py b/aurweb/models/package_base.py index 26d9165f..c9267c14 100644 --- a/aurweb/models/package_base.py +++ b/aurweb/models/package_base.py @@ -55,6 +55,8 @@ class PackageBase(Base): self.SubmittedTS = now if not self.ModifiedTS: self.ModifiedTS = now + if not self.MetaModifiedTS: + self.MetaModifiedTS = now if not self.FlaggerComment: self.FlaggerComment = str() diff --git a/aurweb/routers/pkgbase.py b/aurweb/routers/pkgbase.py index 213348cd..965e740f 100644 --- a/aurweb/routers/pkgbase.py +++ b/aurweb/routers/pkgbase.py @@ -123,6 +123,8 @@ async def pkgbase_keywords( for keyword in new_keywords: db.create(PackageKeyword, PackageBase=pkgbase, Keyword=keyword) + pkgbase.MetaModifiedTS = time.utcnow() + return RedirectResponse(f"/pkgbase/{name}", status_code=HTTPStatus.SEE_OTHER) diff --git a/aurweb/schema.py b/aurweb/schema.py index 76fd6556..4e3c2975 100644 --- a/aurweb/schema.py +++ b/aurweb/schema.py @@ -15,6 +15,7 @@ from sqlalchemy import ( String, Table, Text, + func, text, ) from sqlalchemy.dialects.mysql import BIGINT, DECIMAL, INTEGER, TINYINT @@ -170,6 +171,12 @@ PackageBases = Table( Column("FlaggerComment", Text, nullable=False), Column("SubmittedTS", BIGINT(unsigned=True), nullable=False), Column("ModifiedTS", BIGINT(unsigned=True), nullable=False), + Column( + "MetaModifiedTS", + BIGINT(unsigned=True), + nullable=False, + server_default=func.now(), + ), Column( "FlaggerUID", ForeignKey("Users.ID", ondelete="SET NULL") ), # who flagged the package out-of-date? diff --git a/migrations/versions/42584a60e7a7_add_metamodifiedts_to_packagebase.py b/migrations/versions/42584a60e7a7_add_metamodifiedts_to_packagebase.py new file mode 100644 index 00000000..27e3d1ff --- /dev/null +++ b/migrations/versions/42584a60e7a7_add_metamodifiedts_to_packagebase.py @@ -0,0 +1,31 @@ +"""add MetaModifiedTS to PackageBase + +Revision ID: 42584a60e7a7 +Revises: d64e5571bc8d +Create Date: 2022-09-06 12:37:49.460344 + +""" +from alembic import op +from sqlalchemy.exc import OperationalError + +from aurweb.models import PackageBase + +# revision identifiers, used by Alembic. +revision = "42584a60e7a7" +down_revision = "d64e5571bc8d" +branch_labels = None +depends_on = None + +table = PackageBase.__tablename__ + + +def upgrade(): + try: + op.add_column(table, PackageBase.__table__.c.MetaModifiedTS) + except OperationalError as e: + print(e) + print("MetaModifiedTS column already exists") + + +def downgrade(): + op.remove_column(table, "MetaModifiedTS") diff --git a/test/test_migrations.py b/test/test_migrations.py new file mode 100644 index 00000000..550024e7 --- /dev/null +++ b/test/test_migrations.py @@ -0,0 +1,49 @@ +import pytest + +from aurweb import db +from aurweb.models import PackageBase, User +from aurweb.time import utcnow + + +@pytest.fixture(autouse=True) +def setup(db_test: None) -> None: + pass + + +@pytest.fixture +def user() -> User: + + with db.begin(): + user_ = db.create(User, Username="test", Email="test@example.org") + + yield user_ + + +@pytest.fixture +def pkgbase(user: User) -> PackageBase: + now = utcnow() + + with db.begin(): + pkgbase_ = db.create( + PackageBase, + Name="pkg", + ModifiedTS=now, + MetaModifiedTS=now, + SubmittedTS=now, + Maintainer=user, + Packager=user, + ) + + yield pkgbase_ + + +def test_package_base_columns(user: User, pkgbase: PackageBase): + assert pkgbase.Name == "pkg" + + assert bool(pkgbase.SubmittedTS) + assert bool(pkgbase.ModifiedTS) + assert bool(pkgbase.MetaModifiedTS) + + assert pkgbase.Maintainer == user + assert pkgbase.Packager == user + assert pkgbase.Flagger is None