Commit 758d7db9 authored by Anthony Jacob's avatar Anthony Jacob
Browse files

add media delete option and clean the filesystem

parent 710aac8a
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):

    CREATOR = 'CREATOR'
+5 −0
Original line number Diff line number Diff line
@@ -8,6 +8,11 @@ class MediaForm(forms.ModelForm):
        fields = ['image', 'caption']


class MediaDeleteForm(forms.Form):
    media_delete = forms.BooleanField(widget=forms.HiddenInput,
                                     initial=True)


class BlogForm(forms.ModelForm):
    post_edit = forms.BooleanField(widget=forms.HiddenInput,
                                   initial=True)
+42 −0
Original line number Diff line number Diff line
import os
import uuid

from django.db import models
from django.conf import settings
from django.core.validators import MinValueValidator
from PIL import Image
from django.dispatch import receiver

class Photo(models.Model):
    image = models.ImageField()
@@ -16,6 +20,7 @@ class Photo(models.Model):
        image = Image.open(self.image)
        image.thumbnail(self.IMAGE_MAX_SIZE)
        image.save(self.image.path)
        image.close()

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
@@ -42,3 +47,40 @@ class Blog(models.Model):
    def save(self, *args, **kwargs):
        self.word_count = self._word_count()
        super().save(*args, **kwargs)

# These two auto-delete files from filesystem when they are unneeded:
@receiver(models.signals.post_delete, sender=Photo)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    """
    Deletes file from filesystem
    when corresponding `MediaFile` object is deleted.
    """
    if instance.image:
        if os.path.isfile(instance.image.path):
            os.remove(instance.image.path)

@receiver(models.signals.pre_save, sender=Photo)
def auto_delete_file_on_change(sender, instance, **kwargs):
    """
    Deletes old file from filesystem
    when corresponding `MediaFile` object is updated
    with new file.
    """
    if not instance.pk:
        return False

    try:
        old_file = Photo.objects.get(pk=instance.pk).image
    except Photo.DoesNotExist:
        return False

    new_file = instance.image
    if not old_file == new_file:
        if old_file.name and os.path.isfile(old_file.path):
            # TODO: find why sometimes the file is used, not closed and trigger PermissionError
            # seems due to Photo save() overide since the problem does not occur when it's deleted
            
            try:
                os.remove(old_file.path)
            except PermissionError:
                return False
+19 −0
Original line number Diff line number Diff line
{% extends 'base.html' %}

{% block title %}Fotoblog - Media Upload{% endblock %}

{% block content %}

        <h1>Supprimer un média</h1>
        <p>
            {% include "messages_notif.html" %}
            
            êtes vous sûr de vouloir supprimer le media {{ media.caption }}
            <form method="post" enctype="multipart/form-data">
                {% csrf_token %}
                <button type="submit" >supprimer</button>
            </form>
        
        </p>

{% endblock %}
 No newline at end of file
+3 −0
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
            <div class="post">
                <img src="{{ media.image.url }}">
                <p>{{ media.caption }}</p>
                {% if user.is_authenticated %}
                    <p><a href="{% url 'media-delete' media.id %}" > Supprimer </a></p>
                {% endif %}
            </div>
             {% endfor %}
        {% endif %}
Loading