--- /dev/null
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'Lesson.dc'
+ db.add_column('catalogue_lesson', 'dc',
+ self.gf('jsonfield.fields.JSONField')(default='{}'),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Lesson.dc'
+ db.delete_column('catalogue_lesson', 'dc')
+
+
+ models = {
+ 'catalogue.attachment': {
+ 'Meta': {'object_name': 'Attachment'},
+ 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"})
+ },
+ 'catalogue.lesson': {
+ 'Meta': {'ordering': "['section', 'level', 'depth', 'order']", 'object_name': 'Lesson'},
+ 'dc': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}),
+ 'depth': ('django.db.models.fields.IntegerField', [], {}),
+ 'html_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['curriculum.Level']"}),
+ 'order': ('django.db.models.fields.IntegerField', [], {}),
+ 'package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'section': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Section']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+ 'student_package': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'xml_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
+ },
+ 'catalogue.part': {
+ 'Meta': {'object_name': 'Part'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'lesson': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Lesson']"}),
+ 'pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'student_pdf': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'})
+ },
+ 'catalogue.section': {
+ 'Meta': {'ordering': "['order']", 'object_name': 'Section'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+ 'title': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+ },
+ 'curriculum.level': {
+ 'Meta': {'ordering': "['order']", 'object_name': 'Level'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['catalogue']
\ No newline at end of file
from django.core.files import File
+from django.core.urlresolvers import reverse
from django.db import models
+from jsonfield import JSONField
from curriculum.models import Level
+
class Section(models.Model):
title = models.CharField(max_length=255, unique=True)
slug = models.SlugField(unique=True)
def __unicode__(self):
return self.title
+ def get_absolute_url(self):
+ return "%s#%s" % (reverse("catalogue_lessons"), self.slug)
+
+ def syntetic_lesson(self):
+ try:
+ return self.lesson_set.filter(depth=0)[0]
+ except IndexError:
+ return None
+
+
class Lesson(models.Model):
section = models.ForeignKey(Section)
level = models.ForeignKey(Level)
slug = models.SlugField(unique=True)
depth = models.IntegerField()
order = models.IntegerField()
+ dc = JSONField(default='{}')
xml_file = models.FileField(upload_to="catalogue/lesson/xml",
null=True, blank=True) # FIXME: slug in paths
lesson.section = Section.objects.all()[0]
lesson.order = 1
lesson.depth = 1
+ lesson.populate_dc()
lesson.save()
lesson.build_html()
+ lesson.build_package()
+ lesson.build_package(student=True)
return lesson
+ def populate_dc(self):
+ from librarian.parser import WLDocument
+ wldoc = WLDocument.from_file(self.xml_file.path)
+ self.dc = wldoc.book_info.to_dict()
+ self.save()
+
def build_html(self):
from librarian.parser import WLDocument
wldoc = WLDocument.from_file(self.xml_file.path)
html = wldoc.as_html()
self.html_file.save("%s.html" % self.slug,
- File(open(html.get_filename())), save=False)
- self.save()
+ File(open(html.get_filename())))
+
+ def build_package(self, student=False):
+ from StringIO import StringIO
+ import zipfile
+ from django.core.files.base import ContentFile
+ buff = StringIO()
+ with zipfile.ZipFile(buff, 'w', zipfile.ZIP_STORED) as zipf:
+ zipf.write(self.xml_file.path, "pliki-zrodlowe/%s.xml" % self.slug)
+ pdf = self.student_pdf if student else self.pdf
+ if pdf:
+ zipf.write(self.xml_file.path,
+ "%s%s.pdf" % (self.slug, "_student" if student else ""))
+ fieldname = "student_package" if student else "package"
+ getattr(self, fieldname).save(
+ "%s%s.zip" % (self.slug, "_student" if student else ""),
+ ContentFile(buff.getvalue()))
+
class Attachment(models.Model):
lesson = models.ForeignKey(Lesson)
{% extends "base.html" %}
{% load url from future %}
+{% load lesson_nav person_list from catalogue_tags %}
{% block title %}{{ object }}{% endblock %}
<p>Ta lekcja jest częścią działu
<strong>{{ object.section }}</strong>.
Dostępna jest również
- <strong><a href="">lekcja syntetyczna</a></strong>
+ <strong><a href="{{ object.section.syntetic_lesson.get_absolute_url }}">lekcja syntetyczna</a></strong>
dla tego działu.
</p>
{% endif %}
<p>Czas trwania: 45 minut.</p>
</section>
- <section class="box-button"><a href="" class="dl-button">Pobierz całą lekcję</a></section>
- <section><a href="" class="dl-button">Pobierz lekcję w wersji dla ucznia</a></section>
+
+ {% if object.package %}
+ <section class="box-button"><a href="{{ object.package.url }}" class="dl-button">Pobierz całą lekcję</a></section>
+ {% endif %}
+ {% if object.student_package %}
+ <section><a href="{{ object.student_package.url }}" class="dl-button">Pobierz lekcję w wersji dla ucznia</a></section>
+ {% endif %}
+
<section class="section">
- <h1>Korzystanie z informacji</h1>
+ {% lesson_nav object %}
</section>
+
+ <section class="section-minor">
+ <p>Autor: {{ object.dc.authors|person_list }}</p>
+ <p>Licencja: <a href="{{ object.dc.license }}">{{ object.dc.license_description }}</a>.</p>
+ </section>
+
+ <section class="section-minor">
+ <ul class="link-list">
+ <li><a href="{{ object.xml_file.url }}">źródłowy plik XML</a></li>
+ <li><a href="">lekcja na Platformie Redakcyjnej</a></li>
+ </ul>
+ </section>
+
+ <section class="section-minor">
+ <p>{{ object.dc.description }}</p>
+ </section>
+
</aside>
<div id="main-bar">