You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.5 KiB
86 lines
3.5 KiB
import os
|
|
|
|
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.db import models
|
|
from django.db.models import SET_NULL
|
|
from django.template.defaultfilters import filesizeformat
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from .conf import settings
|
|
|
|
|
|
class FormBuilderFileField(forms.FileField):
|
|
def __init__(self, *args, **kwargs):
|
|
self.max_upload_size = kwargs.pop(
|
|
'max_upload_size', settings.DJANGOCMS_FORMS_MAX_UPLOAD_SIZE)
|
|
allowed_file_types = kwargs.pop(
|
|
'allowed_file_types', settings.DJANGOCMS_FORMS_ALLOWED_FILE_TYPES)
|
|
self.allowed_file_types = [i.lstrip('.').lower()
|
|
for i in allowed_file_types]
|
|
|
|
super(FormBuilderFileField, self).__init__(*args, **kwargs)
|
|
|
|
def clean(self, *args, **kwargs):
|
|
uploaded_file = super(FormBuilderFileField, self).clean(*args, **kwargs)
|
|
if not uploaded_file:
|
|
if self.required:
|
|
raise forms.ValidationError(_('This field is required.'))
|
|
return uploaded_file
|
|
|
|
if not os.path.splitext(uploaded_file.name)[1].lstrip('.').lower() in \
|
|
self.allowed_file_types:
|
|
raise forms.ValidationError(
|
|
_('Sorry, this filetype is not allowed. '
|
|
'Allowed filetype: %s') % ', '.join(self.allowed_file_types))
|
|
|
|
if uploaded_file._size > self.max_upload_size:
|
|
params = {
|
|
'max_size': filesizeformat(self.max_upload_size),
|
|
'size': filesizeformat(uploaded_file._size)
|
|
}
|
|
msg = _(
|
|
'Please keep file size under %(max_size)s. Current size is %(size)s.') % params
|
|
raise forms.ValidationError(msg)
|
|
|
|
return uploaded_file
|
|
|
|
|
|
class PluginReferenceField(models.ForeignKey):
|
|
def __init__(self, *args, **kwargs):
|
|
kwargs.update({'null': True}) # always allow Null
|
|
kwargs.update({'editable': False}) # never allow edits in admin
|
|
kwargs.update({'on_delete': SET_NULL}) # never delete plugin
|
|
super(PluginReferenceField, self).__init__(*args, **kwargs)
|
|
|
|
def _create(self, model_instance):
|
|
return self.rel.to._default_manager.create(name=model_instance.name)
|
|
|
|
def pre_save(self, model_instance, add):
|
|
if not model_instance.pk and add:
|
|
setattr(model_instance, self.name, self._create(model_instance))
|
|
else:
|
|
reference = getattr(model_instance, self.name)
|
|
if not reference:
|
|
setattr(model_instance, self.name, self._create(model_instance))
|
|
reference = getattr(model_instance, self.name)
|
|
if reference.name != model_instance.name:
|
|
reference.name = model_instance.name
|
|
reference.save()
|
|
return super(PluginReferenceField, self).pre_save(model_instance, add)
|
|
|
|
def south_field_triple(self):
|
|
"""Returns a suitable description of this field for South."""
|
|
# We'll just introspect ourselves, since we inherit.
|
|
from south.modelsinspector import introspector
|
|
field_class = 'django.db.models.fields.related.ForeignKey'
|
|
args, kwargs = introspector(self)
|
|
return (field_class, args, kwargs)
|
|
|
|
|
|
class MultipleChoiceAutoCompleteField(forms.MultipleChoiceField):
|
|
|
|
def validate(self, value):
|
|
if self.required and not value:
|
|
raise ValidationError(self.error_messages['required'], code='required')
|
|
return value
|
|
|