local changes from server
[redakcja.git] / apps / catalogue / models / book.py
index a8a3f20..34ac796 100755 (executable)
@@ -3,6 +3,7 @@
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from django.contrib.auth.models import User
 from django.contrib.sites.models import Site
 from django.db import models, transaction
 from django.template.loader import render_to_string
@@ -10,25 +11,30 @@ from django.utils.translation import ugettext_lazy as _
 from django.conf import settings
 from slughifi import slughifi
 
-
 import apiclient
 from catalogue.helpers import cached_in_field, GalleryMerger
-from catalogue.models import BookPublishRecord, ChunkPublishRecord
+from catalogue.models import BookPublishRecord, ChunkPublishRecord, Project
 from catalogue.signals import post_publish
 from catalogue.tasks import refresh_instance, book_content_updated
 from catalogue.xml_tools import compile_text, split_xml
 from cover.models import Image
+from organizations.models import Organization
 import os
 import shutil
 import re
 
+
 class Book(models.Model):
     """ A document edited on the wiki """
 
     title = models.CharField(_('title'), max_length=255, db_index=True)
     slug = models.SlugField(_('slug'), max_length=128, unique=True, db_index=True)
     public = models.BooleanField(_('public'), default=True, db_index=True)
-    gallery = models.CharField(_('scan gallery name'), max_length=255, blank=True)
+    gallery = models.CharField(u'materiały', max_length=255, blank=True)
+    project = models.ForeignKey(Project, null=True, blank=True)
+
+    owner_user = models.ForeignKey(User, null=True)
+    owner_organization = models.ForeignKey(Organization, null=True)
 
     #wl_slug = models.CharField(_('title'), max_length=255, null=True, db_index=True, editable=False)
     parent = models.ForeignKey('self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False)
@@ -51,8 +57,8 @@ class Book(models.Model):
     class Meta:
         app_label = 'catalogue'
         ordering = ['title', 'slug']
-        verbose_name = _('book')
-        verbose_name_plural = _('books')
+        verbose_name = u'moduł'
+        verbose_name_plural = u'moduły'
 
 
     # Representing
@@ -205,7 +211,8 @@ class Book(models.Model):
         # and move the gallery starts
         if gm.was_merged:
                 for chunk in self[len(self) - len_other:]:
-                        chunk.gallery_start += gm.dest_size - gm.num_deleted
+                        old_start = chunk.gallery_start or 1
+                        chunk.gallery_start = old_start + gm.dest_size - gm.num_deleted
                         chunk.save()
 
         other.delete()
@@ -255,13 +262,11 @@ class Book(models.Model):
             changes = self.get_current_changes(publishable=True)
         except self.NoTextError:
             raise AssertionError(_('Not all chunks have publishable revisions.'))
-        book_xml = self.materialize(changes=changes)
 
-        from librarian.dcparser import BookInfo
         from librarian import NoDublinCore, ParseError, ValidationError
 
         try:
-            bi = BookInfo.from_string(book_xml.encode('utf-8'), strict=True)
+            bi = self.wldocument(changes=changes, strict=True).book_info
         except ParseError, e:
             raise AssertionError(_('Invalid XML') + ': ' + unicode(e))
         except NoDublinCore:
@@ -272,6 +277,14 @@ class Book(models.Model):
         valid_about = self.correct_about()
         assert bi.about == valid_about, _("rdf:about is not") + " " + valid_about
 
+    def publishable_error(self):
+        try:
+            return self.assert_publishable()
+        except AssertionError, e:
+            return e
+        else:
+            return None
+
     def hidden(self):
         return self.slug.startswith('.')
 
@@ -312,7 +325,7 @@ class Book(models.Model):
         return len(self) == 1
     single = cached_in_field('_single')(is_single)
 
-    @cached_in_field('_short_html')
+    #@cached_in_field('_short_html')
     def short_html(self):
         return render_to_string('catalogue/book_list/book.html', {'book': self})
 
@@ -397,14 +410,16 @@ class Book(models.Model):
             changes = self.get_current_changes(publishable)
         return compile_text(change.materialize() for change in changes)
 
-    def wldocument(self, publishable=True, changes=None, parse_dublincore=True):
+    def wldocument(self, publishable=True, changes=None, 
+            parse_dublincore=True, strict=False):
         from catalogue.ebook_utils import RedakcjaDocProvider
         from librarian.parser import WLDocument
 
         return WLDocument.from_string(
                 self.materialize(publishable=publishable, changes=changes),
                 provider=RedakcjaDocProvider(publishable=publishable),
-                parse_dublincore=parse_dublincore)
+                parse_dublincore=parse_dublincore,
+                strict=strict)
 
     def publish(self, user):
         """