1
2
3 import os
4 from xml.sax.saxutils import escape
5 from zipfile import ZipFile
6
7 from bridge import Element, Attribute
8 from bridge.common import ATOM10_PREFIX, ATOMPUB_PREFIX, XML_PREFIX, XML_NS, \
9 ATOM10_NS, ATOMPUB_NS, XHTML1_NS, XHTML1_PREFIX, ODF_OFFICE_NS,\
10 ODF_META_NS, DC_NS, odf_office_as_attr
11
12 from amplee.utils import generate_uuid_uri
13 from amplee.utils import create_temporary_resource, delete_temporary_resource
14 from amplee.error import MemberMediaError
15 from amplee.atompub.member import MediaMember
16 from amplee.atompub.member.helper import MemberHelper
17
19 - def __init__(self, collection, source,
20 media_type=u'application/vnd.oasis.opendocument.text',
21 inline_content=True, entry_id_creator=None, slug=None, **kwargs):
22 MediaMember.__init__(self, collection, media_type=media_type)
23
24 size = None
25 try:
26 fd, path, content = create_temporary_resource(source)
27 zp = ZipFile(path)
28 try:
29 size = unicode(os.stat(path).st_size)
30 except:
31 pass
32 finally:
33 delete_temporary_resource(path)
34
35 self.media_type = unicode(zp.read('mimetype'))
36 meta = zp.read('meta.xml')
37 content = None
38 if inline_content:
39 content = zp.read('content.xml')
40 zp.close()
41 delete_temporary_resource(path)
42
43 doc = Element.load(meta, as_attribute=odf_office_as_attr)
44
45 if callable(entry_id_creator):
46 id = entry_id_creator(seed=filename)
47 else:
48 id = generate_uuid_uri()
49
50 if not slug:
51 slug = os.path.basename(abs_path)
52
53 media_id = member_id = slug
54 member_id = u'%s.atom' % member_id
55 self.member_id = member_id
56 self.media_id = media_id
57
58 mh = MemberHelper(self.collection)
59 mh.initiate(id=id)
60 mh.add_element('title', content=unicode(doc.meta.title), attributes={u'type': u'text'})
61 mh.add_element('summary', unicode(doc.meta.description), attributes={u'type': u'text'})
62
63 if doc.meta.has_element('creator', DC_NS):
64 author = mh.add_element('author')
65 mh.add_element('name', content=unicode(doc.meta.creator), parent=author)
66
67 attr = {u'rel': u'edit', u'type': self.collection.member_media_type,
68 u'href': unicode(escape("%s/%s" % (self.collection.base_edit_uri,
69 member_id))),}
70 mh.add_element('link', attributes=attr)
71
72 attr = {u'rel': u'edit-media', u'type': self.media_type,
73 u'href': unicode(escape("%s/%s" % (self.collection.base_media_edit_uri,
74 media_id)))}
75
76 link = mh.add_element('link', attributes=attr)
77 if size:
78 Attribute(name=u'length', value=size, parent=link)
79
80 if doc.meta.has_element('keyword', ODF_META_NS):
81 mh.add_element('category', attributes={u'term': unicode(doc.meta.keyword)})
82
83 if inline_content:
84 ct = mh.add_element(u'content', attributes={u'type': u'xhtml'})
85 div = mh.add_element(u'div', prefix=XHTML1_PREFIX, ns=XHTML1_NS, parent=ct)
86 if content:
87 content = Element.load(content)
88 content.xml_parent = div
89 div.xml_children.append(content)
90 else:
91 attr = {u'src': unicode(escape("%s/%s" % (self.collection.base_uri, media_id))),
92 u'type': self.media_type}
93 mh.add_element(u'content', attributes=attr)
94
95 self.entry = mh.entry
96 del mh
97