X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/45fcd6d5e47f5f51e645f12a87776b9b95b2c0b6..10f48e60a7f7499a6602098fc44298e05d05af50:/apps/explorer/forms.py diff --git a/apps/explorer/forms.py b/apps/explorer/forms.py index aa6b48a6..910db542 100644 --- a/apps/explorer/forms.py +++ b/apps/explorer/forms.py @@ -2,9 +2,46 @@ from django import forms from lxml import etree from librarian import dcparser +import django.utils from explorer import models +class PersonField(forms.CharField): + def clean(self, value): + try: + return dcparser.Person.from_text( super(PersonField, self).clean(value) ) + except ValueError, e: + raise django.utils.ValidationError(e.message) + +class PersonListField(forms.Field): + + def __init__(self, *args, **kwargs): + super(PersonListField, self).__init__(*args, **kwargs) + + def _get_initial(self): + return self._initial and (u'\n'.join( ( unicode(person) for person in self._initial))) + + def _set_initial(self, value): + if value is None: + self._initial = None + elif isinstance(value, list): + self._initial = [ e if isinstance(e, dcparser.Person) \ + else dcparser.Person.from_text(e) for e in value ] + elif isinstance(value, basestring): + self._initial = [dcparser.Person.from_text(token) for token in value.split('\n') ] + else: + raise ValueError("Invalid value. Must be a list of dcparser.Person or string") + + initial = property(_get_initial, _set_initial) + + def clean(self, value): + super(PersonListField, self).clean(value) + people = value.split('\n') + try: + return [dcparser.Person.from_text(person) for person in people] + except ValueError, e: + raise django.utils.ValidationError(e.message) + class BookForm(forms.Form): content = forms.CharField(widget=forms.Textarea) commit_message = forms.CharField(required=False) @@ -21,16 +58,17 @@ class ImageFoldersForm(forms.Form): class DublinCoreForm(forms.Form): - wiki_url = forms.URLField(verify_exists=False) - author = forms.CharField() + about = forms.URLField(verify_exists=False) + author = PersonField() title = forms.CharField() epoch = forms.CharField() kind = forms.CharField() genre = forms.CharField() created_at = forms.DateField() released_to_public_domain_at = forms.DateField() - translator = forms.CharField(required=False) - technical_editor = forms.CharField(required=False) + editors = PersonListField(widget=forms.Textarea, required=False) + translators = PersonListField(widget=forms.Textarea, required=False) + technical_editors = PersonListField(widget=forms.Textarea, required=False) publisher = forms.CharField() source_name = forms.CharField(widget=forms.Textarea) source_url = forms.URLField(verify_exists=False) @@ -39,30 +77,14 @@ class DublinCoreForm(forms.Form): license = forms.CharField(required=False) license_description = forms.CharField(widget=forms.Textarea, required=False) + commit_message = forms.CharField(required=False, widget=forms.HiddenInput) + def __init__(self, *args, **kwargs): text = None - if 'text' in kwargs: - text = kwargs.pop('text') + info = kwargs.pop('info', None) super(DublinCoreForm, self).__init__(*args, **kwargs) - if text is not None: - book_info = dcparser.BookInfo.from_string(text) - for name, value in book_info.to_dict().items(): + if isinstance(info, dcparser.BookInfo): + for name, value in info.to_dict().items(): self.fields[name].initial = value - - def save(self, repository, path): - file_contents = repository.get_file(path) - doc = etree.fromstring(file_contents) - - book_info = dcparser.BookInfo() - for name, value in self.cleaned_data.items(): - if value is not None and value != '': - setattr(book_info, name, value) - rdf = etree.XML(book_info.to_xml()) - - old_rdf = doc.getroottree().find('//{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF') - old_rdf.getparent().remove(old_rdf) - doc.insert(0, rdf) - repository.add_file(path, etree.tostring(doc, pretty_print=True, encoding=unicode)) -