7 from django import forms
8 from django.forms import fields
10 from django.core.files.storage import DefaultStorage
11 from django.core.urlresolvers import reverse
12 from django.utils.safestring import mark_safe
13 from django.conf import settings
14 from django.template.loader import render_to_string
16 from taggit.forms import TagWidget
19 from .models import Emission, Episode, Diffusion, Schedule, SoundFile
23 s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').lower()
24 return re.sub(r'\W+', '-', s)
27 class DayAndHourWidget(forms.MultiWidget):
28 def __init__(self, attrs=None):
29 WEEKDAYS = [u'Lundi', u'Mardi', u'Mercredi', u'Jeudi', u'Vendredi', u'Samedi', u'Dimanche']
31 forms.Select(attrs=attrs, choices=([(weekday, WEEKDAYS[weekday]) for weekday in range(7)])),
32 forms.Select(attrs=attrs, choices=([(hour, hour) for hour in range(24)])),
33 forms.Select(attrs=attrs, choices=([(minute, str(minute).zfill(2)) for minute in range(60)])),
35 super(DayAndHourWidget, self).__init__(widgets, attrs)
37 def decompress(self, value):
39 return [value.weekday(), value.hour, value.minute]
40 return [None, None, None]
42 def value_from_datadict(self, data, files, name):
43 # we only care about day/hour/minutes, but we conveniently use a
44 # datetime value to store that; we pick 2007 as reference year as
45 # it had its January 1st on a Monday.
47 widget.value_from_datadict(data, files, name + '_%s' % i)
48 for i, widget in enumerate(self.widgets)]
51 return datetime.datetime(2007, 1, int(data_list[0])+1, int(data_list[1]), int(data_list[2]))
55 class JqueryFileUploadFileInput(forms.FileInput):
56 def render(self, name, value, attrs=None):
57 output = render_to_string('emissions/upload.html', {
58 'upload_url': self.url,
61 'STATIC_URL': settings.STATIC_URL})
62 return mark_safe(output)
65 class JqueryFileUploadInput(forms.MultiWidget):
66 needs_multipart_form = True
67 upload_id_re = re.compile(r'^[a-z0-9A-Z-]+$')
70 def __init__(self, attrs=None, choices=[], max_filename_length=None):
71 self.max_filename_length = max_filename_length
72 widget_list = (forms.HiddenInput(attrs=attrs),
73 JqueryFileUploadFileInput(attrs=attrs))
74 super(JqueryFileUploadInput, self).__init__(widget_list, attrs)
76 def decompress(self, value):
77 # map python value to widget contents
80 elif isinstance(value, (list, tuple)) and value and value[0] is not None:
81 self.upload_id = str(value[0])
83 self.upload_id = str(uuid.uuid4())
84 return [self.upload_id, None]
86 def get_files_for_id(self, upload_id):
87 storage = DefaultStorage()
88 path = os.path.join('upload', upload_id)
89 if not storage.exists(path):
91 for filepath in storage.listdir(path)[1]:
92 name = os.path.basename(filepath)
93 yield storage.open(os.path.join(path, name))
95 def value_from_datadict(self, data, files, name):
97 If some file was submitted, that's the value,
98 If a regular hidden_id is present, use it to find uploaded files,
99 otherwise return an empty list
101 upload_id, file_input = super(JqueryFileUploadInput, self).value_from_datadict(data, files, name)
104 elif JqueryFileUploadInput.upload_id_re.match(upload_id):
105 file_input = list(self.get_files_for_id(upload_id))
110 def render(self, name, value, attrs=None):
111 self.decompress(value)
112 self.widgets[1].url = '/upload/%s/' % self.upload_id
113 self.widgets[1].url = reverse('upload', kwargs={'transaction_id': self.upload_id})
114 if self.max_filename_length:
115 self.widgets[1].url += '?max_filename_length=%d' % self.max_filename_length
116 self.widgets[1].files = '/upload/%s/' % self.get_files_for_id(self.upload_id)
117 output = super(JqueryFileUploadInput, self).render(name, value,
119 fileinput_id = '%s_%s' % (attrs['id'], '1')
123 class EmissionForm(forms.ModelForm):
128 def save(self, commit=True):
129 if not self.instance.slug:
130 self.instance.slug = slugify(self.instance.title)
131 return super(EmissionForm, self).save(commit=commit)
134 class EpisodeForm(forms.ModelForm):
138 widgets = {'emission': forms.HiddenInput(),
141 def save(self, commit=True):
142 if not self.instance.slug:
143 self.instance.slug = slugify(self.instance.title)
144 return super(EpisodeForm, self).save(commit=commit)
147 class EpisodeNewForm(EpisodeForm):
148 diffusion = forms.DateTimeField()
150 def save(self, commit=True):
151 episode = super(EpisodeNewForm, self).save(commit=commit)
152 diffusion = Diffusion()
153 diffusion.episode_id = episode.id
154 diffusion.datetime = self.cleaned_data.get('diffusion')
159 class ScheduleForm(forms.ModelForm):
163 'emission': forms.HiddenInput(),
164 'datetime': DayAndHourWidget(),
168 class SoundFileForm(forms.ModelForm):
172 'episode': forms.HiddenInput(),
173 'file': JqueryFileUploadInput(),
177 class DiffusionForm(forms.ModelForm):
181 'episode': forms.HiddenInput(),