From 7a630e934908707e575d6c99c14f8e54bff07f86 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Mon, 29 Jan 2018 12:03:45 -0600 Subject: [PATCH 01/19] Stub out individual release view --- tests/unit/packaging/test_models.py | 22 ++++++++++++++++++++++ warehouse/manage/views.py | 15 +++++++++++++++ warehouse/packaging/models.py | 19 +++++++++++++++++++ warehouse/routes.py | 7 +++++++ warehouse/templates/manage/release.html | 24 ++++++++++++++++++++++++ warehouse/templates/manage/releases.html | 9 ++++----- 6 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 warehouse/templates/manage/release.html diff --git a/tests/unit/packaging/test_models.py b/tests/unit/packaging/test_models.py index 74c2eae3b679..184f8c06764a 100644 --- a/tests/unit/packaging/test_models.py +++ b/tests/unit/packaging/test_models.py @@ -254,6 +254,28 @@ def test_urls(self, db_session, home_page, download_url, project_urls, # TODO: It'd be nice to test for the actual ordering here. assert dict(release.urls) == dict(expected) + def test_acl(self, db_session): + project = DBProjectFactory.create() + owner1 = DBRoleFactory.create(project=project) + owner2 = DBRoleFactory.create(project=project) + maintainer1 = DBRoleFactory.create( + project=project, + role_name="Maintainer", + ) + maintainer2 = DBRoleFactory.create( + project=project, + role_name="Maintainer", + ) + release = DBReleaseFactory.create(project=project) + + assert release.__acl__() == [ + (Allow, "group:admins", "admin"), + (Allow, str(owner1.user.id), ["manage", "upload"]), + (Allow, str(owner2.user.id), ["manage", "upload"]), + (Allow, str(maintainer1.user.id), ["upload"]), + (Allow, str(maintainer2.user.id), ["upload"]), + ] + class TestFile: diff --git a/warehouse/manage/views.py b/warehouse/manage/views.py index 9a6c77d834f2..4ca5df3afa1d 100644 --- a/warehouse/manage/views.py +++ b/warehouse/manage/views.py @@ -109,6 +109,21 @@ def manage_project_releases(project, request): return {"project": project} +@view_config( + route_name="manage.project.release", + renderer="manage/release.html", + uses_session=True, + permission="manage", + effective_principals=Authenticated, +) +def manage_project_release(release, request): + project = release.project + return { + "project": project, + "release": release, + } + + @view_config( route_name="manage.project.roles", renderer="manage/roles.html", diff --git a/warehouse/packaging/models.py b/warehouse/packaging/models.py index b67670c60e43..ad7bf0bfc43f 100644 --- a/warehouse/packaging/models.py +++ b/warehouse/packaging/models.py @@ -342,6 +342,25 @@ def __table_args__(cls): # noqa viewonly=True, ) + def __acl__(self): + session = orm.object_session(self) + acls = [ + (Allow, "group:admins", "admin"), + ] + + # Get all of the users for this project. + query = session.query(Role).filter(Role.project == self) + query = query.options(orm.lazyload("project")) + query = query.options(orm.joinedload("user").lazyload("emails")) + for role in sorted( + query.all(), + key=lambda x: ["Owner", "Maintainer"].index(x.role_name)): + if role.role_name == "Owner": + acls.append((Allow, str(role.user.id), ["manage", "upload"])) + else: + acls.append((Allow, str(role.user.id), ["upload"])) + return acls + @property def urls(self): _urls = OrderedDict() diff --git a/warehouse/routes.py b/warehouse/routes.py index 6366d707921a..723675ff8267 100644 --- a/warehouse/routes.py +++ b/warehouse/routes.py @@ -134,6 +134,13 @@ def includeme(config): traverse="/{project_name}", domain=warehouse, ) + config.add_route( + "manage.project.release", + "/manage/project/{project_name}/{version}/", + factory="warehouse.packaging.models:ProjectFactory", + traverse="/{project_name}/{version}", + domain=warehouse, + ) config.add_route( "manage.project.roles", "/manage/project/{project_name}/collaboration/", diff --git a/warehouse/templates/manage/release.html b/warehouse/templates/manage/release.html new file mode 100644 index 000000000000..8bf8fc9ee083 --- /dev/null +++ b/warehouse/templates/manage/release.html @@ -0,0 +1,24 @@ +{# + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. +-#} +{% extends "manage_project_base.html" %} + +{% set active_tab = 'releases' %} + +{% block title %}Manage '{{ project.name }}' release{% endblock %} + +{% block main %} +

Release

+ {{ release }} + {{ project }} +{% endblock %} diff --git a/warehouse/templates/manage/releases.html b/warehouse/templates/manage/releases.html index 8b76863bde7c..3ec6c05dc40a 100644 --- a/warehouse/templates/manage/releases.html +++ b/warehouse/templates/manage/releases.html @@ -31,8 +31,9 @@

Releases ({{ project.releases|length }})

{% for release in project.releases %} - {# TODO: https://github.com/pypa/warehouse/issues/2807 {{ release.version }} #} - {{ release.version }} + + {{ release.version }} + @@ -52,12 +53,10 @@

Releases ({{ project.releases|length }})

+ + Modifiers: + - in-content: restore heading spacing for instances where heading is not + at the top of the page */ .heading-wsubtitle { @@ -30,4 +34,10 @@ font-style: italic; margin-bottom: 15px; } + + &--in-content { + .heading-wsubtitle__heading { + padding-top: 30px; + } + } } diff --git a/warehouse/static/sass/blocks/_table.scss b/warehouse/static/sass/blocks/_table.scss index 97ed9031ce5a..4657bbab9f49 100644 --- a/warehouse/static/sass/blocks/_table.scss +++ b/warehouse/static/sass/blocks/_table.scss @@ -191,10 +191,6 @@ width: 130px; } - .table__version { - font-weight: bold; - } - .table__options { width: 110px; text-align: right; diff --git a/warehouse/static/sass/warehouse.scss b/warehouse/static/sass/warehouse.scss index 625058911a67..bc3d50177a19 100644 --- a/warehouse/static/sass/warehouse.scss +++ b/warehouse/static/sass/warehouse.scss @@ -65,6 +65,7 @@ @import "blocks/applied-filters"; @import "blocks/author-profile"; @import "blocks/badge"; +@import "blocks/breadcrumbs"; @import "blocks/button"; @import "blocks/button-group"; @import "blocks/callout-block"; diff --git a/warehouse/templates/manage/release.html b/warehouse/templates/manage/release.html index 27b7360f217f..1ee3aa9c65cd 100644 --- a/warehouse/templates/manage/release.html +++ b/warehouse/templates/manage/release.html @@ -18,8 +18,150 @@ {% block title %}Manage '{{ project.name }}' release{% endblock %} {% block main %} -

Release

- {{ release }} - {{ project }} - {{ files }} +
+

Release Version {{ release.version }}

+ +
+
+ + {% if files %} + + + + + + + + + + + + + {% for file in files %} + + + + + + + + + {% endfor %} + +
Filename, SizeTypePy VersionUpload DateComment
+ {{ file.filename }} + {% if file.size %}({{ file.size|filesizeformat() }}){% endif %}
+
{{ file.packagetype|format_package_type }}{{ file.requires_python }}{{ file.upload_time|format_date() }}{% if file.comment_text %}{{ file.comment_text }}{% else %}-{% endif %} + +
+ {% endif %} + +
+ {% if files %} +

Uploading New Files

+ {% else %} +

No Files Found

+ {% endif %} +

Learn how to upload files on the Python Packaging User Guide

+
+ +

Release Settings

+ +
+

Delete Release

+

+ {% if files %} + Deleting will irreversibly delete this release along with {{ files|length() }} + {% trans count=files|length %} + file. + {% pluralize %} + files. + {% endtrans %} + {% else %} + Deleting will irreversibly delete this release. + {% endif %} +

+ Delete +
+ + + + {% if files %} + {% for file in files %} + + {% endfor %} + {% endif %} {% endblock %} From d58db8f779819e319185c3bb687d5ddd5cafbf7a Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Fri, 2 Feb 2018 15:24:52 -0600 Subject: [PATCH 04/19] Fix routes --- warehouse/routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warehouse/routes.py b/warehouse/routes.py index 723675ff8267..487e072481dc 100644 --- a/warehouse/routes.py +++ b/warehouse/routes.py @@ -136,7 +136,7 @@ def includeme(config): ) config.add_route( "manage.project.release", - "/manage/project/{project_name}/{version}/", + "/manage/project/{project_name}/release/{version}/", factory="warehouse.packaging.models:ProjectFactory", traverse="/{project_name}/{version}", domain=warehouse, From 6323f76293047c09930a43e2cb6fa0499067f211 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Fri, 2 Feb 2018 15:29:04 -0600 Subject: [PATCH 05/19] Fix linting errors --- warehouse/templates/manage/release.html | 132 ++++++++++++------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/warehouse/templates/manage/release.html b/warehouse/templates/manage/release.html index 1ee3aa9c65cd..901a104f1589 100644 --- a/warehouse/templates/manage/release.html +++ b/warehouse/templates/manage/release.html @@ -40,54 +40,54 @@

Release Version {{ release.version }}

- {% for file in files %} - - - {{ file.filename }} - {% if file.size %}({{ file.size|filesizeformat() }}){% endif %}
- - {{ file.packagetype|format_package_type }} - {{ file.requires_python }} - {{ file.upload_time|format_date() }} - {% if file.comment_text %}{{ file.comment_text }}{% else %}-{% endif %} - - {% if files %} - {% for file in files %} -