title = models.CharField(max_length=255, unique=True)
slug = models.SlugField(unique=True)
order = models.IntegerField()
+ xml_file = models.FileField(upload_to="catalogue/section/xml",
+ null=True, blank=True)
class Meta:
ordering = ['order']
+ class IncompleteError(BaseException):
+ pass
+
def __unicode__(self):
return self.title
def get_absolute_url(self):
return "%s#%s" % (reverse("catalogue_lessons"), self.slug)
- def syntetic_lesson(self):
+ @classmethod
+ def publish(cls, infile):
+ from librarian.parser import WLDocument
+ from django.core.files.base import ContentFile
+ xml = infile.get_string()
+ wldoc = WLDocument.from_string(xml)
+
+ try:
+ lessons = [Lesson.objects.get(slug=part.slug)
+ for part in wldoc.book_info.parts]
+ except Lesson.DoesNotExist, e:
+ raise cls.IncompleteError(part.slug)
+
+ slug = wldoc.book_info.url.slug
+ try:
+ section = cls.objects.get(slug=slug)
+ except cls.DoesNotExist:
+ section = cls(slug=slug, order=0)
+
+ # Save XML file
+ section.xml_file.save('%s.xml' % slug, ContentFile(xml), save=False)
+ section.title = wldoc.book_info.title
+ section.save()
+
+ section.lesson_set.all().update(section=None)
+ for i, lesson in enumerate(lessons):
+ lesson.section = section
+ lesson.order = i
+ lesson.save()
+
+ return section
+
+ def syntetic_lesson(self, level):
try:
- return self.lesson_set.filter(depth=0)[0]
+ return self.lesson_set.filter(type='synthetic', level=level)[0]
except IndexError:
return None
class Lesson(models.Model):
- section = models.ForeignKey(Section)
+ section = models.ForeignKey(Section, null=True, blank=True)
level = models.ForeignKey(Level)
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
- depth = models.IntegerField()
- order = models.IntegerField()
+ type = models.CharField(max_length=15, db_index=True)
+ order = models.IntegerField(db_index=True)
dc = JSONField(default='{}')
xml_file = models.FileField(upload_to="catalogue/lesson/xml",
null=True, blank=True)
class Meta:
- ordering = ['section', 'level', 'depth', 'order']
+ ordering = ['section', 'level', 'order']
def __unicode__(self):
return self.title
from django.core.files.base import ContentFile
xml = infile.get_string()
wldoc = WLDocument.from_string(xml)
- slug = wldoc.book_info.url.slug
+ # Check if not section metadata block.
+ if wldoc.book_info.parts:
+ return Section.publish(infile)
+
+ slug = wldoc.book_info.url.slug
try:
lesson = cls.objects.get(slug=slug)
except cls.DoesNotExist:
lesson.title = wldoc.book_info.title
lesson.level = Level.objects.get(slug=wldoc.book_info.audience)
- # TODO: no xml data?
- lesson.section = Section.objects.all()[0]
- lesson.order = 1
- lesson.depth = 1
+ lesson.order = 0
lesson.populate_dc()
+ lesson.type = lesson.dc["type"]
lesson.save()
lesson.build_html()
lesson.build_package()
self.html_file.save("%s.html" % self.slug,
File(open(html.get_filename())))
+ def add_to_zip(self, zipf, student=False, prefix=''):
+ zipf.write(self.xml_file.path,
+ "%spliki-zrodlowe/%s.xml" % (prefix, self.slug))
+ pdf = self.student_pdf if student else self.pdf
+ if pdf:
+ zipf.write(self.xml_file.path,
+ "%s%s%s.pdf" % (prefix, self.slug, "_student" if student else ""))
+
+
def build_package(self, student=False):
from StringIO import StringIO
import zipfile
from django.core.files.base import ContentFile
buff = StringIO()
zipf = zipfile.ZipFile(buff, 'w', zipfile.ZIP_STORED)
- 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 ""))
+ self.add_to_zip(zipf, student)
zipf.close()
fieldname = "student_package" if student else "package"
getattr(self, fieldname).save(
"%s%s.zip" % (self.slug, "_student" if student else ""),
ContentFile(buff.getvalue()))
+ def get_syntetic(self):
+ return self.section.syntetic_lesson(self.level)
+
class Attachment(models.Model):
slug = models.CharField(max_length=255)