1 # -*- coding: utf-8 -*-
 
   2 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 
   3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 
   5 from django.db import models, transaction
 
   6 from celery.task import task
 
   7 from sortify import sortify
 
   8 from celery.utils.log import get_task_logger
 
  10 task_logger = get_task_logger(__name__)
 
  12 from catalogue.models import Book
 
  15 class Qualifier(models.Model):
 
  16     qualifier = models.CharField(max_length=128, db_index=True, unique=True)
 
  17     name = models.CharField(max_length=255)
 
  20         ordering = ['qualifier']
 
  22     def __unicode__(self):
 
  23         return self.name or self.qualifier
 
  26 class Note(models.Model):
 
  27     """Represents a single annotation from a book."""
 
  28     html = models.TextField()
 
  29     sort_key = models.CharField(max_length=128, db_index=True)
 
  30     fn_type = models.CharField(max_length=10, db_index=True)
 
  31     qualifiers = models.ManyToManyField(Qualifier, null=True)
 
  32     language = models.CharField(max_length=10, db_index=True)
 
  35         ordering = ['sort_key']
 
  38 class NoteSource(models.Model):
 
  39     """Represents a single annotation from a book."""
 
  40     note = models.ForeignKey(Note)
 
  41     book = models.ForeignKey(Book)
 
  42     anchor = models.CharField(max_length=64)
 
  48 @task(ignore_result=True)
 
  49 def build_notes(book):
 
  50     task_logger.info(book.slug)
 
  51     with transaction.atomic():
 
  52         book.notesource_set.all().delete()
 
  54             from librarian import html
 
  55             from librarian.fn_qualifiers import FN_QUALIFIERS
 
  57             for anchor, fn_type, qualifiers, text_str, html_str in \
 
  58                     html.extract_annotations(book.html_file.path):
 
  59                 sort_key = sortify(text_str).strip()[:128]
 
  61                 language = book.language
 
  63                 notes = Note.objects.filter(sort_key=sort_key,
 
  65                     language=language, html=html_str)
 
  69                     note = Note.objects.create(
 
  76                 qualifier_objects = []
 
  77                 for qualifier in qualifiers:
 
  78                     obj, created = Qualifier.objects.get_or_create(
 
  79                         qualifier=qualifier, defaults={
 
  80                             'name': FN_QUALIFIERS.get(qualifier, '')
 
  82                     qualifier_objects.append(obj)
 
  83                 note.qualifiers = qualifier_objects
 
  84                 note.notesource_set.create(book=book, anchor=anchor)
 
  86         Note.objects.filter(notesource=None).delete()
 
  89 def notes_from_book(sender, instance, **kwargs):
 
  90     build_notes.delay(instance)
 
  91 Book.html_built.connect(notes_from_book)