From: olivier <> Date: Thu, 11 Feb 2010 22:31:25 +0000 (+0000) Subject: add support for rst based flat pages ; add descriptive text and image to home X-Git-Tag: 1.1~549 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=97f48ecba4e323d69e40ddd758a585b1cf080fc7;p=telemeta.git add support for rst based flat pages ; add descriptive text and image to home --- diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index f1e9468a..a9708264 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -1,4 +1,4 @@ -* {margin: 0; padding: 0;} +body {margin: 0; padding: 0;} a {text-decoration: none; color: #969696;} a img {border: none;} html, input, select, textarea, h1, h2, h3, h4, h5, h6 { @@ -23,7 +23,7 @@ a:link:hover, a:visited:hover { } a img { border: none; } -h3 { +.rst-content h1, h3 { font-size: 1.2em; font-weight: bold; color: #353535; @@ -620,3 +620,8 @@ table.listing tbody tr:hover { background: #f7f8fa !important } border: solid 1px #888; margin-top: 0.8em; } + +img.home-image { + margin: 0 1.5em 1.5em 0; + float: left; +} diff --git a/telemeta/models/location.py b/telemeta/models/location.py index d5c660d5..c0621423 100644 --- a/telemeta/models/location.py +++ b/telemeta/models/location.py @@ -102,6 +102,7 @@ class Location(ModelCore): class Meta(MetaCore): db_table = 'locations' + verbose_name = _('location') def __unicode__(self): return self.name diff --git a/telemeta/pages/default/parts/home.rst b/telemeta/pages/default/parts/home.rst new file mode 100644 index 00000000..76d944e2 --- /dev/null +++ b/telemeta/pages/default/parts/home.rst @@ -0,0 +1,16 @@ +=================================================== +Archives du Centre de Recherche en Ethnomusicologie +=================================================== + +Le Centre de Recherche en Ethnomusicologie fait partie du Laboratoire d'Ethnologie et de Sociologie Comparative (UMR 7186). Il se consacre à l'étude des pratiques et des savoirs musicaux, conçus autant comme processus de différentiation socio-culturelle que comme forme d'expression commune à l'Homme. + +Cette approche, fondée sur un recueil raisonné des données musicales et un travail simultané d'enquête ethnographique, s'inscrit dans une anthropologie du fait musical envisagé dans ses dimensions socio-culturelles, esthétiques, formelles, acoustiques, kinésiques et finalement cognitives. + +.. image:: home_img.jpg + :class: home-image + +Le Centre investit par ailleurs de nouveaux objets encore peu explorés de la discipline comme le geste musical et chorégraphique, la construction culturelle et cognitive de l'émotion, ou encore les représentations du sonore. Les thématiques développées par les chercheurs, soit individuellement, soit dans le cadre de groupes de recherche, sont régulièrement exposées dans le cadre d'un séminaire interne. + +Le CREM gère un vaste fonds documentaire (archives musicales et livres) de la plus haute valeur patrimoniale et consulté par un public international. Il est éditeur d'une importante collection de disques. + + diff --git a/telemeta/pages/default/parts/home_img.jpg b/telemeta/pages/default/parts/home_img.jpg new file mode 100644 index 00000000..b2dc98aa Binary files /dev/null and b/telemeta/pages/default/parts/home_img.jpg differ diff --git a/telemeta/pages/fr/parts/home.rst b/telemeta/pages/fr/parts/home.rst new file mode 100644 index 00000000..76d944e2 --- /dev/null +++ b/telemeta/pages/fr/parts/home.rst @@ -0,0 +1,16 @@ +=================================================== +Archives du Centre de Recherche en Ethnomusicologie +=================================================== + +Le Centre de Recherche en Ethnomusicologie fait partie du Laboratoire d'Ethnologie et de Sociologie Comparative (UMR 7186). Il se consacre à l'étude des pratiques et des savoirs musicaux, conçus autant comme processus de différentiation socio-culturelle que comme forme d'expression commune à l'Homme. + +Cette approche, fondée sur un recueil raisonné des données musicales et un travail simultané d'enquête ethnographique, s'inscrit dans une anthropologie du fait musical envisagé dans ses dimensions socio-culturelles, esthétiques, formelles, acoustiques, kinésiques et finalement cognitives. + +.. image:: home_img.jpg + :class: home-image + +Le Centre investit par ailleurs de nouveaux objets encore peu explorés de la discipline comme le geste musical et chorégraphique, la construction culturelle et cognitive de l'émotion, ou encore les représentations du sonore. Les thématiques développées par les chercheurs, soit individuellement, soit dans le cadre de groupes de recherche, sont régulièrement exposées dans le cadre d'un séminaire interne. + +Le CREM gère un vaste fonds documentaire (archives musicales et livres) de la plus haute valeur patrimoniale et consulté par un public international. Il est éditeur d'une importante collection de disques. + + diff --git a/telemeta/templates/telemeta/flatpage.html b/telemeta/templates/telemeta/flatpage.html new file mode 100644 index 00000000..9ec14df7 --- /dev/null +++ b/telemeta/templates/telemeta/flatpage.html @@ -0,0 +1 @@ +{% extends "telemeta_default/flatpage.html" %} diff --git a/telemeta/templates/telemeta_default/flatpage.html b/telemeta/templates/telemeta_default/flatpage.html new file mode 100644 index 00000000..f7a06cf7 --- /dev/null +++ b/telemeta/templates/telemeta_default/flatpage.html @@ -0,0 +1,5 @@ +{% extends "telemeta/base.html" %} +{% load telemeta_utils %} +{% block content %} +{{ page_content|rst }} +{% endblock %} diff --git a/telemeta/templates/telemeta_default/index.html b/telemeta/templates/telemeta_default/index.html index 08d4e9bf..78e725dd 100644 --- a/telemeta/templates/telemeta_default/index.html +++ b/telemeta/templates/telemeta_default/index.html @@ -1,5 +1,9 @@ {% extends "telemeta/base.html" %} +{% load telemeta_utils %} {% block content %} +{{ page_content|rst }} + + {% endblock %} diff --git a/telemeta/templates/telemeta_default/search_criteria.html b/telemeta/templates/telemeta_default/search_criteria.html index d97000b3..d81df268 100644 --- a/telemeta/templates/telemeta_default/search_criteria.html +++ b/telemeta/templates/telemeta_default/search_criteria.html @@ -29,7 +29,7 @@ $(document).ready(function () {

- +

diff --git a/telemeta/templatetags/telemeta_utils.py b/telemeta/templatetags/telemeta_utils.py index dfc8ce31..0eeb1b4c 100644 --- a/telemeta/templatetags/telemeta_utils.py +++ b/telemeta/templatetags/telemeta_utils.py @@ -8,6 +8,10 @@ from django import template from django.utils.text import capfirst from telemeta import models from django.utils.translation import ungettext +from docutils.core import publish_parts +from django.utils.encoding import smart_str, force_unicode +from django.utils.safestring import mark_safe +import re register = template.Library() @@ -165,10 +169,13 @@ def prepend(str, prefix): return '' @register.simple_tag -def field_label(model, field): +def field_label(model, field=None): if isinstance(model, basestring): model = getattr(models, model) + if not field: + return capfirst(unicode(model._meta.verbose_name)) + return capfirst(unicode(model.field_label(field))) @register.simple_tag @@ -209,3 +216,36 @@ def variable_link(object, url_name, url_key): @register.filter def equals(value1, value2): return value1 == value2 + +@register.filter +def rst(content): + parsed = "" + path = getattr(content, 'path', '') + if isinstance(content, basestring): + content = content.split("\n") + + for line in content: + match = re.match('^(\.\. *(?:_[^:]*:|image::) *)([^ ]+) *$', line) + if match: + directive, urlname = match.groups() + line = directive + try: + i = urlname.index('telemeta-') + except ValueError: + i = -1 + if i == 0: + line += reverse(urlname) + elif urlname[:1] != '/': + print '|%s|' % urlname + line += reverse('telemeta-flatpage', args=[path + '/../' + urlname]) + else: + line += urlname + + parsed += line + "\n" + + parts = publish_parts(source=smart_str(parsed), writer_name="html4css1", settings_overrides={}) + return mark_safe('
\n' + force_unicode(parts["html_body"]) + '
') +rst.is_safe = True + + + diff --git a/telemeta/urls.py b/telemeta/urls.py index 49fece21..3ebe7716 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -165,6 +165,9 @@ urlpatterns = patterns('', {'document_root': htdocs+'/timeside'}, name="telemeta-timeside"), + # Flat pages + url(r'^page/(?P.*)$', web_view.render_flatpage, name="telemeta-flatpage"), + # OAI-PMH Data Provider url(r'^oai/.*$', web_view.handle_oai_request, name="telemeta-oai") ) diff --git a/telemeta/web/base.py b/telemeta/web/base.py index f6ace5e3..3f5154c6 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -40,7 +40,7 @@ from django.template import Context, loader from django import template from django.http import HttpResponse from django.http import Http404 -from django.shortcuts import render_to_response +from django.shortcuts import render_to_response, redirect from django.views.generic import list_detail from django.conf import settings @@ -56,6 +56,7 @@ import telemeta.interop.oai as oai from telemeta.interop.oaidatasource import TelemetaOAIDataSource from django.core.exceptions import ObjectDoesNotExist from telemeta.util.unaccent import unaccent +from telemeta.web import pages class WebView(Component): """Provide web UI methods""" @@ -68,7 +69,7 @@ class WebView(Component): """Render the homepage""" template = loader.get_template('telemeta/index.html') - context = Context({}) + context = Context({'page_content': pages.get_page_content(request, 'parts/home', True)}) return HttpResponse(template.render(context)) def collection_detail(self, request, public_id, template=''): @@ -390,4 +391,14 @@ class WebView(Component): args.update(request.POST) return HttpResponse(provider.handle(args), mimetype='text/xml') + def render_flatpage(self, request, path): + try: + content = pages.get_page_content(request, path) + except pages.MalformedPagePath: + return redirect(request.path + '/') + if isinstance(content, pages.PageAttachment): + return HttpResponse(content, content.mimetype()) + else: + return render_to_response('telemeta/flatpage.html', {'page_content': content }) + diff --git a/telemeta/web/pages.py b/telemeta/web/pages.py new file mode 100644 index 00000000..87a0de3e --- /dev/null +++ b/telemeta/web/pages.py @@ -0,0 +1,98 @@ +from django.conf import settings +import re +import telemeta +from os import path +import mimetypes + +PAGES_ROOT = path.join(path.dirname(telemeta.__file__), 'pages') + +class PageTextContent(object): + def __init__(self, filename, path): + self.filename = filename + self.path = path + + def __iter__(self): + file = open(self.filename, 'r') + for line in file: + yield line.rstrip('\r\n') + file.close() + + def __unicode__(self): + file = open(self.filename, 'r') + data = file.read() + file.close() + return data + +class PageAttachment(object): + def __init__(self, filename, path): + self.filename = filename + self.path = path + + def mimetype(self): + type, encoding = mimetypes.guess_type(self.filename) + return type + + def __iter__(self): + file = open(self.filename, 'rb') + buffer_size = 0x10000 + while True: + chunk = file.read(buffer_size) + yield chunk + if len(chunk) < buffer_size: + break + + file.close() + +def language_code(request=None): + code = (request and getattr(request, 'LANGUAGE_CODE')) or settings.LANGUAGE_CODE + cut = re.split('[_-]', code) + code = cut[0] + return code.lower() + +def resolve_page_file(language_code, relative_path, ignore_slash_issue=False): + root = path.realpath(path.join(PAGES_ROOT, language_code)) + filename = None + current = root + is_attachment = False + for node in relative_path.split('/'): + if not node: + continue + current = path.join(current, node) + rst = current + '.rst' + if path.isfile(rst): + filename = rst + break + elif path.isfile(current): + filename = current + is_attachment = True + elif not path.isdir(current): + break + + if not filename and path.isdir(current): + rst = path.join(current, 'index.rst') + if path.isfile(rst): + if not ignore_slash_issue and relative_path[-1:] != '/': + raise MalformedPagePath("The relative page path must end with a slash when " + "resolving an implicit directory index") + filename = rst + + if filename: + filename = path.realpath(filename) + if filename.index(root) != 0: + filename = None + + if filename: + if is_attachment: + return PageAttachment(filename, relative_path) + else: + return PageTextContent(filename, relative_path) + + return None + +def get_page_content(request, relative_path, ignore_slash_issue=False): + lang = language_code(request) + return resolve_page_file(lang, relative_path) or resolve_page_file('default', relative_path) + +class MalformedPagePath(Exception): + pass +