Package amplee :: Package atompub :: Package member :: Module odf
[hide private]
[frames] | no frames]

Source Code for Module amplee.atompub.member.odf

 1  # -*- coding: utf-8 -*- 
 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   
18 -class ODTMember(MediaMember):
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