4 from django import forms
5 from django.core.exceptions import ValidationError
6 from django.core.validators import RegexValidator
8 from filex.models import Favorite
11 msg = u'Invalid value'
12 host_validator = RegexValidator(r'^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+'
13 r'(?:[a-zA-Z]{2,6}\.?|[a-zA-Z0-9-]{2,}(?<!-)\.?))(?::\d+)?$', msg)
14 path_validator = RegexValidator(r'^/(?:[^/\0]+/?)*$', msg)
15 name_validator = RegexValidator(r'^[^/\0]+$', msg)
18 class FavoriteForm(forms.ModelForm):
21 fields = ('owner', 'host', 'path')
22 widgets = {'owner': forms.HiddenInput()}
25 class HostForm(forms.Form):
26 host = forms.CharField(label=u'Host', max_length=256, validators=[host_validator], widget=forms.HiddenInput())
29 class HostPathForm(HostForm):
30 path = forms.CharField(label=u'Ścieżka', max_length=1024, validators=[path_validator], widget=forms.HiddenInput())
33 return os.path.normpath(self.cleaned_data['path'])
36 class HostPathNameForm(HostPathForm):
37 name = forms.CharField(label=u'Nazwa', max_length=256, validators=[name_validator])
40 class HostItemsForm(HostForm):
41 dirs = forms.MultipleChoiceField(label=u'Katalogi', required=False, widget=forms.MultipleHiddenInput())
42 files = forms.MultipleChoiceField(label=u'Pliki', required=False, widget=forms.MultipleHiddenInput())
44 def __init__(self, data=None, *args, **kwargs):
45 super(HostItemsForm, self).__init__(data, *args, **kwargs)
48 # accept user defined choices
49 self.fields['dirs'].choices += ((v, v) for v in data.getlist('dirs'))
50 self.fields['files'].choices += ((v, v) for v in data.getlist('files'))
53 data = super(HostItemsForm, self).clean()
55 if not (data.get('dirs') or data.get('files')):
56 raise ValidationError('No items specified')
61 def _clean_paths(values):
62 errors, cleaned = [], []
66 except ValidationError as e:
67 e.message += ' - ' + name
70 cleaned.append(os.path.normpath(name))
72 raise ValidationError(errors)
77 return self._clean_paths(self.cleaned_data['dirs'])
79 def clean_files(self):
80 return self._clean_paths(self.cleaned_data['files'])
83 class RenameForm(HostForm):
84 src = forms.CharField(label=u'Stara nazwa', max_length=1024, validators=[path_validator], widget=forms.HiddenInput())
85 dst = forms.CharField(label=u'Nowa nazwa', max_length=1024, validators=[path_validator])
88 return os.path.normpath(self.cleaned_data['src'])
91 return os.path.normpath(self.cleaned_data['dst'])
94 class ExtractForm(HostPathForm):
95 dst = forms.CharField(label=u'Katalog docelowy', max_length=1024, validators=[path_validator])
98 return os.path.normpath(self.cleaned_data['dst'])
101 class CompressForm(HostPathForm):
102 archive = forms.CharField(label=u'Nazwa', max_length=1024, validators=[path_validator])
103 files = forms.MultipleChoiceField(label=u'Pliki', widget=forms.MultipleHiddenInput())
105 def __init__(self, data=None, *args, **kwargs):
106 super(CompressForm, self).__init__(data, *args, **kwargs)
109 # accept user defined choices
110 self.fields['files'].choices += ((v, v) for v in data.getlist('files'))
112 def clean_files(self):
113 errors, cleaned = [], []
114 for name in self.cleaned_data['files']:
117 except ValidationError as e:
118 e.message += ' - ' + name
121 cleaned.append(os.path.normpath(name))
123 raise ValidationError(errors)
127 def clean_archive(self):
128 return os.path.normpath(self.cleaned_data['archive'])
131 class ArchiveForm(CompressForm):
142 type = forms.ChoiceField(label=u'Typ archiwum', choices=TYPE_CHOICES, initial=ZIP)