from django import forms
+from lxml import etree
+from librarian import dcparser
+
from explorer import models
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'))
+
})
+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))
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;
<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>
<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>
--- /dev/null
+<div class="panel-dceditor">
+ <form action="{{ request.get_full_path }}" method="post" accept-charset="utf-8">
+ {{ form }}
+ <p><input type="submit" value="Continue →"/></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>
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')),