allow svg, but not tiff
[librarian.git] / librarian / meta.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6 from lxml import etree
7 from librarian import DCNS, SSTNS
8
9
10 def text_value(meta):
11     """ Finds out the text value of metadata element.
12     
13     >>> p = Person()
14     >>> p.text = u"Czajka, Radek"
15     >>> print text_value(p)
16     Radek Czajka
17
18     """
19     if hasattr(meta, 'text_value'):
20         return meta.text_value()
21     else:
22         return meta.text
23
24
25 class Metadata(etree.ElementBase):
26     @classmethod
27     def about(cls, element):
28         meta = cls()
29         meta._about = element
30         return meta
31
32     def get_about(self):
33         if hasattr(self, '_about'):
34             return self._about
35         else:
36             return self.getparent()
37
38     def get(self, key, inherit=True):
39         """ Finds metadata by its element name. """
40         values = self.findall(key)
41         if values:
42             return [text_value(v) for v in values]
43         elif inherit and self.get_about().getparent() is not None:
44             return self.get_about().getparent().meta.get(key)
45         elif inherit and hasattr(self.get_about(), 'meta_context'):
46             return self.get_about().meta_context.get(key)
47         else:
48             return []
49
50     def get_one(self, *args, **kwargs):
51         values = self.get(*args, **kwargs)
52         if values:
53             return values[0]
54         else:
55             return None
56
57     # Specials.
58
59     def author(self):
60         try:
61             return unicode(self.get(DCNS('creator'))[0])
62         except IndexError:
63             return u""
64
65     def slug(self):
66         try:
67             return self.get(DCNS('identifier'))[0].slug()
68         except IndexError:
69             return None
70
71     def title(self):
72         dc_title = self.get(DCNS('title'), inherit=False)
73         if dc_title:
74             return unicode(dc_title[0])
75         else:
76             header = self.get_about().find(SSTNS('header'))
77             if header is not None:
78                 # FIXME: This should be a simple text representation
79                 return header.text
80             else:
81                 return u""
82
83
84 class MetaItem(etree.ElementBase):
85     pass
86
87
88 class Person(MetaItem):
89     def text_value(self):
90         return u" ".join(p.strip() for p in reversed(self.text.rsplit(u',', 1)))
91
92
93 class Identifier(MetaItem):
94     def slug(self):
95         return self.text.rstrip('/').rsplit('/', 1)[-1]