pretty tag fields in new resource form
[redakcja.git] / apps / catalogue / forms.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6 from catalogue.models import Category
7 from catalogue.models import Tag
8 from django import forms
9 from django.utils.translation import ugettext_lazy as _
10
11 from catalogue.constants import MASTERS
12
13
14 def tag_field(category_tag, required=True):
15     category = Category.objects.get(dc_tag=category_tag)
16     return forms.ModelMultipleChoiceField(queryset=category.tag_set.all(), required=required)
17
18
19 class DocumentCreateForm(forms.Form):
20     """
21         Form used for creating new documents.
22     """
23     owner_organization = forms.CharField(required=False)
24     title = forms.CharField()
25     language = forms.CharField()
26     publisher = forms.CharField(required=False)
27     description = forms.CharField(required=False)
28     rights = forms.CharField(required=False)
29     audience = forms.CharField()
30     
31     cover = forms.FileField(required=False)
32
33     def clean_cover(self):
34         cover = self.cleaned_data['cover']
35         if cover and cover.name.rsplit('.', 1)[-1].lower() not in ('jpg', 'jpeg', 'png', 'gif', 'svg'):
36             raise forms.ValidationError(_('The cover should be an image file (jpg/png/gif)'))
37         return file
38
39
40 class TagForm(forms.Form):
41     def __init__(self, category, instance=None, *args, **kwargs):
42         super(TagForm, self).__init__(*args, **kwargs)
43         self.category = category
44         self.instance = instance
45         self.field().queryset = Tag.objects.filter(category=self.category)
46         self.field().label = self.category.label.capitalize()
47         if self.instance:
48             self.field().initial = self.initial()
49
50     def save(self):
51         assert self.instance, 'No instance provided'
52         self.instance.tags.remove(*self.instance.tags.filter(category=self.category))
53         self.instance.tags.add(self.cleaned_tags())
54
55     def field(self):
56         raise NotImplementedError
57
58     def initial(self):
59         raise NotImplementedError
60
61     def cleaned_tags(self):
62         raise NotImplementedError
63
64
65 class TagSingleForm(TagForm):
66     tag = forms.ModelChoiceField(
67         Tag.objects.none(),
68         widget=forms.Select(attrs={
69             'class': 'form-control',
70         })
71     )
72
73     def field(self):
74         return self.fields['tag']
75
76     def initial(self):
77         return self.instance.tags.get(category=self.category)
78
79     def cleaned_tags(self):
80         return [self.cleaned_data['tag']]
81
82
83 class TagMultipleForm(TagForm):
84     tags = forms.ModelMultipleChoiceField(
85         Tag.objects.none(), required=False,
86         widget=forms.SelectMultiple(attrs={
87             'class': 'chosen-select',
88             'data-placeholder': _('Choose'),
89         }))
90
91     def field(self):
92         return self.fields['tags']
93
94     def initial(self):
95         return self.instance.tags.filter(category=self.category)
96
97     def cleaned_tags(self):
98         return self.cleaned_data['tags']
99
100
101 class DocumentsUploadForm(forms.Form):
102     """
103         Form used for uploading new documents.
104     """
105     file = forms.FileField(required=True, label=_('ZIP file'))
106     dirs = forms.BooleanField(
107         label=_('Directories are documents in chunks'),
108         widget=forms.CheckboxInput(attrs={'disabled': 'disabled'}))
109
110     def clean(self):
111         file = self.cleaned_data['file']
112
113         import zipfile
114         try:
115             z = self.cleaned_data['zip'] = zipfile.ZipFile(file)
116         except zipfile.BadZipfile:
117             raise forms.ValidationError("Should be a ZIP file.")
118         if z.testzip():
119             raise forms.ValidationError("ZIP file corrupt.")
120
121         return self.cleaned_data
122
123
124 class ChooseMasterForm(forms.Form):
125     """
126         Form used for fixing the chunks in a book.
127     """
128
129     master = forms.ChoiceField(choices=((m, m) for m in MASTERS))
130
131
132 class DocumentForkForm(forms.Form):
133     """
134         Form used for forking documents.
135     """
136     owner_organization = forms.CharField(required=False)