Wersja XML.
[redakcja.git] / apps / explorer / forms.py
index af1534e..910db54 100644 (file)
@@ -2,10 +2,45 @@ from django import forms
 
 from lxml import etree
 from librarian import dcparser
 
 from lxml import etree
 from librarian import dcparser
-
+import django.utils
 
 from explorer import models
 
 
 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)
 
 class BookForm(forms.Form):
     content = forms.CharField(widget=forms.Textarea)
@@ -23,16 +58,17 @@ class ImageFoldersForm(forms.Form):
 
 
 class DublinCoreForm(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()
     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)
     publisher = forms.CharField()
     source_name = forms.CharField(widget=forms.Textarea)
     source_url = forms.URLField(verify_exists=False)
@@ -41,16 +77,14 @@ class DublinCoreForm(forms.Form):
     license = forms.CharField(required=False)
     license_description = forms.CharField(widget=forms.Textarea, required=False)
     
     license = forms.CharField(required=False)
     license_description = forms.CharField(widget=forms.Textarea, required=False)
     
-    commit_message = forms.CharField(required=False)
+    commit_message = forms.CharField(required=False, widget=forms.HiddenInput)
     
     def __init__(self, *args, **kwargs):
         text = None
     
     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)
         
         
         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():
-                self.fields[name].initial = value
\ No newline at end of file
+        if isinstance(info, dcparser.BookInfo):
+            for name, value in info.to_dict().items():
+                self.fields[name].initial = value