Architecture overview
=====================

Books
-----

Books are kept in the :py:class:`catalogue.models.Book` model.  Dublin Core
metadata, read by :py:mod:`librarian.dcparser.BookInfo`, are put in the
`extra_info` JSON field.

Authors, kinds, epochs, genres are kept in :py:class:`catalogue.models.Tag`
model with `category` field set to appriopriate value.

:py:class:`catalogue.models.Tag` also contains :ref:`user-shelves`
and :ref:`parent-relations`.


User shelves
------------

User shelves (or tags on user's shelf) are just :py:class:`catalogue.models.Tag`
objects with ``category='set'`` and ``user`` set to the owner. Shelves' slugs
are generated automatically using :py:fun:`catalogue.utils.get_random_hash`.


Parent relations
----------------

The source of parent relations is the
:py:class:`librarian.dcparser.BookInfo.parts` metadata.

Parent relations are kept primarily in the :py:attribute:`catalogue.models.Book.parent`
and :py:attribute:`catalogue.models.Book.parent_number` fields.

They're also cached as :py:class:`Tag <catalogue.models.Tag>` relations.
Each book has its tag (with :py:attribute:`slug <catalogue.models.Book.slug>`
starting with ``l-``).  All of book's descendants (NOT the book
itself) have its tag attached.

Arguably, this scheme has some potential for inconsistency.