Do a better job of validating post length
This still doesn't correctly handle the shorter "effective lengths" for handles and URLs. And it doesn't handle different per-server toot lengths. But it does catch posts that become too long because the length of the CW is counted as part of the length of the post body, and gives a validation error rather than throwing an exception.
This commit is contained in:
parent
c729956fab
commit
8fa5da1409
|
@ -1,10 +1,12 @@
|
|||
from django import forms
|
||||
from django.conf import settings
|
||||
|
||||
PRIVACY_CHOICES = (('public', 'Public'),
|
||||
('unlisted', 'Unlisted'),
|
||||
('private', 'Private'),
|
||||
('direct', 'Direct'))
|
||||
|
||||
MAX_LENGTH = settings.TOOT_MAX_LENGTH
|
||||
|
||||
class LoginForm(forms.Form):
|
||||
instance = forms.CharField(label="Instance",
|
||||
|
@ -28,26 +30,39 @@ class SettingsForm(forms.Form):
|
|||
class PostForm(forms.Form):
|
||||
"""def status_post(self, status, in_reply_to_id=None, media_ids=None,
|
||||
sensitive=False, visibility=None, spoiler_text=None):"""
|
||||
status = forms.CharField(label="Toot", max_length=500, widget=forms.Textarea)
|
||||
status = forms.CharField(label="Toot", max_length=MAX_LENGTH, widget=forms.Textarea)
|
||||
visibility = forms.ChoiceField(label="Toot visibility", choices=PRIVACY_CHOICES,
|
||||
required=False)
|
||||
spoiler_text = forms.CharField(label="CW or Subject", max_length=500,
|
||||
spoiler_text = forms.CharField(label="CW or Subject", max_length=MAX_LENGTH,
|
||||
required=False)
|
||||
media_file_1 = forms.FileField(label = "Media attachment 1",
|
||||
required=False)
|
||||
media_text_1 = forms.CharField(label="Describe media attachment 1.", max_length=500,
|
||||
media_text_1 = forms.CharField(label="Describe media attachment 1.",
|
||||
max_length=MAX_LENGTH,
|
||||
required=False)
|
||||
media_file_2 = forms.FileField(label = "Media attachment 2",
|
||||
required=False)
|
||||
media_text_2 = forms.CharField(label="Describe media attachment 2.", max_length=500,
|
||||
media_text_2 = forms.CharField(label="Describe media attachment 2.",
|
||||
max_length=MAX_LENGTH,
|
||||
required=False)
|
||||
media_file_3 = forms.FileField(label = "Media attachment 3",
|
||||
required=False)
|
||||
media_text_3 = forms.CharField(label="Describe media attachment 3.", max_length=500,
|
||||
media_text_3 = forms.CharField(label="Describe media attachment 3.",
|
||||
max_length=MAX_LENGTH,
|
||||
required=False)
|
||||
media_file_4 = forms.FileField(label = "Media attachment 4",
|
||||
required=False)
|
||||
media_text_4 = forms.CharField(label="Describe media attachment 4.", max_length=500,
|
||||
media_text_4 = forms.CharField(label="Describe media attachment 4.",
|
||||
max_length=MAX_LENGTH,
|
||||
required=False)
|
||||
media_sensitive = forms.BooleanField(label="Sensitive media?", required=False)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
status = cleaned_data.get("status")
|
||||
spoiler_text = cleaned_data.get("spoiler_text")
|
||||
|
||||
if len(status) + len(spoiler_text) > MAX_LENGTH:
|
||||
raise forms.ValidationError("Max length of toot exceeded: %(max_length)s",
|
||||
code="too_long",
|
||||
params={"max_length": MAX_LENGTH})
|
||||
|
|
|
@ -187,3 +187,8 @@ FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHand
|
|||
# Session serialization
|
||||
# Important: whatever you choose has to be able to serialize DateTime, so not JSON.
|
||||
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
|
||||
|
||||
# Max length of toots
|
||||
# Later this will be a user setting, but I am adding it here so that I don't
|
||||
# write any magic numbers into the validation code
|
||||
TOOT_MAX_LENGTH = 500
|
||||
|
|
|
@ -75,6 +75,11 @@ span.account-locked
|
|||
margin-left: -16px;
|
||||
}
|
||||
|
||||
.errorlist
|
||||
{
|
||||
color: #FF0000;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.media {
|
||||
display: block;
|
||||
|
|
|
@ -282,3 +282,8 @@ label
|
|||
{
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.errorlist
|
||||
{
|
||||
color: #FF0000;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
<form method="post" id="post-form" action="{% url "toot" %}" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
|
||||
<div>
|
||||
{{ form.non_field_errors }}
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="field" >
|
||||
<label class="label" >{{ form.status.label }}</label>
|
||||
<div class="control">
|
||||
|
@ -9,10 +14,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{{ form.errors }}
|
||||
</div>
|
||||
|
||||
<div class="field has-addons">
|
||||
<div class="control level is-mobile">
|
||||
<img class="image avatar is-48x48 level-item" src="{{ own_acct.avatar_static }}" alt="">
|
||||
|
|
|
@ -7,6 +7,11 @@
|
|||
{% endif %}
|
||||
{% csrf_token %}
|
||||
|
||||
<div>
|
||||
{{ form.non_field_errors }}
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label class="label"> {{ form.spoiler_text.label }}</label>
|
||||
<div class="control">
|
||||
|
@ -109,10 +114,6 @@
|
|||
</div>
|
||||
|
||||
|
||||
<div>
|
||||
{{ form.errors }}
|
||||
</div>
|
||||
|
||||
<div class="field has-addons">
|
||||
<div class="control level is-mobile">
|
||||
<img class="image avatar is-48x48 level-item" src="{{ own_acct.avatar_static }}"
|
||||
|
|
Loading…
Reference in New Issue