Skip to content

Commit d469663

Browse files
committed
PR feedback: correct v3 video form, correct image size restrictions, use safe article functions for summary
1 parent 5ae08a3 commit d469663

6 files changed

Lines changed: 30 additions & 9 deletions

File tree

core/validators.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,8 @@ def __call__(self, value):
4646
# 1 MB max file size
4747
max_file_size_validator = MaxFileSizeValidator(max_size=1 * 1024 * 1024)
4848

49+
# 1 MB max file size
50+
downscale_image_file_size_validator = MaxFileSizeValidator(max_size=5 * 1024 * 1024)
51+
4952
# 50 MB allowed for certain large files - to be used on staff-only fields
5053
large_file_max_size_validator = MaxFileSizeValidator(max_size=50 * 1024 * 1024)

news/forms.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
from django import forms
2+
3+
from core.validators import downscale_image_file_size_validator, max_file_size_validator
4+
25
from .models import BlogPost, Entry, Link, News, Poll, Video
36

47

58
class EntryForm(forms.ModelForm):
69
title = forms.CharField(widget=forms.TextInput(attrs={"size": 100}))
10+
image = forms.ImageField(validators=[max_file_size_validator])
711

812
class Meta:
913
model = Entry
@@ -48,16 +52,22 @@ class Meta:
4852

4953
# v3-only forms: the v3 create page also captures the AI-assisted `summary`.
5054
class V3BlogPostForm(BlogPostForm):
55+
image = forms.ImageField(validators=[downscale_image_file_size_validator])
56+
5157
class Meta(BlogPostForm.Meta):
5258
fields = ["title", "publish_at", "content", "summary", "image"]
5359

5460

5561
class V3NewsForm(NewsForm):
62+
image = forms.ImageField(validators=[downscale_image_file_size_validator])
63+
5664
class Meta(NewsForm.Meta):
5765
fields = ["title", "publish_at", "content", "summary", "image"]
5866

5967

6068
class V3LinkForm(LinkForm):
69+
image = forms.ImageField(validators=[downscale_image_file_size_validator])
70+
6171
class Meta(LinkForm.Meta):
6272
fields = ["title", "publish_at", "external_url", "summary", "image"]
6373

@@ -72,3 +82,11 @@ class VideoForm(EntryForm):
7282
class Meta:
7383
model = Video
7484
fields = ["title", "publish_at", "external_url", "image"]
85+
86+
87+
class V3VideoForm(EntryForm):
88+
image = forms.ImageField(validators=[downscale_image_file_size_validator])
89+
90+
class Meta:
91+
model = Video
92+
fields = ["title", "publish_at", "external_url", "summary", "image"]

news/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from core.validators import (
1616
attachment_validator,
1717
image_validator,
18-
max_file_size_validator,
1918
large_file_max_size_validator,
2019
)
2120

@@ -112,7 +111,7 @@ class AlreadyApprovedError(Exception):
112111
upload_to="news/%Y/%m/",
113112
null=True,
114113
blank=True,
115-
validators=[image_validator, max_file_size_validator],
114+
validators=[image_validator],
116115
)
117116
created_at = models.DateTimeField(default=now)
118117
approved_at = models.DateTimeField(null=True, blank=True)

news/tasks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from config.celery import app
1010
from config.settings import OPENROUTER_API_KEY, OPENROUTER_URL, SUMMARIZATION_MODEL
1111
from news.constants import CONTENT_SUMMARIZATION_THRESHOLD
12-
from news.helpers import UnsafeURLError, extract_article, safe_get, extract_content
12+
from news.helpers import UnsafeURLError, extract_article, safe_get
1313
from news.utils import set_video_thumbnail
1414

1515
logger = structlog.get_logger(__name__)
@@ -319,11 +319,11 @@ def set_summary_for_link_page(pk: int):
319319
external_url = page.external_url
320320
try:
321321
logger.info(f"Fetching content from {external_url=} for entry.{pk=}")
322-
response = requests.get(external_url, timeout=10)
322+
response = safe_get(external_url, timeout=10)
323323
response.raise_for_status()
324324
markup = response.text
325325
logger.debug(f"Fetched {len(markup)=} for entry.{pk=}...")
326-
content = extract_content(markup)
326+
_title, content = extract_article(markup)
327327
logger.info(f"extracted content from {external_url=}, {markup[:100]=}")
328328
except requests.RequestException as e:
329329
logger.error(f"Error fetching content from {external_url=}: {e=}")

news/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@
5858
LinkForm,
5959
NewsForm,
6060
PollForm,
61+
VideoForm,
6162
V3BlogPostForm,
6263
V3LinkForm,
6364
V3NewsForm,
64-
VideoForm,
65+
V3VideoForm,
6566
)
6667
from .models import BlogPost, Entry, Link, News, Poll, Video
6768
from .services import news_type_label
@@ -533,7 +534,7 @@ class V3AllTypesCreateView(V3Mixin, AllTypesCreateView):
533534
"blog": V3BlogPostForm,
534535
"news": V3NewsForm,
535536
"link": V3LinkForm,
536-
"video": VideoForm,
537+
"video": V3VideoForm,
537538
}
538539

539540
def dispatch(self, request, *args, **kwargs):

templates/news/v3/create.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ <h1 class="create-post-page__title">Create Post</h1>
182182
<p class="field__error" id="field-link-description-error" role="alert" x-show="isLink && linkError" x-text="linkError" x-cloak aria-live="polite"></p>
183183
</div>
184184

185-
{% include "v3/includes/_field_file.html" with name="image" label="Image" accept="image/png,image/jpeg" preview=True alpine_error="errors.image" error=form.errors.image.0 help_text="This should be a PNG or JPEG format and no longer than 1MB" extra_class="field--file-narrow create-post-page__field-image" %}
185+
{% include "v3/includes/_field_file.html" with name="image" label="Image" accept="image/png,image/jpeg" preview=True alpine_error="errors.image" error=form.errors.image.0 help_text="This should be a PNG or JPEG format and no larger than 5MB" extra_class="field--file-narrow create-post-page__field-image" %}
186186

187187
{% include "v3/includes/_field_dropdown.html" with name="related_libraries" label="Related Libraries" options=related_libraries_options placeholder="Select" selected=form.data.related_libraries %}
188188

@@ -615,7 +615,7 @@ <h1 class="create-post-page__title">Create Post</h1>
615615
if (file) {
616616
const validTypes = ['image/png', 'image/jpeg', 'image/jpg'];
617617
if (!validTypes.includes(file.type)) this.errors.image = 'Please choose a PNG or JPEG image.';
618-
else if (file.size > 1024 * 1024) this.errors.image = 'Image must be 1MB or smaller.';
618+
else if (file.size > 5 * 1024 * 1024) this.errors.image = 'Image must be 5MB or smaller.';
619619
}
620620

621621
if (Object.values(this.errors).some(v => v)) {

0 commit comments

Comments
 (0)