Merge branch 'devel'
[qcg-portal.git] / filex / forms.py
1 # coding=utf-8
2 import os
3
4 from django import forms
5 from django.core.exceptions import ValidationError
6
7 from filex.models import Favorite
8 from filex.utils import host_validator, path_validator, name_validator
9
10
11 class FavoriteForm(forms.ModelForm):
12     class Meta:
13         model = Favorite
14         fields = ('owner', 'host', 'path')
15         widgets = {'owner': forms.HiddenInput()}
16
17     def clean_path(self):
18         return os.path.normpath(self.cleaned_data['path'])
19
20
21 class HostForm(forms.Form):
22     host = forms.CharField(label=u'Host', max_length=256, validators=[host_validator], widget=forms.HiddenInput())
23
24
25 class HostPathForm(HostForm):
26     path = forms.CharField(label=u'Ścieżka', max_length=1024, validators=[path_validator], widget=forms.HiddenInput())
27
28     def clean_path(self):
29         return os.path.normpath(self.cleaned_data['path'])
30
31
32 class HostPathNameForm(HostPathForm):
33     name = forms.CharField(label=u'Nazwa', max_length=256, validators=[name_validator])
34
35     def clean_name(self):
36         return os.path.normpath(self.cleaned_data['name'])
37
38
39 class HostItemsForm(HostForm):
40     dirs = forms.MultipleChoiceField(label=u'Katalogi', required=False, widget=forms.MultipleHiddenInput())
41     files = forms.MultipleChoiceField(label=u'Pliki', required=False, widget=forms.MultipleHiddenInput())
42
43     def __init__(self, data=None, *args, **kwargs):
44         super(HostItemsForm, self).__init__(data, *args, **kwargs)
45
46         if data is not None:
47             # accept user defined choices
48             self.fields['dirs'].choices += ((v, v) for v in data.getlist('dirs'))
49             self.fields['files'].choices += ((v, v) for v in data.getlist('files'))
50
51     def clean(self):
52         data = super(HostItemsForm, self).clean()
53
54         if not (data.get('dirs') or data.get('files')):
55             raise ValidationError('No items specified')
56
57         return data
58
59     @staticmethod
60     def _clean_paths(values):
61         errors, cleaned = [], []
62         for name in values:
63             try:
64                 path_validator(name)
65             except ValidationError as e:
66                 e.message += ' - ' + name
67                 errors.append(e)
68             else:
69                 cleaned.append(os.path.normpath(name))
70         if errors:
71             raise ValidationError(errors)
72
73         return cleaned
74
75     def clean_dirs(self):
76         return self._clean_paths(self.cleaned_data['dirs'])
77
78     def clean_files(self):
79         return self._clean_paths(self.cleaned_data['files'])
80     
81     
82 class RenameForm(HostForm):
83     src = forms.CharField(label=u'Stara nazwa', max_length=1024, validators=[path_validator], widget=forms.HiddenInput())
84     dst = forms.CharField(label=u'Nowa nazwa', max_length=1024, validators=[path_validator])
85
86     def clean_src(self):
87         return os.path.normpath(self.cleaned_data['src'])
88
89     def clean_dst(self):
90         return os.path.normpath(self.cleaned_data['dst'])
91
92
93 class ExtractForm(HostPathForm):
94     dst = forms.CharField(label=u'Katalog docelowy', max_length=1024, validators=[path_validator])
95
96     def clean_dst(self):
97         return os.path.normpath(self.cleaned_data['dst'])
98
99
100 class CompressForm(HostPathForm):
101     archive = forms.CharField(label=u'Nazwa', max_length=1024, validators=[path_validator])
102     files = forms.MultipleChoiceField(label=u'Pliki', widget=forms.MultipleHiddenInput())
103
104     def __init__(self, data=None, *args, **kwargs):
105         super(CompressForm, self).__init__(data, *args, **kwargs)
106
107         if data is not None:
108             # accept user defined choices
109             self.fields['files'].choices += ((v, v) for v in data.getlist('files'))
110
111     def clean_files(self):
112         errors, cleaned = [], []
113         for name in self.cleaned_data['files']:
114             try:
115                 name_validator(name)
116             except ValidationError as e:
117                 e.message += ' - ' + name
118                 errors.append(e)
119             else:
120                 cleaned.append(os.path.normpath(name))
121         if errors:
122             raise ValidationError(errors)
123
124         return cleaned
125
126     def clean_archive(self):
127         return os.path.normpath(self.cleaned_data['archive'])
128
129
130 class ArchiveForm(CompressForm):
131     ZIP = '.zip'
132     GZIP = '.tar.gz'
133     BZIP = '.tar.bz2'
134
135     TYPE_CHOICES = (
136         (ZIP, 'zip'),
137         (GZIP, 'tar.gz'),
138         (BZIP, 'tar.bz2'),
139     )
140
141     type = forms.ChoiceField(label=u'Typ archiwum', choices=TYPE_CHOICES, initial=ZIP)