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