+++ /dev/null
-from django.contrib import admin
-
-import explorer.models
-from explorer import forms
-
-admin.site.register(explorer.models.EditorSettings)
-admin.site.register(explorer.models.EditorPanel)
-
-class GalleryAdmin(admin.ModelAdmin):
- form = forms.GalleryChoiceForm
- list_display = ('document', 'subpath',)
- search_fields = ('document', 'subpath',)
-
-admin.site.register(explorer.models.GalleryForDocument, GalleryAdmin)
\ No newline at end of file
+++ /dev/null
-# -*- coding: utf-8
-__author__="lreqc"
-__date__ ="$2009-09-03 08:34:10$"
-
-def settings(request):
- from django.conf import settings
- return {'MEDIA_URL': settings.MEDIA_URL,
- 'STATIC_URL': settings.STATIC_URL,
- 'REDMINE_URL': settings.REDMINE_URL }
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-import datetime
-
-from django.conf import settings
-from django.db import models
-from django import forms
-from django.utils import simplejson as json
-
-
-class JSONEncoder(json.JSONEncoder):
- def default(self, obj):
- if isinstance(obj, datetime.datetime):
- return obj.strftime('%Y-%m-%dT%H:%M:%S')
- elif isinstance(obj, datetime.date):
- return obj.strftime('%Y-%m-%d')
- elif isinstance(obj, datetime.time):
- return obj.strftime('%H:%M:%S')
- return json.JSONEncoder.default(self, obj)
-
-
-def dumps(data):
- return JSONEncoder().encode(data)
-
-
-def loads(str):
- return json.loads(str, encoding=settings.DEFAULT_CHARSET)
-
-
-class JSONFormField(forms.CharField):
- widget = forms.Textarea
-
- def clean(self, value):
- try:
- loads(value)
- return value
- except ValueError, e:
- raise forms.ValidationError('Enter a valid JSON value. Error: %s' % e)
-
-
-class JSONField(models.TextField):
- def formfield(self, **kwargs):
- defaults = {'form_class': JSONFormField}
- defaults.update(kwargs)
- return super(JSONField, self).formfield(**defaults)
-
- def db_type(self):
- return 'text'
-
- def get_internal_type(self):
- return 'TextField'
-
- def contribute_to_class(self, cls, name):
- super(JSONField, self).contribute_to_class(cls, name)
-
- def get_value(model_instance):
- return loads(getattr(model_instance, self.attname, None))
- setattr(cls, 'get_%s_value' % self.name, get_value)
-
- def set_value(model_instance, json):
- return setattr(model_instance, self.attname, dumps(json))
- setattr(cls, 'set_%s_value' % self.name, set_value)
-
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<django-objects version="1.0"><object pk="1" model="explorer.editorsettings"><field to="auth.user" name="user" rel="ManyToOneRel">1</field><field type="TextField" name="settings">{"lastUpdate": 1252490221.4749999, "panels": [{"ratio": 0.484375, "name": "xmleditor"}, {"ratio": 0.515625, "name": "htmleditor"}]}</field></object><object pk="htmleditor" model="explorer.editorpanel"><field type="CharField" name="display_name">Edytor HTML</field><field to="toolbar.buttongroup" name="toolbar_extra" rel="ManyToOneRel">24</field><field to="toolbar.buttongroup" name="toolbar_groups" rel="ManyToManyRel"></field></object><object pk="xmleditor" model="explorer.editorpanel"><field type="CharField" name="display_name">Edytor XML</field><field to="toolbar.buttongroup" name="toolbar_extra" rel="ManyToOneRel">23</field><field to="toolbar.buttongroup" name="toolbar_groups" rel="ManyToManyRel"><object pk="14"></object><object pk="2"></object><object pk="21"></object><object pk="12"></object><object pk="18"></object><object pk="13"></object><object pk="1"></object><object pk="22"></object><object pk="16"></object><object pk="11"></object><object pk="15"></object><object pk="17"></object></field></object><object pk="dceditor" model="explorer.editorpanel"><field type="CharField" name="display_name">Dublin Core</field><field to="toolbar.buttongroup" name="toolbar_extra" rel="ManyToOneRel"><None></None></field><field to="toolbar.buttongroup" name="toolbar_groups" rel="ManyToManyRel"></field></object><object pk="gallery" model="explorer.editorpanel"><field type="CharField" name="display_name">Galeria</field><field to="toolbar.buttongroup" name="toolbar_extra" rel="ManyToOneRel"><None></None></field><field to="toolbar.buttongroup" name="toolbar_groups" rel="ManyToManyRel"></field></object></django-objects>\r
+++ /dev/null
-# -*- coding: utf-8 -*-
-import os
-from librarian import dcparser
-
-from django import forms
-from django.conf import settings
-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)
-
-def person_conv(value):
- if isinstance(value, dcparser.Person):
- return value
- elif isinstance(value, basestring):
- return dcparser.Person.from_text( unicode(value) )
- else:
- raise ValueError("Can't convert '%s' to Person object." % value)
-
-class ListField(forms.Field):
- def __init__(self, *args, **kwargs):
- self.convert = kwargs.pop('converter', unicode)
- if not kwargs.has_key('widget'):
- kwargs['widget'] = forms.Textarea
- super(ListField, 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 = [ self.convert(e) for e in value ]
- elif isinstance(value, basestring):
- self._initial = [ self.convert(e) for e 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(ListField, self).clean(value)
- elems = value.split('\n')
- try:
- return [self.convert(el) for el in elems]
- except ValueError, err:
- raise django.utils.ValidationError(err.message)
-
-class BookForm(forms.Form):
- content = forms.CharField(widget=forms.Textarea)
- commit_message = forms.CharField(required=False)
-
-class MergeForm(forms.Form):
- message = forms.CharField(error_messages={'required': 'Please write a merge description.'})
-
-class BookUploadForm(forms.Form):
- file = forms.FileField(label='Source OCR file')
- bookname = forms.RegexField(regex=r'[0-9\.\w_-]+', \
- label='Publication name', help_text='Example: slowacki-beniowski')
- autoxml = forms.BooleanField(required=False, initial=True, label=u"Generate DublinCore template")
-
-class ImageFoldersForm(forms.Form):
- folders = forms.ChoiceField(required=False)
-
- def __init__(self, *args, **kwargs):
- super(ImageFoldersForm, self).__init__(*args, **kwargs)
- self.fields['folders'].choices = [('', '-- Wybierz folder z obrazkami --')] + [(fn, fn) for fn in models.get_image_folders()]
-
-class SplitForm(forms.Form):
- partname = forms.RegexField(regex='[0-9\.\w_-]+', \
- label='Part name', help_text='Example: rozdział-2')
- autoxml = forms.BooleanField(required=False, initial=False, label=u"Split as new publication")
- fulltext = forms.CharField(widget=forms.HiddenInput(), required=False)
- splittext = forms.CharField(widget=forms.HiddenInput(), required=False)
-
-class GalleryChoiceForm(forms.ModelForm):
- subpath = forms.ChoiceField(choices=())
-
- def __init__(self, *args, **kwargs):
- super(GalleryChoiceForm, self).__init__(*args, **kwargs)
- self.fields['subpath'].choices = [(settings.IMAGE_DIR + '/' + x, x) for x in os.listdir(settings.MEDIA_ROOT + settings.IMAGE_DIR)]
-
- class Meta:
- model = models.GalleryForDocument
- fields = ('document', 'subpath',)
-
-class DublinCoreForm(forms.Form):
- about = forms.URLField(verify_exists=False)
- author = PersonField()
- title = forms.CharField()
- epochs = ListField()
- kinds = ListField()
- genres = ListField()
- created_at = forms.DateField()
- released_to_public_domain_at = forms.DateField(required=False)
- editors = ListField(widget=forms.Textarea, required=False, converter=person_conv)
- translators = ListField(widget=forms.Textarea, required=False, converter=person_conv)
- technical_editors = ListField(widget=forms.Textarea, required=False, converter=person_conv)
- publisher = forms.CharField()
- source_name = forms.CharField(widget=forms.Textarea, required=False)
- source_url = forms.URLField(verify_exists=False, required=False)
- url = forms.URLField(verify_exists=False)
- parts = ListField(required=False)
- 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):
- info = kwargs.pop('info', None)
- super(DublinCoreForm, self).__init__(*args, **kwargs)
-
- if isinstance(info, dcparser.BookInfo):
- vdict = info.to_dict()
- for name in self.fields.keys():
- if vdict.has_key(name):
- self.fields[name].initial = vdict[name]
-
+++ /dev/null
-import urllib
-
-from django.conf import settings
-from django.utils import simplejson
-
-from explorer import models
-
-
-EDITOR_DEFAULT_SETTINGS_JSON = simplejson.dumps(settings.EDITOR_DEFAULT_SETTINGS)
-
-
-class EditorSettingsMiddleware(object):
- def process_request(self, request):
- if request.user.is_anonymous():
- return
- cookie_settings = request.COOKIES.get(settings.EDITOR_COOKIE_NAME, EDITOR_DEFAULT_SETTINGS_JSON)
-
- cookie_settings = simplejson.loads(urllib.unquote(cookie_settings))
- last_update = cookie_settings.get('lastUpdate', 0)
- cookie_settings['lastUpdate'] = last_update
-
- try:
- editor_settings = models.EditorSettings.objects.get(user=request.user)
- except models.EditorSettings.DoesNotExist:
- editor_settings = models.EditorSettings(user=request.user)
- editor_settings.set_settings_value(cookie_settings)
- editor_settings.save()
-
- # print editor_settings.get_settings_value()['lastUpdate'], '<>', last_update
- if editor_settings.get_settings_value()['lastUpdate'] < last_update:
- editor_settings.set_settings_value(cookie_settings)
- editor_settings.save()
-
- request.editor_settings = editor_settings
-
-
- def process_response(self, request, response):
- if hasattr(request, 'editor_settings'):
- response.set_cookie(settings.EDITOR_COOKIE_NAME,
- urllib.quote(request.editor_settings.settings), max_age=7 * 60 * 60 * 24, path='/')
-
- return response
+++ /dev/null
-# -*- encoding: utf-8 -*-
-import os
-
-from django.db import models
-from django.contrib.auth.models import User
-from django.conf import settings
-from django.utils.translation import gettext_lazy as _
-
-import toolbar.models
-
-from explorer import fields
-
-class EditorSettings(models.Model):
- """Ustawienia edytora dla użytkownika.
-
- Pole settings zawiera obiekt JSON o kluczach:
- - panels - lista otwartych paneli i ich proporcje
- - recentFiles - lista otwartych plików i ustawienia dla nich
-
- Przykład:
- {
- 'panels': [
- {'name': 'htmleditor',
- 'ratio': 0.5},
- {'name': 'gallery', 'ratio': 0.5}
- ],
- 'recentFiles': [
- {
- 'fileId': 'mickiewicz_pan_tadeusz.xml',
- 'panels': [
- {'name': 'htmleditor', 'ratio': 0.4},
- {'name': 'gallery', 'ratio': 0.6}
- ]
- }
- ]
- }
- """
- user = models.ForeignKey(User, unique=True)
- settings = fields.JSONField()
-
- class Meta:
- verbose_name, verbose_name_plural = _("editor settings"), _("editor settings")
-
- def __unicode__(self):
- return u"Editor settings for %s" % self.user.username
-
-class EditorPanel(models.Model):
- id = models.CharField(max_length=24, primary_key=True)
- display_name = models.CharField(max_length=128)
-
- toolbar_groups = models.ManyToManyField(toolbar.models.ButtonGroup, blank=True)
- toolbar_extra = models.ForeignKey(toolbar.models.ButtonGroup, null=True, blank=True,
- unique=True, related_name='main_editor_panels')
-
- def __unicode__(self):
- return self.display_name
-
-
-# Yes, this is intentionally unnormalized !
-class GalleryForDocument(models.Model):
- name = models.CharField(max_length=100, blank=True)
-
- # document associated with the gallery
- document = models.CharField(max_length=255, unique=True)
-
- # directory containing scans under MEDIA_ROOT/
- subpath = models.CharField(max_length=255)
-
- def __unicode__(self):
- return u"%s:%s" % (self.subpath, self.document)
-
+++ /dev/null
-from django import template
-# from toolbar import models
-register = template.Library()
-
-from django.template.defaultfilters import stringfilter
-
-@register.filter(name='bookname')
-@stringfilter
-def bookname(fileid):
- return ', '.join(\
- ' '.join(s.capitalize() for s in part.split('_'))\
- for part in fileid.split('$'))
-
-@register.inclusion_tag('explorer/file_tree_part.html')
-def tree_part(document):
- return {'document': document}
\ No newline at end of file
+++ /dev/null
-# -*- coding: utf-8 -*-
-import urllib2
-
-import logging
-log = logging.getLogger('platforma.explorer.views')
-
-from django.conf import settings
-from django.contrib.auth.decorators import login_required, permission_required
-
-from django.core.urlresolvers import reverse
-from django.http import HttpResponse, Http404
-from django.utils import simplejson as json
-from django.views.generic.simple import direct_to_template
-from django.shortcuts import render_to_response
-from django.template import RequestContext
-from django.contrib.auth.decorators import login_required
-
-from explorer import forms, models
-import os
-# from api.models import PullRequest
-from bookthemes.models import Theme
-
-def ajax_login_required(view):
- """Similar ro @login_required, but instead of redirect,
- just return some JSON stuff with error."""
- def view_with_auth(request, *args, **kwargs):
- if request.user.is_authenticated():
- return view(request, *args, **kwargs)
- # not authenticated
- return HttpResponse( json.dumps({'result': 'access_denied', 'errors': ['Brak dostępu.']}) );
- return view_with_auth
-
-@login_required
-def display_editor(request, path):
- user = request.GET.get('user', request.user.username)
- gallery_form = forms.GalleryChoiceForm()
-
- return render_to_response('explorer/editor.html',
- # mimetype="text/html",
- dictionary = {
- 'fileid': path,
- 'euser': user,
- 'gallery_form': gallery_form,
- 'available_themes': ({'first_letter': t.name[0].upper(), 'name': t.name} for t in Theme.objects.order_by('name')),
- }, context_instance=RequestContext(request))
-
-#
-# View all files
-#
-def file_list(request):
- from wiki.views import document_list
-
- # short-circut the api document list
- # doctree = library_resource.handler.read(request)
- # print "DOCTREE:", doctree['documents']
-
- return document_list(request, 'explorer/file_list.html')
-
- # return direct_to_template(request, 'explorer/file_list.html', extra_context={
- # 'files': files, 'bookform': bookform,
- # })
-
-@permission_required('api.document.can_add')
-def file_upload(request):
- from api.resources import library_resource
- from api.forms import DocumentUploadForm
- from django.http import HttpRequest, HttpResponseRedirect
-
- response = library_resource.handler.create(request)
-
- if isinstance(response, HttpResponse):
- data = json.loads(response.content)
-
- if response.status_code == 201:
- return HttpResponseRedirect( \
- reverse("editor_view", args=[ data['name'] ]) )
- else:
- bookform = DocumentUploadForm(request.POST, request.FILES)
- bookform.is_valid()
-
- return direct_to_template(request, 'explorer/file_upload.html',
- extra_context={'bookform': bookform } )
-
-
-@login_required
-def print_html(request, **kwargs):
- from api.resources import document_html_resource
-
- kwargs['stylesheet'] = 'legacy'
-
- output = document_html_resource.handler.read(request, **kwargs)
-
- if isinstance(output, HttpResponse):
- # errors = json.loads(output.content)
- output.mimetype = "text/plain"
- return output
-
- return direct_to_template(request, 'html4print.html',
- extra_context={'output': output, 'docid': kwargs['docid']},
- mimetype="text/html" )
-
-
-def _add_references(message, issues):
- return message + " - " + ", ".join(map(lambda issue: "Refs #%d" % issue['id'], issues))
-
-def _get_issues_for_file(fileid):
- uf = None
- try:
- uf = urllib2.urlopen(settings.REDMINE_URL + 'publications/issues/%s.json' % fileid)
- return json.loads(uf.read())
- except urllib2.HTTPError:
- return []
- finally:
- if uf: uf.close()
-
-# =================
-# = Pull requests =
-# =================
-def pull_requests(request):
- objects = PullRequest.objects.order_by('-status', 'timestamp')
-
- if not request.user.has_perm('explorer.book.can_share'):
- objects = objects.filter(comitter=request.user)
-
- return direct_to_template(request, 'manager/pull_request.html',
- extra_context = {'objects': objects} )
-
-
-#
-# Testing
-#
-def renderer_test(request):
- return direct_to_template(request, 'renderer.html', mimetype="text/html",
- extra_context = {} )
-
-
-def document_gallery(request, directory):
- try:
- base_dir = os.path.join(settings.MEDIA_ROOT, settings.FILEBROWSER_DIRECTORY, directory)
- print base_dir
- images = ['%s%s%s/%s' % (settings.MEDIA_URL, settings.FILEBROWSER_DIRECTORY, directory, f) for f in os.listdir(base_dir) if os.path.splitext(f)[1].lower() in ('.jpg', '.jpeg', '.png')]
- return HttpResponse(json.dumps(images))
- except (IndexError, OSError), e:
- raise Http404
+import os
+
+from django.conf import settings
from django.views.generic.simple import direct_to_template
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
from django.utils import simplejson as json
from wiki.models import storage, Document, DocumentNotFound
'document': document,
'form': form,
})
+
+
+def document_gallery(request, directory):
+ try:
+ base_dir = os.path.join(settings.MEDIA_ROOT, settings.FILEBROWSER_DIRECTORY, directory)
+ print base_dir
+ images = ['%s%s%s/%s' % (settings.MEDIA_URL, settings.FILEBROWSER_DIRECTORY, directory, f) for f in os.listdir(base_dir) if os.path.splitext(f)[1].lower() in ('.jpg', '.jpeg', '.png')]
+ return HttpResponse(json.dumps(images))
+ except (IndexError, OSError), e:
+ raise Http404
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
- "explorer.context_processors.settings",
+ "platforma.context_processors.settings",
"django.core.context_processors.request",
)
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'explorer.middleware.EditorSettingsMiddleware',
'django.middleware.doc.XViewMiddleware',
-
'maintenancemode.middleware.MaintenanceModeMiddleware',
)
'piston',
'sorl.thumbnail',
'filebrowser',
- 'explorer',
+ # 'explorer',
'toolbar',
'bookthemes',
# 'api',
# REPOSITORY_PATH = '/Users/zuber/Projekty/platforma/files/books'
IMAGE_DIR = 'images'
-EDITOR_COOKIE_NAME = 'options'
-EDITOR_DEFAULT_SETTINGS = {
- 'panels': [
- {'name': 'htmleditor', 'ratio': 0.5},
- {'name': 'gallery', 'ratio': 0.5}
- ],
-}
# Python logging settings
import logging
urlpatterns = patterns('',
# Explorer:
- url(r'^$', 'explorer.views.file_list', name='file_list'),
- url(r'^file/upload', 'explorer.views.file_upload', name='file_upload'),
+ # url(r'^$', 'explorer.views.file_list', name='file_list'),
+ # url(r'^file/upload', 'explorer.views.file_upload', name='file_upload'),
- url(r'^management/pull-requests$', 'explorer.views.pull_requests'),
+ # url(r'^management/pull-requests$', 'explorer.views.pull_requests'),
# Editor panels
- url(r'^editor/'+PATH_END, 'explorer.views.display_editor', name='editor_view'),
- url(r'^editor/$', 'explorer.views.file_list', name='editor_base'),
+ # url(r'^editor/'+PATH_END, 'explorer.views.display_editor', name='editor_view'),
+ # url(r'^editor/$', 'explorer.views.file_list', name='editor_base'),
- url(r'^file/(?P<docid>[^/]+)/print$', 'explorer.views.print_html', name="file_print"),
+ # url(r'^file/(?P<docid>[^/]+)/print$', 'explorer.views.print_html', name="file_print"),
+ url(r'^$', 'wiki.views.document_list', {'template_name': 'explorer/file_list.html'}),
+
# Admin panel
(r'^admin/filebrowser/', include('filebrowser.urls')),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/(.*)', admin.site.root),
# Theme database
- url(r'themes/', include('bookthemes.urls')),
+ # url(r'themes/', include('bookthemes.urls')),
# Our über-restful api
# url(r'^api/', include('api.urls')),
- url(r'^gallery/(?P<directory>[^/]+)$', 'explorer.views.document_gallery'),
+ url(r'^gallery/(?P<directory>[^/]+)$', 'wiki.views.document_gallery'),
# Static files (should be served by Apache)
url(r'^%s(?P<path>.+)$' % settings.MEDIA_URL[1:], 'django.views.static.serve',