Dodanie formularza z panelem DublinCore.
authorzuber <marek@stepniowski.com>
Tue, 25 Aug 2009 14:44:52 +0000 (16:44 +0200)
committerzuber <marek@stepniowski.com>
Tue, 25 Aug 2009 14:44:52 +0000 (16:44 +0200)
apps/explorer/forms.py
apps/explorer/views.py
project/static/css/master.css
project/templates/explorer/file_xml.html
project/templates/explorer/panels/dceditor.html [new file with mode: 0644]
project/urls.py

index edb7ea6..e648aa5 100644 (file)
@@ -1,5 +1,8 @@
 from django import forms
 
+from lxml import etree
+from librarian import dcparser
+
 from explorer import models
 
 
@@ -15,3 +18,50 @@ class ImageFoldersForm(forms.Form):
         super(ImageFoldersForm, self).__init__(*args, **kwargs)
         self.fields['folders'].choices = [('', '-- Wybierz folder z obrazkami --')] + [(fn, fn) for fn in models.get_image_folders()]
 
+
+class DublinCoreForm(forms.Form):
+    wiki_url = forms.URLField(verify_exists=False)
+    author = forms.CharField()
+    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)
+    publisher = forms.CharField()
+    source_name = forms.CharField(widget=forms.Textarea)
+    source_url = forms.URLField(verify_exists=False)
+    url = forms.URLField(verify_exists=False)
+    parts = forms.CharField(widget=forms.Textarea, required=False)
+    license = forms.CharField(required=False)
+    license_description = forms.CharField(widget=forms.Textarea, required=False)
+    
+    def __init__(self, *args, **kwargs):
+        text = None
+        if 'text' in kwargs:
+            text = kwargs.pop('text')
+        
+        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
+    
+    def save(self, repository, path):
+        file_contents = repository.get_file(path).data()
+        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, unicode(etree.tostring(doc), 'utf-8'))
+
index eeac7b6..b8cfe3a 100644 (file)
@@ -65,11 +65,30 @@ def htmleditor_panel(request, path):
     })
  
 
+def dceditor_panel(request, path):
+    if request.method == 'POST':
+        form = forms.DublinCoreForm(request.POST)
+        if form.is_valid():
+            form.save(repo, path)
+            repo.commit(message='%s: DublinCore edited' % path)
+    else:
+        text = repo.get_file(path).data()
+        form = forms.DublinCoreForm(text=text)       
+
+    return direct_to_template(request, 'explorer/panels/dceditor.html', extra_context={
+        'form': form,
+    })
+
+
+# =================
+# = Utility views =
+# =================
 def folder_images(request, folder):
     return direct_to_template(request, 'explorer/folder_images.html', extra_context={
         'images': models.get_images_from_folder(folder),
     })
 
+
 def _add_references(message, issues):
     return message + " - " + ", ".join(map(lambda issue: "Refs #%d" % issue['id'], issues))
 
index caeddda..68ba100 100644 (file)
@@ -258,6 +258,23 @@ label {
     cursor: default;
 }
 
+/* =========================== */
+/* = DublinCore Editor panel = */
+/* =========================== */
+.panel-dceditor {
+    padding: 10px;
+}
+
+.panel-dceditor label {
+    font-size: 12px;
+    margin-top: 10px;
+    color: #666;
+    font-weight: bold;
+}
+
+.panel-dceditor input, .panel-dceditor textarea {
+    width: 400px;
+}
 
 div.isection {
        margin: 1em auto;
index 7f91022..484f54d 100644 (file)
@@ -19,7 +19,8 @@
                     <select name="select-left-panel" id="select-left-panel">
                         <option value="{% url xmleditor_panel hash %}">Edytor XML</option>
                         <option value="{% url htmleditor_panel hash %}">Edytor HTML</option>
-                        <option value="{% url gallery_panel hash %}">Galeria skanów</option>    
+                        <option value="{% url gallery_panel hash %}">Galeria skanów</option>
+                        <option value="{% url dceditor_panel hash %}">Edytor DublinCore</option>
                     </select>
                     <strong class="change-notification" style="display: none">Zmieniono!</strong>
                </div>
@@ -33,6 +34,7 @@
                         <option value="{% url xmleditor_panel hash %}">Edytor XML</option>
                         <option value="{% url htmleditor_panel hash %}">Edytor HTML</option>
                         <option value="{% url gallery_panel hash %}">Galeria skanów</option>
+                        <option value="{% url dceditor_panel hash %}">Edytor DublinCore</option>
                     </select>
                     <strong class="change-notification" style="display: none">Zmieniono!</strong>
                  </div>
diff --git a/project/templates/explorer/panels/dceditor.html b/project/templates/explorer/panels/dceditor.html
new file mode 100644 (file)
index 0000000..ee5146c
--- /dev/null
@@ -0,0 +1,21 @@
+<div class="panel-dceditor">
+    <form action="{{ request.get_full_path }}" method="post" accept-charset="utf-8">
+        {{ form }}
+        <p><input type="submit" value="Continue &rarr;"/></p>
+    </form>
+</div>
+<script type="text/javascript" charset="utf-8">
+    (function() {
+        var id = Math.ceil(Math.random() * 1000000000);
+        
+        panel(function(event, me) {
+            // $(document).bind('panel:contentChanged.' + id, function(event, p) {
+            //     $('.change-notification', $(me).parent()).fadeIn();
+            // });
+            $(me).addClass('panel-htmleditor');
+        }, function(event, me) {
+            $(me).removeClass('panel-htmleditor');
+            // $(document).unbind('panel:contentChanged.' + id);
+        });
+    })()
+</script>
index 1ba97d6..05fe1b4 100644 (file)
@@ -17,6 +17,7 @@ urlpatterns = patterns('',
     url(r'^editor/(?P<path>[^/]+)/panels/xmleditor/$', 'explorer.views.xmleditor_panel', name='xmleditor_panel'),
     url(r'^editor/(?P<path>[^/]+)/panels/gallery/$', 'explorer.views.gallery_panel', name='gallery_panel'),
     url(r'^editor/(?P<path>[^/]+)/panels/htmleditor/$', 'explorer.views.htmleditor_panel', name='htmleditor_panel'),
+    url(r'^editor/(?P<path>[^/]+)/panels/dceditor/$', 'explorer.views.dceditor_panel', name='dceditor_panel'),
     
     # Admin panel
     url(r'^admin/doc/', include('django.contrib.admindocs.urls')),