From efc749c695193d9704216e3113156902555a79cd Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 17 Feb 2022 23:30:55 +1100 Subject: [PATCH] When uploading a report template, keep the existing filename (if it is the same report!) --- InvenTree/report/models.py | 45 ++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index be8d803edf..c2766ec959 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -43,32 +43,12 @@ except OSError as err: # pragma: no cover logger = logging.getLogger("inventree") -class ReportFileUpload(FileSystemStorage): - """ - Custom implementation of FileSystemStorage class. - - When uploading a report (or a snippet / asset / etc), - it is often important to ensure the filename is not arbitrarily *changed*, - if the name of the uploaded file is identical to the currently stored file. - - For example, a snippet or asset file is referenced in a template by filename, - and we do not want that filename to change when we upload a new *version* - of the snippet or asset file. - - This uploader class performs the following pseudo-code function: - - - If the model is *new*, proceed as normal - - If the model is being updated: - a) If the new filename is *different* from the existing filename, proceed as normal - b) If the new filename is *identical* to the existing filename, we want to overwrite the existing file - """ - - def get_available_name(self, name, max_length=None): - - return super().get_available_name(name, max_length) - - def rename_template(instance, filename): + """ + Helper function for 'renaming' uploaded report files. + Pass responsibility back to the calling class, + to ensure that files are uploaded to the correct directory. + """ return instance.rename_file(filename) @@ -155,7 +135,20 @@ class ReportBase(models.Model): filename = os.path.basename(filename) - return os.path.join('report', 'report_template', self.getSubdir(), filename) + path = os.path.join('report', 'report_template', self.getSubdir(), filename) + + # If the report file is the *same* filename as the one being uploaded, + # remove the original one from the media directory + if str(filename) == str(self.template): + + fullpath = os.path.join(settings.MEDIA_ROOT, path) + fullpath = os.path.abspath(fullpath) + + if os.path.exists(fullpath): + logger.info(f"Deleting existing report template: '{filename}'") + os.remove(fullpath) + + return path @property def extension(self):