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

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