From f07a8634bcf71f196bf46578b011870403d4efca Mon Sep 17 00:00:00 2001
From: Dorian Lesbre <dorian.lesbre@gmail.com>
Date: Tue, 27 Apr 2021 10:55:05 +0200
Subject: [PATCH] Reworked file upload

---
 CHANGELOG.md            |  1 +
 site_settings/models.py | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 649214b..c7c6da4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 - Custom title to error pages
 - Update FAQ
 - More captions for planning
+- Reworked file upload to allow for file replacement (and not just upload to a new unique name)
 - Fix bugs
 
 ## Version 1.2.3 - 2021-04-25
diff --git a/site_settings/models.py b/site_settings/models.py
index 7ca8da8..fe37ead 100644
--- a/site_settings/models.py
+++ b/site_settings/models.py
@@ -1,9 +1,29 @@
 from datetime import timedelta
+from pathlib import Path
 
 from django.db import models
 from django.core.cache import cache
+from django.core.files.storage import FileSystemStorage
 from django.utils.timezone import now
 
+
+class OverwriteStorage(FileSystemStorage):
+	"""used to enforcing a fixed filename to upload file
+	This allow for a constant link to a changeable file"""
+	filename = "PlanningInterludes"
+	def get_available_name(self, name, **kwargs):
+		"""
+		Returns a filename that's free on the target storage system, and
+		available for new content to be written to.
+		"""
+		# If the filename already exists, remove it as if it was a true file system
+		extension = Path(name).suffix
+		new_name = self.filename + extension
+		if self.exists(new_name):
+			self.delete(new_name)
+		return super(FileSystemStorage, self).get_available_name(new_name, **kwargs)
+
+
 class SingletonModel(models.Model):
 	"""Table de la BDD qui ne possède qu'un seul élément"""
 	class Meta:
@@ -54,6 +74,7 @@ class SiteSettings(SingletonModel):
 	display_planning = models.BooleanField("Afficher le planning", default=False)
 	planning_file = models.FileField(
 		verbose_name="Version PDF du planning", null=True, blank=True,
+		storage=OverwriteStorage(),
 	)
 
 	activities_allocated = models.BooleanField(
-- 
GitLab