class Poem(models.Model):
slug = models.SlugField(_('slug'), max_length=120, db_index=True)
text = models.TextField(_('text'))
- created_by = models.ForeignKey(User)
+ created_by = models.ForeignKey(User, null=True)
created_from = JSONField(_('extra information'), null=True, blank=True)
created_at = models.DateTimeField(_('creation date'), auto_now_add=True, editable=False)
seen_at = models.DateTimeField(_('last view date'), auto_now_add=True, editable=False)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
+ class Meta:
+ unique_together = (('content_type', 'object_id'), )
+
def __unicode__(self):
return "Continuations for: %s" % unicode(self.content_object)
@classmethod
def for_book(cls, book, length=3):
# count from this book only
- print 'for_book', book
output = StringIO()
f = open(book.xml_file.path)
text.transform(f, output, False, ('raw-text',))
@classmethod
def get(cls, sth):
object_type = ContentType.objects.get_for_model(sth)
+ should_keys = set([sth.id])
+ if isinstance(sth, Tag):
+ should_keys = set(b.pk for b in Book.tagged.with_any((sth,)))
try:
obj = cls.objects.get(content_type=object_type, object_id=sth.id)
+ if not obj.pickle:
+ raise cls.DoesNotExist
f = open(obj.pickle.path)
- conts = cPickle.load(f)
+ keys, conts = cPickle.load(f)
f.close()
+ if set(keys) != should_keys:
+ raise cls.DoesNotExist
return conts
except cls.DoesNotExist:
if isinstance(sth, Book):
else:
raise NotImplemented('Lesmianator continuations: only Book and Tag supported')
- c = cls(content_object=sth)
- c.pickle.save(sth.slug+'.p', ContentFile(cPickle.dumps(conts)))
+ c, created = cls.objects.get_or_create(content_type=object_type, object_id=sth.id)
+ c.pickle.save(sth.slug+'.p', ContentFile(cPickle.dumps((should_keys, conts))))
c.save()
return conts