Skip to content

Commit f1dbb61

Browse files
committed
Move rendered HTML to a different table
1 parent 424eb81 commit f1dbb61

File tree

6 files changed

+114
-51
lines changed

6 files changed

+114
-51
lines changed

warehouse/forklift/legacy.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
JournalEntry,
5151
Project,
5252
Release,
53+
RenderedDescription,
5354
Role,
5455
)
5556
from warehouse.utils import http, readme
@@ -1004,8 +1005,6 @@ def file_upload(request):
10041005
)
10051006
),
10061007
canonical_version=canonical_version,
1007-
description_html=rendered,
1008-
description_html_rendered_by=readme.renderer_version(),
10091008
**{
10101009
k: getattr(form, k).data
10111010
for k in {
@@ -1031,6 +1030,13 @@ def file_upload(request):
10311030
uploaded_via=request.user_agent,
10321031
)
10331032
request.db.add(release)
1033+
request.db.add(
1034+
RenderedDescription(
1035+
release=release,
1036+
html=rendered or "",
1037+
rendered_by=readme.renderer_version(),
1038+
)
1039+
)
10341040
# TODO: This should be handled by some sort of database trigger or
10351041
# a SQLAlchemy hook or the like instead of doing it inline in
10361042
# this view.

warehouse/migrations/versions/1f6d3321bc15_add_release_description_html.py

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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 Release.description_html
14+
15+
Revision ID: ed4e8fa47659
16+
Revises: 42f0409bb702
17+
Create Date: 2019-05-08 05:18:06.415013
18+
"""
19+
20+
import sqlalchemy as sa
21+
22+
from alembic import op
23+
from sqlalchemy.dialects import postgresql
24+
25+
revision = "ed4e8fa47659"
26+
down_revision = "42f0409bb702"
27+
28+
29+
def upgrade():
30+
op.create_table(
31+
"release_descriptions",
32+
sa.Column(
33+
"id",
34+
postgresql.UUID(as_uuid=True),
35+
server_default=sa.text("gen_random_uuid()"),
36+
nullable=False,
37+
),
38+
sa.Column("release_id", postgresql.UUID(as_uuid=True), nullable=False),
39+
sa.Column("html", sa.Text(), nullable=False),
40+
sa.Column("rendered_by", sa.Text(), nullable=False),
41+
sa.ForeignKeyConstraint(
42+
["release_id"], ["releases.id"], onupdate="CASCADE", ondelete="CASCADE"
43+
),
44+
sa.PrimaryKeyConstraint("id"),
45+
)
46+
op.create_index(
47+
"release_descriptions_release_id_idx",
48+
"release_descriptions",
49+
["release_id"],
50+
unique=True,
51+
)
52+
53+
54+
def downgrade():
55+
op.drop_index(
56+
"release_descriptions_release_id_idx", table_name="release_descriptions"
57+
)
58+
op.drop_table("release_descriptions")

warehouse/packaging/models.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ def __table_args__(cls): # noqa
288288
license = Column(Text)
289289
summary = Column(Text)
290290
description_content_type = Column(Text)
291-
description_html_rendered_by = Column(Text)
292291
keywords = Column(Text)
293292
platform = Column(Text)
294293
download_url = Column(Text)
@@ -306,7 +305,15 @@ def __table_args__(cls): # noqa
306305
# those queries, deferring them here makes the default case more
307306
# performant.
308307
description = orm.deferred(Column(Text))
309-
description_html = orm.deferred(Column(Text))
308+
309+
description_html = orm.relationship(
310+
"RenderedDescription",
311+
backref="release",
312+
cascade="all, delete-orphan",
313+
lazy=True,
314+
passive_deletes=True,
315+
uselist=False,
316+
)
310317

311318
_classifiers = orm.relationship(
312319
Classifier,
@@ -406,6 +413,22 @@ def has_meta(self):
406413
)
407414

408415

416+
class RenderedDescription(db.Model):
417+
418+
__tablename__ = "release_descriptions"
419+
__table_args__ = (
420+
Index("release_descriptions_release_id_idx", "release_id", unique=True),
421+
)
422+
423+
release_id = Column(
424+
ForeignKey("releases.id", onupdate="CASCADE", ondelete="CASCADE"),
425+
nullable=False,
426+
)
427+
428+
html = Column(Text, nullable=False)
429+
rendered_by = Column(Text, nullable=False)
430+
431+
409432
class File(db.Model):
410433

411434
__tablename__ = "release_files"

warehouse/packaging/tasks.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from warehouse import tasks
1616
from warehouse.cache.origin import IOriginCache
17-
from warehouse.packaging.models import Project, Release
17+
from warehouse.packaging.models import Project, Release, RenderedDescription
1818
from warehouse.utils import readme
1919

2020

@@ -102,18 +102,31 @@ def compute_trending(request):
102102
@tasks.task(ignore_result=True, acks_late=True)
103103
def update_description_html(request):
104104
renderer_version = readme.renderer_version()
105+
106+
description_subq = (
107+
request.db.query(RenderedDescription)
108+
.filter(RenderedDescription.rendered_by != renderer_version)
109+
.subquery()
110+
)
105111
releases = (
106112
request.db.query(Release)
107113
.options(orm.undefer(Release.description))
108-
.filter(
109-
(Release.description_html_rendered_by != renderer_version)
110-
| (Release.description_html_rendered_by == None)
111-
)
114+
.options(orm.joinedload(Release.description_html))
115+
.outerjoin(description_subq, Release.description_html)
112116
.limit(5000)
113117
)
114118

115119
for release in releases:
116-
release.description_html = readme.render(
117-
release.description, release.description_content_type
118-
)
119-
release.escription_html_rendered_by = renderer_version
120+
rendered = readme.render(release.description, release.description_content_type)
121+
if rendered is None:
122+
rendered = ""
123+
124+
if release.description_html is None:
125+
request.db.add(
126+
RenderedDescription(
127+
release=release, html=rendered, rendered_by=renderer_version
128+
)
129+
)
130+
else:
131+
release.description_html.html = rendered
132+
release.description_html.rendered_by = renderer_version

warehouse/packaging/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def release_detail(release, request):
8282
# TODO: Remove the fallback to rendering inline and only support displaying the
8383
# already rendered content.
8484
if release.description_html:
85-
description = release.description_html
85+
description = release.description_html.html
8686
else:
8787
description = readme.render(
8888
release.description, release.description_content_type

0 commit comments

Comments
 (0)