mark submissions with opened links
[edumed.git] / catalogue / templatetags / catalogue_tags.py
index 203b794..b74224d 100755 (executable)
+# -*- coding: utf-8 -*-
+from collections import defaultdict
 from django import template
 from django.utils.datastructures import SortedDict
 from ..models import Lesson, Section
+from curriculum.models import Level, CurriculumCourse
+from librarian.dcparser import WLURI, Person
 
 register = template.Library()
 
 
 @register.inclusion_tag("catalogue/snippets/carousel.html")
 def catalogue_carousel():
-    return {
-    }
-
-@register.inclusion_tag("catalogue/snippets/section_buttons.html")
-def catalogue_section_buttons():
     return {
         "object_list": Section.objects.all()
     }
 
-@register.inclusion_tag("catalogue/snippets/chosen_topics.html")
-def catalogue_chosen_topics():
+
+@register.inclusion_tag("catalogue/snippets/levels_main.html")
+def catalogue_levels_main():
+    object_list = Level.objects.exclude(lesson=None)
+    c = object_list.count()
     return {
+        'object_list': object_list,
+        # 'section_width': (700 - 20 * (c - 1)) / c,
+        'section_width': (700 - 20 * 2) / 3
     }
 
-@register.inclusion_tag("catalogue/snippets/section_box.html")
-def section_box(section):
-    lessons = SortedDict()
-    for lesson in section.lesson_set.all():
-        if lesson.level not in lessons:
-            newdict = SortedDict()
-            newdict['synthetic'] = []
-            newdict['course'] = []
-            lessons[lesson.level] = newdict
-        if lesson.type not in lessons[lesson.level]:
-            lessons[lesson.level][lesson.type] = []
-        lessons[lesson.level][lesson.type].append(lesson)
-    print lessons
+
+@register.inclusion_tag("catalogue/snippets/level_box.html")
+def level_box(level):
+    lessons = {'synthetic': [], 'course': SortedDict(), 'project': []}
+    by_course = defaultdict(lambda: defaultdict(list))
+
+    lesson_lists = [alist for alist in [
+        list(level.lesson_set.exclude(type='appendix').order_by('section__order', 'order')),
+        list(level.lessonstub_set.all())
+    ] if alist]
+
+    while lesson_lists:
+        min_index, min_list = min(enumerate(lesson_lists), key=lambda x: x[1][0].order)
+        lesson = min_list.pop(0)
+        if not min_list:
+            lesson_lists.pop(min_index)
+
+        if lesson.type == 'course':
+            if lesson.section not in lessons['course']:
+                lessons['course'][lesson.section] = []
+            lessons['course'][lesson.section].append(lesson)
+        elif lesson.type.startswith('added'):
+            continue
+        else:
+            lessons[lesson.type].append(lesson)
+
+        if hasattr(lesson, 'curriculum_courses'):
+            for course in lesson.curriculum_courses.all():
+                by_course[course][lesson.type].append(lesson)
+
+    courses = [(course, by_course[course])
+               for course in CurriculumCourse.objects.filter(lesson__level=level).distinct()]
+
+    added = []
+    if level.slug == 'liceum':
+        added.append({
+            'slug': 'filmowa',
+            'title': u'Edukacja filmowa',
+            'lessons': [
+                Lesson.objects.get(slug=s) for s in [
+                    'film-co-to-wlasciwie-jest',
+                    'scenariusz-scenopis-i-srodki-realizacyjne',
+                    'kompozycja-obrazu-filmowego',
+                    'praca-kamery-kadr-kat',
+                    'montaz-materialu-filmowego',
+                    'swiatlo-i-dzwiek-w-filmie',
+                    'scenografia-charakteryzacja-kostiumy-i-aktorzy',
+                    'narracja-w-filmie-tekst-i-fabula',
+                ]
+            ],
+        })
+        added.append({
+            'slug': 'varsaviana',
+            'title': u'Edukacja varsavianistyczna',
+            'lessons': [
+                Lesson.objects.get(slug=s) for s in [
+                    'czego-prus-w-lalce-o-zydach-nie-powiedzial',
+                    'jak-zmienila-sie-warszawa-o-dworcu-dawniej-i-dzis',
+                    'o-gwarze-praskiej',
+                    'poznaj-i-pokaz-prage',
+                    'praga-trzech-religii',
+                    'sladami-zydow-w-warszawie',
+                    'tajemnice-palacu-saskiego',
+                    'warszawa-przedwojenne-miasto-neonow',
+                    'warszawski-barok',
+                    'ziemianska-jako-soczewka-swiata-lat-miedzywojennych',
+                ]
+            ],
+        })
+
     return {
+        "level": level,
         "lessons": lessons,
+        "courses": courses,
+        "added": added,
     }
 
+
 @register.inclusion_tag("catalogue/snippets/lesson_nav.html")
 def lesson_nav(lesson):
     if lesson.type == 'course':
         root = lesson.section
-        siblings = root.lesson_set.filter(type='course')
-    else:
+        siblings = Lesson.objects.filter(type='course', level=lesson.level, section=root)
+    elif lesson.type == 'appendix':
         root = None
         siblings = Lesson.objects.filter(type=lesson.type)
+    elif lesson.type == 'added':
+        root = None
+        siblings = [
+                Lesson.objects.get(slug=s) for s in [
+                    'film-co-to-wlasciwie-jest',
+                    'scenariusz-scenopis-i-srodki-realizacyjne',
+                    'kompozycja-obrazu-filmowego',
+                    'praca-kamery-kadr-kat',
+                    'montaz-materialu-filmowego',
+                    'swiatlo-i-dzwiek-w-filmie',
+                    'scenografia-charakteryzacja-kostiumy-i-aktorzy',
+                    'narracja-w-filmie-tekst-i-fabula',
+                ]
+            ]
+    else:
+        root = None
+        siblings = Lesson.objects.filter(type=lesson.type, level=lesson.level)
     return {
         "lesson": lesson,
         "root": root,
         "siblings": siblings,
     }
 
+
+@register.inclusion_tag("catalogue/snippets/lesson_link.html")
+def lesson_link(uri):
+    try:
+        return {'lesson': Lesson.objects.get(slug=WLURI(uri).slug)}
+    except Lesson.DoesNotExist:
+        return {}
+
+
 @register.filter
 def person_list(persons):
-    from librarian.dcparser import Person
     return u", ".join(Person.from_text(p).readable() for p in persons)
 
 
 # FIXME: Move to fnpdjango
 import feedparser
 import datetime
+
+
 @register.inclusion_tag('catalogue/latest_blog_posts.html')
 def latest_blog_posts(feed_url, posts_to_show=5):
     try:
@@ -68,7 +161,7 @@ def latest_blog_posts(feed_url, posts_to_show=5):
         posts = []
         for i in range(posts_to_show):
             pub_date = feed['entries'][i].updated_parsed
-            published = datetime.date(pub_date[0], pub_date[1], pub_date[2] )
+            published = datetime.date(pub_date[0], pub_date[1], pub_date[2])
             posts.append({
                 'title': feed['entries'][i].title,
                 'summary': feed['entries'][i].summary,