Use Django's storage API for media files

This commit is contained in:
Raphael Michel
2015-09-29 16:05:17 +02:00
parent 21e71f97c1
commit 3282244d1b
3 changed files with 17 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import os
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core.files import File from django.core.files import File
from django.core.files.storage import default_storage
from django.core.files.uploadedfile import UploadedFile from django.core.files.uploadedfile import UploadedFile
from django.db import models from django.db import models
from django.forms.models import BaseModelForm, ModelFormMetaclass from django.forms.models import BaseModelForm, ModelFormMetaclass
@@ -105,8 +106,7 @@ class SettingsForm(forms.Form):
) )
else: else:
fname = '%s/%s.%s' % (self.obj.slug, name, value.name.split('.')[-1]) fname = '%s/%s.%s' % (self.obj.slug, name, value.name.split('.')[-1])
fpath = os.path.join(settings.MEDIA_ROOT, fname) with default_storage.open(fname, 'wb+') as destination:
with open(fpath, 'wb+') as destination:
for chunk in value.chunks(): for chunk in value.chunks():
destination.write(chunk) destination.write(chunk)
value._name = fname value._name = fname
@@ -118,7 +118,7 @@ class SettingsForm(forms.Form):
fname = self.obj.settings.get(name, as_type=File) fname = self.obj.settings.get(name, as_type=File)
if fname: if fname:
try: try:
os.unlink(fname.name) default_storage.delete(fname.name)
except OSError: except OSError:
logger.error('Deleting file %s failed.' % fname.name) logger.error('Deleting file %s failed.' % fname.name)

View File

@@ -7,6 +7,7 @@ from urllib.parse import urljoin
import dateutil.parser import dateutil.parser
from django.conf import settings from django.conf import settings
from django.core.files import File from django.core.files import File
from django.core.files.storage import default_storage
from django.db.models import Model from django.db.models import Model
from versions.models import Versionable from versions.models import Versionable
@@ -139,9 +140,8 @@ class SettingsProxy:
return value == 'True' return value == 'True'
elif as_type == File: elif as_type == File:
try: try:
f = open(os.path.join(settings.MEDIA_ROOT, value[7:]), 'r') fi = default_storage.open(value[7:], 'r')
fi = File(f) fi.url = default_storage.url(value[7:])
fi.url = urljoin(settings.MEDIA_URL, value[7:])
return fi return fi
except OSError: except OSError:
return False return False

View File

@@ -5,6 +5,7 @@ from io import BytesIO
from django import forms from django import forms
from django.contrib.staticfiles import finders from django.contrib.staticfiles import finders
from django.core.files import File from django.core.files import File
from django.core.files.storage import default_storage
from django.http import HttpResponse from django.http import HttpResponse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@@ -37,12 +38,6 @@ class PdfTicketOutput(BaseTicketOutput):
if hasattr(pagesizes, orientation): if hasattr(pagesizes, orientation):
pagesize = getattr(pagesizes, orientation)(pagesize) pagesize = getattr(pagesizes, orientation)(pagesize)
fname = self.settings.get('background', as_type=File)
if isinstance(fname, File):
fname = fname.name
else:
fname = finders.find('pretixpresale/pdf/ticket_default_a4.pdf')
buffer = BytesIO() buffer = BytesIO()
p = canvas.Canvas(buffer, pagesize=pagesize) p = canvas.Canvas(buffer, pagesize=pagesize)
@@ -98,11 +93,17 @@ class PdfTicketOutput(BaseTicketOutput):
buffer.seek(0) buffer.seek(0)
new_pdf = PdfFileReader(buffer) new_pdf = PdfFileReader(buffer)
output = PdfFileWriter() output = PdfFileWriter()
bg_file = self.settings.get('background', as_type=File)
if isinstance(bg_file, File):
new_bg_file = lambda: default_storage.open(bg_file.name, "rb")
else:
new_bg_file = lambda: open(finders.find('pretixpresale/pdf/ticket_default_a4.pdf'), "rb")
for page in new_pdf.pages: for page in new_pdf.pages:
bg_pdf = PdfFileReader(open(fname, "rb")) with new_bg_file() as bgf:
bg_page = bg_pdf.getPage(0) bg_pdf = PdfFileReader(bgf)
bg_page.mergePage(page) bg_page = bg_pdf.getPage(0)
output.addPage(bg_page) bg_page.mergePage(page)
output.addPage(bg_page)
outbuffer = BytesIO() outbuffer = BytesIO()
output.write(outbuffer) output.write(outbuffer)