Skip to content

Commit 905514b

Browse files
committed
Add Release.uploader as a real FK
1 parent 96227ff commit 905514b

File tree

6 files changed

+92
-24
lines changed

6 files changed

+92
-24
lines changed

warehouse/admin/templates/admin/projects/detail.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,11 @@ <h4>Releases:</h4>
148148
<tr>
149149
<td><a href="{{ request.route_path('admin.project.release', project_name=release.project.normalized_name, version=release.version) }}">{{ release.name }}-{{ release.version }}</a></td>
150150
<td>{{ release.created }}</td>
151-
<td><a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a></td>
151+
<td>
152+
{% if release.uploader %}
153+
<a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a>
154+
{% endif %}
155+
</td>
152156
<td>{{ release.author_email }}</td>
153157
</tr>
154158
{% endfor %}

warehouse/admin/templates/admin/projects/release_detail.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ <h3>Details</h3>
4141
</tr>
4242
<tr>
4343
<td>Uploader</td>
44-
<td><a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a></td>
44+
<td>
45+
{% if release.uploader %}
46+
<a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a>
47+
{% endif %}
48+
</td>
4549
</tr>
4650
<tr>
4751
<td>Created via</td>

warehouse/admin/templates/admin/projects/releases_list.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@
5151
<tr>
5252
<td><a href="{{ request.route_path('admin.project.release', project_name=release.project.normalized_name, version=release.version) }}">{{ release.name }}-{{ release.version }}</a></td>
5353
<td>{{ release.created }}</td>
54-
<td><a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a></td>
54+
<td>
55+
{% if release.uploader %}
56+
<a href="{{ request.route_path('admin.user.detail', user_id=release.uploader.id) }}">{{ release.uploader.username }}</a>
57+
{% endif %}
58+
</td>
5559
<td>{{ release.author_email }}</td>
5660
</tr>
5761
{% endfor %}

warehouse/forklift/legacy.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,7 @@ def file_upload(request):
10181018
"requires_python",
10191019
}
10201020
},
1021+
uploader=request.user,
10211022
uploaded_via=request.user_agent,
10221023
)
10231024
request.db.add(release)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License");
2+
# you may not use this file except in compliance with the License.
3+
# You may obtain a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS,
9+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
# See the License for the specific language governing permissions and
11+
# limitations under the License.
12+
"""
13+
Add uploader field to Release
14+
15+
Revision ID: e612a92c1017
16+
Revises: 5538f2d929dd
17+
Create Date: 2018-11-06 16:22:01.484362
18+
"""
19+
20+
from alembic import op
21+
import sqlalchemy as sa
22+
23+
from sqlalchemy.dialects import postgresql
24+
25+
26+
revision = "e612a92c1017"
27+
down_revision = "5538f2d929dd"
28+
29+
30+
def upgrade():
31+
op.add_column(
32+
"releases",
33+
sa.Column("uploader_id", postgresql.UUID(as_uuid=True), nullable=True),
34+
)
35+
op.execute(
36+
"""
37+
UPDATE releases
38+
SET uploader_id = s.user_id
39+
FROM (
40+
SELECT accounts_user.id as user_id,
41+
packages.id as project_id,
42+
releases.version as release_version,
43+
ROW_NUMBER() OVER (
44+
PARTITION BY journals.name, journals.version
45+
ORDER BY journals.id DESC
46+
) as rn
47+
FROM accounts_user, packages, journals, releases
48+
WHERE journals.name = packages.name
49+
AND journals.version = releases.version
50+
AND journals.action = 'new release'
51+
AND accounts_user.username = journals.submitted_by
52+
) s
53+
WHERE releases.project_id = s.project_id
54+
AND releases.version = s.release_version
55+
AND s.rn = 1
56+
"""
57+
)
58+
op.create_foreign_key(
59+
None,
60+
"releases",
61+
"accounts_user",
62+
["uploader_id"],
63+
["id"],
64+
onupdate="CASCADE",
65+
ondelete="SET NULL",
66+
)
67+
op.create_index("ix_releases_uploader_id", "releases", ["uploader_id"])
68+
69+
70+
def downgrade():
71+
raise RuntimeError("Order No. 227 - Ни шагу назад!")

warehouse/packaging/models.py

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -348,28 +348,12 @@ def __table_args__(cls): # noqa
348348
_project_urls = _dependency_relation(DependencyKind.project_url)
349349
project_urls = association_proxy("_project_urls", "specifier")
350350

351-
uploader = orm.relationship(
352-
"User",
353-
secondary=lambda: JournalEntry.__table__,
354-
primaryjoin=lambda: (
355-
(JournalEntry.name == orm.foreign(Project.name))
356-
& (Project.id == Release.project_id)
357-
& (JournalEntry.version == orm.foreign(Release.version))
358-
& (JournalEntry.action == "new release")
359-
),
360-
secondaryjoin=lambda: (
361-
(User.username == orm.foreign(JournalEntry._submitted_by))
362-
),
363-
order_by=lambda: JournalEntry.id.desc(),
364-
# TODO: We have uselist=False here which raises a warning because
365-
# multiple items were returned. This should only be temporary because
366-
# we should add a nullable FK to JournalEntry so we don't need to rely
367-
# on ordering and implicitly selecting the first object to make this
368-
# happen,
369-
uselist=False,
370-
viewonly=True,
351+
uploader_id = Column(
352+
ForeignKey("accounts_user.id", onupdate="CASCADE", ondelete="SET NULL"),
353+
nullable=True,
354+
index=True,
371355
)
372-
356+
uploader = orm.relationship(User)
373357
uploaded_via = Column(Text)
374358

375359
@property

0 commit comments

Comments
 (0)