1 # -*- coding: utf-8 -*-
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.
6 from django import forms
7 from django.core.exceptions import ValidationError
8 from django.utils.translation import ugettext_lazy as _
10 from catalogue.constants import STAGES
11 from librarian.document import Document
14 class DocumentTextSaveForm(forms.Form):
16 Form for saving document's text:
18 * parent_revision - revision which the modified text originated from.
19 * comment - user's verbose comment; will be used in commit.
20 * stage - change to this stage
24 parent_revision = forms.IntegerField(widget=forms.HiddenInput, required=False)
25 text = forms.CharField(widget=forms.HiddenInput)
27 author_name = forms.CharField(
30 help_text=_(u"Your name"),
33 author_email = forms.EmailField(
35 label=_(u"Author's email"),
36 help_text=_(u"Your email address, so we can show a gravatar :)"),
39 comment = forms.CharField(
41 widget=forms.Textarea,
42 label=_(u"Your comments"),
43 help_text=_(u"Describe changes you made."),
46 stage = forms.ChoiceField(
47 choices=[(s, s) for s in STAGES],
50 help_text=_(u"If completed a work stage, change to another one."),
53 def __init__(self, *args, **kwargs):
54 user = kwargs.pop('user')
55 super(DocumentTextSaveForm, self).__init__(*args, **kwargs)
56 if user and user.is_authenticated():
57 self.fields['author_name'].required = False
58 self.fields['author_email'].required = False
61 text = self.cleaned_data['text']
63 doc = Document.from_string(text)
64 except ValueError as e:
65 raise ValidationError(e.message)
67 from librarian import SSTNS, DCNS
68 root_elem = doc.edoc.getroot()
69 if len(root_elem) < 1 or root_elem[0].tag != SSTNS('metadata'):
70 raise ValidationError("The first tag in section should be metadata")
71 if len(root_elem) < 2 or root_elem[1].tag != SSTNS('header'):
72 raise ValidationError("The first tag after metadata should be header")
74 if not getattr(header, 'text', None) or not header.text.strip():
75 raise ValidationError(
76 "The first header should contain the title in plain text (no links, emphasis etc.) and cannot be empty")
78 cover_url = doc.meta.get_one(DCNS('relation.coverimage.url'))
80 ext = cover_url.rsplit('.', 1)[-1].lower()
81 if ext not in ('jpg', 'jpeg', 'png', 'gif', 'svg'):
82 raise ValidationError('Invalid cover image format, should be an image file (jpg, png, gif, svg). '
83 'Change it in Metadata.')
87 class DocumentTextRevertForm(forms.Form):
89 Form for reverting document's text:
91 * revision - revision to revert to.
92 * comment - user's verbose comment; will be used in commit.
96 revision = forms.IntegerField(widget=forms.HiddenInput)
98 author_name = forms.CharField(
101 help_text=_(u"Your name"),
104 author_email = forms.EmailField(
106 label=_(u"Author's email"),
107 help_text=_(u"Your email address, so we can show a gravatar :)"),
110 comment = forms.CharField(
112 widget=forms.Textarea,
113 label=_(u"Your comments"),
114 help_text=_(u"Describe the reason for reverting."),
118 class DocumentTextPublishForm(forms.Form):
119 revision = forms.IntegerField(widget=forms.HiddenInput)