]> git.parisson.com Git - telemeta.git/commitdiff
add support for rst based flat pages ; add descriptive text and image to home
authorolivier <>
Thu, 11 Feb 2010 22:31:25 +0000 (22:31 +0000)
committerolivier <>
Thu, 11 Feb 2010 22:31:25 +0000 (22:31 +0000)
13 files changed:
telemeta/htdocs/css/telemeta.css
telemeta/models/location.py
telemeta/pages/default/parts/home.rst [new file with mode: 0644]
telemeta/pages/default/parts/home_img.jpg [new file with mode: 0644]
telemeta/pages/fr/parts/home.rst [new file with mode: 0644]
telemeta/templates/telemeta/flatpage.html [new file with mode: 0644]
telemeta/templates/telemeta_default/flatpage.html [new file with mode: 0644]
telemeta/templates/telemeta_default/index.html
telemeta/templates/telemeta_default/search_criteria.html
telemeta/templatetags/telemeta_utils.py
telemeta/urls.py
telemeta/web/base.py
telemeta/web/pages.py [new file with mode: 0644]

index f1e9468a2005ed6e13358fd13a9861d0b104e299..a9708264326bfc926489febc25df248d9fac2bfc 100644 (file)
@@ -1,4 +1,4 @@
-* {margin: 0; padding: 0;}\r
+body {margin: 0; padding: 0;}\r
 a {text-decoration: none; color: #969696;}\r
 a img {border: none;}\r
 html, input, select, textarea, h1, h2, h3, h4, h5, h6 {\r
@@ -23,7 +23,7 @@ a:link:hover, a:visited:hover {
 }\r
 a img { border: none; }\r
 \r
-h3 {\r
+.rst-content h1, h3 {\r
     font-size: 1.2em;\r
     font-weight: bold;\r
     color: #353535;\r
@@ -620,3 +620,8 @@ table.listing tbody tr:hover { background: #f7f8fa !important }
     border: solid 1px #888;\r
     margin-top: 0.8em;\r
 }\r
+\r
+img.home-image {\r
+    margin: 0 1.5em 1.5em 0;\r
+    float: left;\r
+}\r
index d5c660d5df08bf5d5cb6037a4c7fe035b07a7dc7..c06214230cccb8cbedcd2c1f374c15567a15e9e2 100644 (file)
@@ -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 (file)
index 0000000..76d944e
--- /dev/null
@@ -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 (file)
index 0000000..b2dc98a
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 (file)
index 0000000..76d944e
--- /dev/null
@@ -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 (file)
index 0000000..9ec14df
--- /dev/null
@@ -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 (file)
index 0000000..f7a06cf
--- /dev/null
@@ -0,0 +1,5 @@
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% block content %}
+{{ page_content|rst }}
+{% endblock %}
index 08d4e9bf01255292d421ee58d1fbe6d92803c1ee..78e725dd8f5d60f843879b92209eae6e57259b7a 100644 (file)
@@ -1,5 +1,9 @@
 {% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
 {% block content %}
+{{ page_content|rst }}
+
+<!--
 <div class="homelinks">
 <p><a href="{% url telemeta-collections %}">All collections</a><br />
   Browse all collections</p>
@@ -10,4 +14,5 @@
 <p><a href="{% url telemeta-admin %}">Administration</a><br />
   Configure Telemeta and manage users</p>
 </div>
+-->
 {% endblock %}
index d97000b34d2cae107cead2cdfda6d9bb65a43a55..d81df268e33900d4eb2bb44482ade547061f2013 100644 (file)
@@ -29,7 +29,7 @@ $(document).ready(function () {
 <fieldset>
 
     <p>
-    <label for="location">{% trans "Location" %}</label>
+    <label for="location">{% field_label "Location" %}</label>
     <input type="text" name="location" id="location" />
     </p>
 
index dfc8ce317413be7758f00e6ee05c7391744ff8c9..0eeb1b4c2d2ff3c746b33f1d454c56ad3ebec876 100644 (file)
@@ -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('<div class="rst-content">\n' + force_unicode(parts["html_body"]) + '</div>')
+rst.is_safe = True
+
+
+
index 49fece211b117693a088c9b0f67942194f0faa21..3ebe77160be4263a78aafe94bf3c96ca9bfd03a6 100644 (file)
@@ -165,6 +165,9 @@ urlpatterns = patterns('',
         {'document_root': htdocs+'/timeside'},
         name="telemeta-timeside"),
 
+    # Flat pages
+    url(r'^page/(?P<path>.*)$', web_view.render_flatpage, name="telemeta-flatpage"),
+
     # OAI-PMH Data Provider
     url(r'^oai/.*$', web_view.handle_oai_request, name="telemeta-oai")
 )
index f6ace5e3d460eb0866ac237afa1340a92d79ab81..3f5154c67ae232af3d995f3e5c0c6cf77c36bd94 100644 (file)
@@ -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 (file)
index 0000000..87a0de3
--- /dev/null
@@ -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
+