From 9eb25201878f3e0fccc94fbefa9b152535929a6b Mon Sep 17 00:00:00 2001 From: Shubhashish-Chakraborty Date: Fri, 27 Feb 2026 09:01:09 +0530 Subject: [PATCH 01/13] feat: add edit/delete functionality and fix image size validation --- web/forms.py | 39 ++++++++++-- web/models.py | 2 +- web/templates/add_meme.html | 110 +++++++++++++++++++++------------ web/templates/meme_detail.html | 26 ++++++-- web/urls.py | 2 + web/views.py | 37 +++++++++++ 6 files changed, 166 insertions(+), 50 deletions(-) diff --git a/web/forms.py b/web/forms.py index 96489d524..29bbd56ae 100644 --- a/web/forms.py +++ b/web/forms.py @@ -1690,7 +1690,7 @@ class Meta: attrs={ "accept": "image/png,image/jpeg,image/gif", "required": True, - "help_text": "Upload a meme image (JPG, PNG, or GIF, max 2MB)", + "help_text": "Upload a meme image (JPG, PNG, or GIF, max 1MB)", } ), } @@ -1700,11 +1700,16 @@ def __init__(self, *args, **kwargs): self.fields["subject"].required = False self.fields["subject"].help_text = "Select an existing subject" - # Improve error messages - self.fields["image"].error_messages = { - "required": "Please select an image file.", - "invalid": "Please upload a valid image file.", - } + # When editing an existing meme, the image should not be required. + if self.instance and self.instance.pk and "image" in self.fields: + self.fields["image"].required = False + self.fields["image"].widget.attrs["help_text"] = "Upload a new image to replace the current one (optional)" + + if "image" in self.fields: + self.fields["image"].error_messages = { + "required": "Please select an image file.", + "invalid": "Please upload a valid image file.", + } def clean(self): cleaned_data = super().clean() @@ -1716,6 +1721,17 @@ def clean(self): return cleaned_data + def clean_image(self): + image = self.cleaned_data.get("image") + # if editing and no new file provided, don't validate size/contents + if not image: + return image + + limit_mb = 1 + if image.size > limit_mb * 1024 * 1024: + raise ValidationError(f"Image file is too large. Size should not exceed {limit_mb} MB.") + return image + def save(self, commit=True): meme = super().save(commit=False) @@ -1734,6 +1750,17 @@ def save(self, commit=True): return meme +# Form used during updates, image may not be changed by users +class MemeEditForm(MemeForm): + class Meta(MemeForm.Meta): + fields = [f for f in MemeForm.Meta.fields if f != "image"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # ensure image field is not present + self.fields.pop("image", None) + + class StudentEnrollmentForm(forms.Form): first_name = forms.CharField( max_length=30, required=True, widget=TailwindInput(attrs={"placeholder": "First Name"}), label="First Name" diff --git a/web/models.py b/web/models.py index 6b8ea8ef4..16160e7cc 100644 --- a/web/models.py +++ b/web/models.py @@ -1765,7 +1765,7 @@ def save(self, *args, **kwargs): def validate_image_size(image): """Validate that the image file is not too large.""" file_size = image.size - limit_mb = 2 + limit_mb = 1 if file_size > limit_mb * 1024 * 1024: raise ValidationError(f"Image file is too large. Size should not exceed {limit_mb} MB.") diff --git a/web/templates/add_meme.html b/web/templates/add_meme.html index e7c12a71e..ae7b59655 100644 --- a/web/templates/add_meme.html +++ b/web/templates/add_meme.html @@ -5,12 +5,22 @@ {% endblock title %} {% block content %}
-

Add a New Educational Meme

+

+ {% if is_edit %} + Edit + {% else %} + Add a New + {% endif %} + Educational Meme +

{% csrf_token %}
- + Add a New Educational Meme {% if form.title.errors %}

{{ form.title.errors.0 }}

{% endif %}
- + Add a New Educational Meme

If your subject isn't listed above, enter a new one here

- + - {% if form.caption.errors %} -

{{ form.caption.errors.0 }}

- {% endif %} + {% if form.caption.errors %}

{{ form.caption.errors.0 }}

{% endif %}
-
- - {{ form.image }} - {% if form.image.errors %}

{{ form.image.errors.0 }}

{% endif %} -

Recommended: PNG or JPEG, max 2MB

- {% endblock content %}