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         ext = doc.meta.get_one(DCNS('relation.coverimage.url')).rsplit('.', 1)[-1].lower()
 
  79         if ext not in ('jpg', 'jpeg', 'png', 'gif', 'tif', 'tiff'):
 
  80             raise ValidationError('Invalid cover image format, should be an image file (jpg, png, gif). '
 
  81                                   'Change it in Metadata.')
 
  85 class DocumentTextRevertForm(forms.Form):
 
  87     Form for reverting document's text:
 
  89         * revision - revision to revert to.
 
  90         * comment - user's verbose comment; will be used in commit.
 
  94     revision = forms.IntegerField(widget=forms.HiddenInput)
 
  96     author_name = forms.CharField(
 
  99         help_text=_(u"Your name"),
 
 102     author_email = forms.EmailField(
 
 104         label=_(u"Author's email"),
 
 105         help_text=_(u"Your email address, so we can show a gravatar :)"),
 
 108     comment = forms.CharField(
 
 110         widget=forms.Textarea,
 
 111         label=_(u"Your comments"),
 
 112         help_text=_(u"Describe the reason for reverting."),
 
 116 class DocumentTextPublishForm(forms.Form):
 
 117     revision = forms.IntegerField(widget=forms.HiddenInput)