From c6e138c1766f47f3fd88ff1ea01b5743083513b5 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 1 Jan 2024 03:09:01 +0100 Subject: [PATCH 1/8] fix beta label and use different labels for active and inactive packages - apply "beta" to package versions instead of packages - use green labels for active packages - use default (gray) label for inactive packages and add tooltip telling the package is inactive - update version date (cut microseconds) - fix unclosed span tag in package.html --- spkrepo/templates/frontend/package.html | 29 +++++++++++++----------- spkrepo/templates/frontend/packages.html | 4 +--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/spkrepo/templates/frontend/package.html b/spkrepo/templates/frontend/package.html index fc943a1..37b4140 100644 --- a/spkrepo/templates/frontend/package.html +++ b/spkrepo/templates/frontend/package.html @@ -8,9 +8,7 @@

{{ package.versions[-1].displaynames['enu'].displayname }} - v{{ package.versions[-1].version_string }} - {% if package.versions[-1].report_url %}beta{% endif %} - + v{{ package.versions[-1].version_string }}

{{ package.versions[-1].descriptions['enu'].description }}

@@ -20,31 +18,36 @@

{{ package.versions[-1].displaynames['enu'].displaynam

{% for version in package.versions|reverse %}
-
Version {{ version.version_string | safe }}
+
Version {{ version.version_string | safe }}{% if version.report_url %} beta{% endif %}
{{ version.changelog | safe }}
Date
-
{{ version.insert_date }}
+
{{ version.insert_date.replace(microsecond=0) }}
Architectures
- {% for (version, builds) in version.builds_per_dsm.items() %} + {% for (version, builds) in version.builds_per_dsm.items() %} {% if version == '1' %} - SRM {{ version }}.x: + SRM {{ version }}.x: {% else %} - DSM {{ version }}.x: + DSM {{ version }}.x: {% endif %} {% for build in builds %} - {% for arch in build.architectures %} - {{ build.firmware.version }} {{ arch.code }} - {% endfor %} + {% if build.active %} + {% for arch in build.architectures %} + {{ build.firmware.version }} {{ arch.code }} + {% endfor %} + {% else %} + {% for arch in build.architectures %} + {{ build.firmware.version }} {{ arch.code }} + {% endfor %} + {% endif %} {% endfor %}
- {% endfor %} + {% endfor %}
{% endfor %}
- {% endblock %} diff --git a/spkrepo/templates/frontend/packages.html b/spkrepo/templates/frontend/packages.html index fcac622..7996db1 100644 --- a/spkrepo/templates/frontend/packages.html +++ b/spkrepo/templates/frontend/packages.html @@ -12,9 +12,7 @@

{{ version.displaynames['enu'].displayname }} - v{{ version.version_string }} - {% if version.report_url %}beta{% endif %} - + v{{ version.version_string }}

{{ version.descriptions['enu'].description }}

From 0f4793ecbc65eaac8f251165c4b59f41a93492ea Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 1 Jan 2024 03:12:38 +0100 Subject: [PATCH 2/8] show packages without active versions (leftover of #106) - do not hide package in packages when there is no active version (https://github.com/SynoCommunity/spksrc/issues/5803) - remove obsolete TODOs --- spkrepo/views/admin.py | 4 ++-- spkrepo/views/frontend.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/spkrepo/views/admin.py b/spkrepo/views/admin.py index 08d7533..e4a6967 100644 --- a/spkrepo/views/admin.py +++ b/spkrepo/views/admin.py @@ -290,7 +290,7 @@ def on_model_delete(self, model): ("upgrade_wizard", "upgrade_wizard"), ("startable", "startable"), ) - # TODO: Add beta and all_builds_active with Flask-Admin>1.0.8 + column_default_sort = (Version.insert_date, True) # Custom queries @@ -533,7 +533,7 @@ def can_unsign(self): ("insert_date", "insert_date"), ("active", "active"), ) - # TODO: Add version.package with Flask-Admin>1.0.8 + column_default_sort = (Build.insert_date, True) # Custom queries diff --git a/spkrepo/views/frontend.py b/spkrepo/views/frontend.py index 18a24d4..65f2334 100644 --- a/spkrepo/views/frontend.py +++ b/spkrepo/views/frontend.py @@ -64,12 +64,12 @@ def profile(): @frontend.route("/packages") def packages(): + # show only packages with at least one version, but ignore whether builds are active latest_version = ( db.session.query( Version.package_id, db.func.max(Version.version).label("latest_version") ) .join(Build) - .filter(Build.active) .group_by(Version.package_id) .subquery() ) @@ -96,7 +96,6 @@ def packages(): @frontend.route("/package/") def package(name): - # TODO: show only packages with at least a version and an active build package = Package.query.filter_by(name=name).first() if package is None: abort(404) From fed32c9e347c8b706cc16481b7eca3c9f6995d4a Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 1 Jan 2024 03:52:01 +0100 Subject: [PATCH 3/8] adjust tests for beta labels and inactive packages --- spkrepo/tests/test_frontend.py | 75 +++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/spkrepo/tests/test_frontend.py b/spkrepo/tests/test_frontend.py index 4e467ea..4bd76e8 100644 --- a/spkrepo/tests/test_frontend.py +++ b/spkrepo/tests/test_frontend.py @@ -24,7 +24,7 @@ def test_get_logged_user(self): class PackagesTestCase(BaseTestCase): - def test_get_active_stable(self): + def test_get_active(self): build = BuildFactory(version__report_url=None, active=True) db.session.commit() response = self.client.get(url_for("frontend.packages")) @@ -35,8 +35,8 @@ def test_get_active_stable(self): ) self.assertNotIn("beta", response.data.decode()) - def test_get_active_not_stable(self): - build = BuildFactory(active=True) + def test_get_not_active(self): + build = BuildFactory(active=False) db.session.commit() response = self.client.get(url_for("frontend.packages")) self.assert200(response) @@ -44,36 +44,58 @@ def test_get_active_not_stable(self): build.version.displaynames["enu"].displayname, response.data.decode(), ) - self.assertIn("beta", response.data.decode()) - def test_get_not_active_not_stable(self): - build = BuildFactory(active=False) + +class PackageTestCase(BaseTestCase): + def test_get_active_stable(self): + build = BuildFactory( + version__package__author=UserFactory(), + version__report_url=None, + active=True, + ) db.session.commit() - response = self.client.get(url_for("frontend.packages")) + response = self.client.get( + url_for("frontend.package", name=build.version.package.name) + ) self.assert200(response) - self.assertNotIn( + for a in build.architectures: + self.assertIn(a.code, response.data.decode()) + self.assertIn( build.version.displaynames["enu"].displayname, response.data.decode(), ) + self.assertIn( + build.version.descriptions["enu"].description, + response.data.decode(), + ) self.assertNotIn("beta", response.data.decode()) def test_get_not_active_stable(self): - build = BuildFactory(active=False) + build = BuildFactory( + version__package__author=UserFactory(), + version__report_url=None, + active=False, + ) db.session.commit() - response = self.client.get(url_for("frontend.packages")) + response = self.client.get( + url_for("frontend.package", name=build.version.package.name) + ) self.assert200(response) - self.assertNotIn( + for a in build.architectures: + self.assertIn(a.code, response.data.decode()) + self.assertIn( build.version.displaynames["enu"].displayname, response.data.decode(), ) + self.assertIn( + build.version.descriptions["enu"].description, + response.data.decode(), + ) self.assertNotIn("beta", response.data.decode()) - -class PackageTestCase(BaseTestCase): - def test_get(self): + def test_get_active_not_stable(self): build = BuildFactory( version__package__author=UserFactory(), - version__report_url=None, active=True, ) db.session.commit() @@ -91,6 +113,29 @@ def test_get(self): build.version.descriptions["enu"].description, response.data.decode(), ) + self.assertIn("beta", response.data.decode()) + + def test_get_not_active_not_stable(self): + build = BuildFactory( + version__package__author=UserFactory(), + active=False, + ) + db.session.commit() + response = self.client.get( + url_for("frontend.package", name=build.version.package.name) + ) + self.assert200(response) + for a in build.architectures: + self.assertIn(a.code, response.data.decode()) + self.assertIn( + build.version.displaynames["enu"].displayname, + response.data.decode(), + ) + self.assertIn( + build.version.descriptions["enu"].description, + response.data.decode(), + ) + self.assertIn("beta", response.data.decode()) def test_get_no_package(self): response = self.client.get(url_for("frontend.package", name="no-package")) From 0ce2d0235fccb62df07d23dfe1898b9c7606b974 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 1 Jan 2024 13:47:33 +0100 Subject: [PATCH 4/8] enhance frontend tests --- spkrepo/tests/test_frontend.py | 66 +++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/spkrepo/tests/test_frontend.py b/spkrepo/tests/test_frontend.py index 4bd76e8..2948da4 100644 --- a/spkrepo/tests/test_frontend.py +++ b/spkrepo/tests/test_frontend.py @@ -12,38 +12,45 @@ class IndexTestCase(BaseTestCase): def test_get_anonymous(self): response = self.client.get(url_for("frontend.index")) self.assert200(response) - self.assertIn("Login", response.data.decode()) - self.assertIn("Register", response.data.decode()) + response_data = response.data.decode() + self.assertIn("Login", response_data) + self.assertIn("Register", response_data) def test_get_logged_user(self): with self.logged_user(): response = self.client.get(url_for("frontend.index")) self.assert200(response) - self.assertIn("Logout", response.data.decode()) - self.assertIn("Profile", response.data.decode()) + response_data = response.data.decode() + self.assertIn("Logout", response_data) + self.assertIn("Profile", response_data) class PackagesTestCase(BaseTestCase): - def test_get_active(self): + # Assert beta is not shown on Packages page + def test_get_active_not_stable(self): build = BuildFactory(version__report_url=None, active=True) db.session.commit() response = self.client.get(url_for("frontend.packages")) self.assert200(response) + response_data = response.data.decode() self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) - self.assertNotIn("beta", response.data.decode()) + self.assertNotIn("beta", response_data) - def test_get_not_active(self): + # Assert package with only inactive version(s) is shown on Packages page + def test_get_not_active_not_stable(self): build = BuildFactory(active=False) db.session.commit() response = self.client.get(url_for("frontend.packages")) self.assert200(response) + response_data = response.data.decode() self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) + self.assertNotIn("beta", response_data) class PackageTestCase(BaseTestCase): @@ -58,17 +65,19 @@ def test_get_active_stable(self): url_for("frontend.package", name=build.version.package.name) ) self.assert200(response) + response_data = response.data.decode() for a in build.architectures: - self.assertIn(a.code, response.data.decode()) + self.assertIn(a.code, response_data) self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) self.assertIn( build.version.descriptions["enu"].description, - response.data.decode(), + response_data, ) - self.assertNotIn("beta", response.data.decode()) + self.assertNotIn("beta", response_data) + self.assertIn("label label-success", response_data) def test_get_not_active_stable(self): build = BuildFactory( @@ -81,17 +90,19 @@ def test_get_not_active_stable(self): url_for("frontend.package", name=build.version.package.name) ) self.assert200(response) + response_data = response.data.decode() for a in build.architectures: - self.assertIn(a.code, response.data.decode()) + self.assertIn(a.code, response_data) self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) self.assertIn( build.version.descriptions["enu"].description, - response.data.decode(), + response_data, ) - self.assertNotIn("beta", response.data.decode()) + self.assertNotIn("beta", response_data) + self.assertIn("label label-default", response_data) def test_get_active_not_stable(self): build = BuildFactory( @@ -103,17 +114,19 @@ def test_get_active_not_stable(self): url_for("frontend.package", name=build.version.package.name) ) self.assert200(response) + response_data = response.data.decode() for a in build.architectures: - self.assertIn(a.code, response.data.decode()) + self.assertIn(a.code, response_data) self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) self.assertIn( build.version.descriptions["enu"].description, - response.data.decode(), + response_data, ) - self.assertIn("beta", response.data.decode()) + self.assertIn("beta", response_data) + self.assertIn("label label-success", response_data) def test_get_not_active_not_stable(self): build = BuildFactory( @@ -125,17 +138,20 @@ def test_get_not_active_not_stable(self): url_for("frontend.package", name=build.version.package.name) ) self.assert200(response) + response_data = response.data.decode() for a in build.architectures: - self.assertIn(a.code, response.data.decode()) + self.assertIn(a.code, response_data) self.assertIn( build.version.displaynames["enu"].displayname, - response.data.decode(), + response_data, ) self.assertIn( build.version.descriptions["enu"].description, - response.data.decode(), + response_data, ) - self.assertIn("beta", response.data.decode()) + self.assertIn("beta", response_data) + self.assertIn("label label-default", response_data) + self.assertIn("Inactive: Manual installation only.", response_data) def test_get_no_package(self): response = self.client.get(url_for("frontend.package", name="no-package")) From 5bce17219319e29dc4b2648b64ea706c28e49a45 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 8 Jan 2024 19:01:31 +0100 Subject: [PATCH 5/8] add fixes proposed by @mreid-tt - remove duplicate link to recover email - handle invalid navigation to package without versions --- spkrepo/templates/security/login_user.html | 1 - spkrepo/views/frontend.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spkrepo/templates/security/login_user.html b/spkrepo/templates/security/login_user.html index 0ce1fb9..ab61e62 100644 --- a/spkrepo/templates/security/login_user.html +++ b/spkrepo/templates/security/login_user.html @@ -3,5 +3,4 @@ {% block content %}

Login

{{ wtf.quick_form(login_user_form, field_order=['email'], button_map={'submit': 'primary'}) }} -

I forgot my password

{% endblock %} diff --git a/spkrepo/views/frontend.py b/spkrepo/views/frontend.py index 65f2334..f6627f2 100644 --- a/spkrepo/views/frontend.py +++ b/spkrepo/views/frontend.py @@ -97,7 +97,7 @@ def packages(): @frontend.route("/package/") def package(name): package = Package.query.filter_by(name=name).first() - if package is None: + if package is None or not package.versions: abort(404) return render_template("frontend/package.html", package=package) From 756a04d7e30ea40317229153971f893150e07d49 Mon Sep 17 00:00:00 2001 From: hgy59 Date: Mon, 8 Jan 2024 21:30:16 +0100 Subject: [PATCH 6/8] fix PackagesTestCase.test_get_active_not_stable --- spkrepo/tests/test_frontend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spkrepo/tests/test_frontend.py b/spkrepo/tests/test_frontend.py index 2948da4..632161c 100644 --- a/spkrepo/tests/test_frontend.py +++ b/spkrepo/tests/test_frontend.py @@ -28,7 +28,7 @@ def test_get_logged_user(self): class PackagesTestCase(BaseTestCase): # Assert beta is not shown on Packages page def test_get_active_not_stable(self): - build = BuildFactory(version__report_url=None, active=True) + build = BuildFactory(active=True) db.session.commit() response = self.client.get(url_for("frontend.packages")) self.assert200(response) From ed8512ed7522f5a92bcd89ed5c9deac070311335 Mon Sep 17 00:00:00 2001 From: mreid-tt <943378+mreid-tt@users.noreply.github.com> Date: Tue, 9 Jan 2024 05:44:10 -0400 Subject: [PATCH 7/8] Revert "remove obsolete TODOs" - TODOs in `spkrepo/views/admin.py` addressed in #112 --- spkrepo/views/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spkrepo/views/admin.py b/spkrepo/views/admin.py index e4a6967..08d7533 100644 --- a/spkrepo/views/admin.py +++ b/spkrepo/views/admin.py @@ -290,7 +290,7 @@ def on_model_delete(self, model): ("upgrade_wizard", "upgrade_wizard"), ("startable", "startable"), ) - + # TODO: Add beta and all_builds_active with Flask-Admin>1.0.8 column_default_sort = (Version.insert_date, True) # Custom queries @@ -533,7 +533,7 @@ def can_unsign(self): ("insert_date", "insert_date"), ("active", "active"), ) - + # TODO: Add version.package with Flask-Admin>1.0.8 column_default_sort = (Build.insert_date, True) # Custom queries From 1c2a6d2ff5be5ded2bdfa8c4cb9f7662b452a883 Mon Sep 17 00:00:00 2001 From: mreid-tt <943378+mreid-tt@users.noreply.github.com> Date: Wed, 31 Jan 2024 06:17:46 -0400 Subject: [PATCH 8/8] fix webpage footer --- spkrepo/templates/layout.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spkrepo/templates/layout.html b/spkrepo/templates/layout.html index 80c2eca..5ba0130 100644 --- a/spkrepo/templates/layout.html +++ b/spkrepo/templates/layout.html @@ -90,9 +90,9 @@