Skip to content

Commit 2db02f3

Browse files
authored
Improve packages webui (#111)
Some web ui improvements + 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 Show packages without active versions (leftover of #106) + do not hide package in packages when there is no active version (Where is the debian-chroot package for DSM5.2? spksrc#5803) + remove obsolete TODOs Fix webpage footer (fixes #116) + correct link for SynoCommunity members
1 parent 13ace8a commit 2db02f3

File tree

6 files changed

+113
-53
lines changed

6 files changed

+113
-53
lines changed

spkrepo/templates/frontend/package.html

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
</a>
99
<div class="media-body">
1010
<h1 class="media-heading">{{ package.versions[-1].displaynames['enu'].displayname }}
11-
<small>v{{ package.versions[-1].version_string }}
12-
{% if package.versions[-1].report_url %}<span class="label label-danger">beta</span>{% endif %}
13-
</small>
11+
<small>v{{ package.versions[-1].version_string }}</small>
1412
</h1>
1513
<p>{{ package.versions[-1].descriptions['enu'].description }}</p>
1614
<div class="package-screenshots">
@@ -20,31 +18,36 @@ <h1 class="media-heading">{{ package.versions[-1].displaynames['enu'].displaynam
2018
</div>
2119
{% for version in package.versions|reverse %}
2220
<dl>
23-
<dt>Version {{ version.version_string | safe }}</dt>
21+
<dt>Version {{ version.version_string | safe }}{% if version.report_url %} <span class="label label-danger">beta</span>{% endif %}</dt>
2422
<dd>{{ version.changelog | safe }}</dd>
2523
<dt>Date</dt>
26-
<dd>{{ version.insert_date }}</dd>
24+
<dd>{{ version.insert_date.replace(microsecond=0) }}</dd>
2725
<dt>Architectures</dt>
2826
<dd>
29-
{% for (version, builds) in version.builds_per_dsm.items() %}
27+
{% for (version, builds) in version.builds_per_dsm.items() %}
3028
<!-- Group firmware by DSM or SRM if 1.x -->
3129
{% if version == '1' %}
32-
SRM {{ version }}.x:
30+
SRM {{ version }}.x:
3331
{% else %}
34-
DSM {{ version }}.x:
32+
DSM {{ version }}.x:
3533
{% endif %}
3634
{% for build in builds %}
37-
{% for arch in build.architectures %}
38-
<a href="{{ url_for('nas.data', path=build.path) }}"><span class="label label-default">{{ build.firmware.version }} {{ arch.code }}</span></a>
39-
{% endfor %}
35+
{% if build.active %}
36+
{% for arch in build.architectures %}
37+
<a href="{{ url_for('nas.data', path=build.path) }}"><span class="label label-success">{{ build.firmware.version }} {{ arch.code }}</span></a>
38+
{% endfor %}
39+
{% else %}
40+
{% for arch in build.architectures %}
41+
<a href="{{ url_for('nas.data', path=build.path) }}"><span class="label label-default" data-toggle="tooltip" title="Inactive: Manual installation only. This Package might be under development and have pending issues.">{{ build.firmware.version }} {{ arch.code }}</span></a>
42+
{% endfor %}
43+
{% endif %}
4044
{% endfor %}
4145
<br/>
42-
{% endfor %}
46+
{% endfor %}
4347
</dd>
4448
</dl>
4549
{% endfor %}
4650
</div>
47-
<span
4851
</div>
4952
</div>
5053
{% endblock %}

spkrepo/templates/frontend/packages.html

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
</a>
1313
<div class="media-body">
1414
<h4 class="media-heading">{{ version.displaynames['enu'].displayname }}
15-
<small>v{{ version.version_string }}
16-
{% if version.report_url %}<span class="label label-danger">beta</span>{% endif %}
17-
</small>
15+
<small>v{{ version.version_string }}</small>
1816
</h4>
1917
<div class="ellipsis package-description">
2018
<p>{{ version.descriptions['enu'].description }}</p>

spkrepo/templates/layout.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@
9090

9191
<footer class="footer" role="contentinfo">
9292
<div class="container">
93-
<p>Powered by <a href="https://github.com/Diaoul/spkrepo">spkrepo</a>.</p>
94-
<p>Developed by <a href="https://github.com/Diaoul">Antoine Bertin</a>.</p>
95-
<p>Code licensed under <a href="https://github.com/Diaoul/spkrepo/blob/master/LICENSE" target="_blank">MIT</a>.</p>
93+
<p>Designed by Antoine Bertin.</p>
94+
<p>Maintained by <a href="https://github.com/orgs/SynoCommunity/people">SynoCommunity</a> with the help of <a href="https://github.com/SynoCommunity/spksrc/graphs/contributors">contributors</a>.</p>
95+
<p>Code licensed under <a href="https://github.com/SynoCommunity/spkrepo/blob/master/LICENSE" target="_blank">MIT</a>.</p>
9696
</div>
9797
</footer>
9898

spkrepo/templates/security/login_user.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@
33
{% block content %}
44
<h1>Login</h1>
55
{{ wtf.quick_form(login_user_form, field_order=['email'], button_map={'submit': 'primary'}) }}
6-
<p><a href="{{ url_for('security.forgot_password') }}">I forgot my password</a></p>
76
{% endblock %}

spkrepo/tests/test_frontend.py

Lines changed: 91 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,85 +12,146 @@ class IndexTestCase(BaseTestCase):
1212
def test_get_anonymous(self):
1313
response = self.client.get(url_for("frontend.index"))
1414
self.assert200(response)
15-
self.assertIn("Login", response.data.decode())
16-
self.assertIn("Register", response.data.decode())
15+
response_data = response.data.decode()
16+
self.assertIn("Login", response_data)
17+
self.assertIn("Register", response_data)
1718

1819
def test_get_logged_user(self):
1920
with self.logged_user():
2021
response = self.client.get(url_for("frontend.index"))
2122
self.assert200(response)
22-
self.assertIn("Logout", response.data.decode())
23-
self.assertIn("Profile", response.data.decode())
23+
response_data = response.data.decode()
24+
self.assertIn("Logout", response_data)
25+
self.assertIn("Profile", response_data)
2426

2527

2628
class PackagesTestCase(BaseTestCase):
27-
def test_get_active_stable(self):
28-
build = BuildFactory(version__report_url=None, active=True)
29+
# Assert beta is not shown on Packages page
30+
def test_get_active_not_stable(self):
31+
build = BuildFactory(active=True)
2932
db.session.commit()
3033
response = self.client.get(url_for("frontend.packages"))
3134
self.assert200(response)
35+
response_data = response.data.decode()
3236
self.assertIn(
3337
build.version.displaynames["enu"].displayname,
34-
response.data.decode(),
38+
response_data,
3539
)
36-
self.assertNotIn("beta", response.data.decode())
40+
self.assertNotIn("beta", response_data)
3741

38-
def test_get_active_not_stable(self):
39-
build = BuildFactory(active=True)
42+
# Assert package with only inactive version(s) is shown on Packages page
43+
def test_get_not_active_not_stable(self):
44+
build = BuildFactory(active=False)
4045
db.session.commit()
4146
response = self.client.get(url_for("frontend.packages"))
4247
self.assert200(response)
48+
response_data = response.data.decode()
4349
self.assertIn(
4450
build.version.displaynames["enu"].displayname,
45-
response.data.decode(),
51+
response_data,
4652
)
47-
self.assertIn("beta", response.data.decode())
53+
self.assertNotIn("beta", response_data)
4854

49-
def test_get_not_active_not_stable(self):
50-
build = BuildFactory(active=False)
55+
56+
class PackageTestCase(BaseTestCase):
57+
def test_get_active_stable(self):
58+
build = BuildFactory(
59+
version__package__author=UserFactory(),
60+
version__report_url=None,
61+
active=True,
62+
)
5163
db.session.commit()
52-
response = self.client.get(url_for("frontend.packages"))
64+
response = self.client.get(
65+
url_for("frontend.package", name=build.version.package.name)
66+
)
5367
self.assert200(response)
54-
self.assertNotIn(
68+
response_data = response.data.decode()
69+
for a in build.architectures:
70+
self.assertIn(a.code, response_data)
71+
self.assertIn(
5572
build.version.displaynames["enu"].displayname,
56-
response.data.decode(),
73+
response_data,
5774
)
58-
self.assertNotIn("beta", response.data.decode())
75+
self.assertIn(
76+
build.version.descriptions["enu"].description,
77+
response_data,
78+
)
79+
self.assertNotIn("beta", response_data)
80+
self.assertIn("label label-success", response_data)
5981

6082
def test_get_not_active_stable(self):
61-
build = BuildFactory(active=False)
83+
build = BuildFactory(
84+
version__package__author=UserFactory(),
85+
version__report_url=None,
86+
active=False,
87+
)
6288
db.session.commit()
63-
response = self.client.get(url_for("frontend.packages"))
89+
response = self.client.get(
90+
url_for("frontend.package", name=build.version.package.name)
91+
)
6492
self.assert200(response)
65-
self.assertNotIn(
93+
response_data = response.data.decode()
94+
for a in build.architectures:
95+
self.assertIn(a.code, response_data)
96+
self.assertIn(
6697
build.version.displaynames["enu"].displayname,
67-
response.data.decode(),
98+
response_data,
6899
)
69-
self.assertNotIn("beta", response.data.decode())
70-
100+
self.assertIn(
101+
build.version.descriptions["enu"].description,
102+
response_data,
103+
)
104+
self.assertNotIn("beta", response_data)
105+
self.assertIn("label label-default", response_data)
71106

72-
class PackageTestCase(BaseTestCase):
73-
def test_get(self):
107+
def test_get_active_not_stable(self):
74108
build = BuildFactory(
75109
version__package__author=UserFactory(),
76-
version__report_url=None,
77110
active=True,
78111
)
79112
db.session.commit()
80113
response = self.client.get(
81114
url_for("frontend.package", name=build.version.package.name)
82115
)
83116
self.assert200(response)
117+
response_data = response.data.decode()
118+
for a in build.architectures:
119+
self.assertIn(a.code, response_data)
120+
self.assertIn(
121+
build.version.displaynames["enu"].displayname,
122+
response_data,
123+
)
124+
self.assertIn(
125+
build.version.descriptions["enu"].description,
126+
response_data,
127+
)
128+
self.assertIn("beta", response_data)
129+
self.assertIn("label label-success", response_data)
130+
131+
def test_get_not_active_not_stable(self):
132+
build = BuildFactory(
133+
version__package__author=UserFactory(),
134+
active=False,
135+
)
136+
db.session.commit()
137+
response = self.client.get(
138+
url_for("frontend.package", name=build.version.package.name)
139+
)
140+
self.assert200(response)
141+
response_data = response.data.decode()
84142
for a in build.architectures:
85-
self.assertIn(a.code, response.data.decode())
143+
self.assertIn(a.code, response_data)
86144
self.assertIn(
87145
build.version.displaynames["enu"].displayname,
88-
response.data.decode(),
146+
response_data,
89147
)
90148
self.assertIn(
91149
build.version.descriptions["enu"].description,
92-
response.data.decode(),
150+
response_data,
93151
)
152+
self.assertIn("beta", response_data)
153+
self.assertIn("label label-default", response_data)
154+
self.assertIn("Inactive: Manual installation only.", response_data)
94155

95156
def test_get_no_package(self):
96157
response = self.client.get(url_for("frontend.package", name="no-package"))

spkrepo/views/frontend.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ def profile():
6464

6565
@frontend.route("/packages")
6666
def packages():
67+
# show only packages with at least one version, but ignore whether builds are active
6768
latest_version = (
6869
db.session.query(
6970
Version.package_id, db.func.max(Version.version).label("latest_version")
7071
)
7172
.join(Build)
72-
.filter(Build.active)
7373
.group_by(Version.package_id)
7474
.subquery()
7575
)
@@ -96,9 +96,8 @@ def packages():
9696

9797
@frontend.route("/package/<name>")
9898
def package(name):
99-
# TODO: show only packages with at least a version and an active build
10099
package = Package.query.filter_by(name=name).first()
101-
if package is None:
100+
if package is None or not package.versions:
102101
abort(404)
103102
return render_template("frontend/package.html", package=package)
104103

0 commit comments

Comments
 (0)