def _generate(self): now = datetime.utcnow() posts = iter(Post.query.order_by(Post.last_update.desc())) try: first_post = posts.next() last_update = first_post.last_update posts = chain((first_post,), posts) except StopIteration: first_post = None last_update = now feed_id = build_tag_uri(self.app, last_update, 'zxa_export', 'full') yield (XML_PREAMBLE % { 'version': escape(rezine.__version__), 'title': escape(self.app.cfg['blog_title']), 'subtitle': escape(self.app.cfg['blog_tagline']), 'atom_ns': ATOM_NS, 'rezine_ns': ZINE_NS, 'id': escape(feed_id), 'blog_url': escape(self.app.cfg['blog_url']), 'updated': format_iso8601(last_update), 'language': self.app.cfg['language'] }).encode('utf-8') def dump_node(node): return etree.tostring(node, encoding='utf-8') for participant in self.participants: participant.before_dump() # dump configuration cfg = self.z('configuration') for key, value in self.app.cfg.export(): self.z('item', key=key, text=value, parent=cfg) yield dump_node(cfg) # allow plugins to dump trees for participant in self.participants: rv = participant.dump_data() if rv is not None: yield dump_node(rv) # look up all the users and add them as dependencies if they # have written a comment or created a post. for user in User.query.all(): if user.posts.count() > 0 or user.comments.count() > 0: self._register_user(user) # dump all the posts for post in posts: yield dump_node(self._dump_post(post)) # if we have dependencies (very likely) dump them now if self._dependencies: yield '<rezine:dependencies>' for node in self._dependencies.itervalues(): yield dump_node(node) yield '</rezine:dependencies>' yield XML_EPILOG.encode('utf-8')
def log(self, level, message, module=None, frame=None): """Writes a single log entry to the stream.""" prefix = ( u'[%s-%s-%s] %s: ' % (format_iso8601(datetime.utcnow()), level, self.get_location(frame), module or 'unknown')).encode('utf-8') for line in message.splitlines(): self.file.write(prefix + (line + u'\n').encode('utf-8')) self.file.flush()
def log(self, level, message, module=None, frame=None): """Writes a single log entry to the stream.""" prefix = (u'[%s-%s-%s] %s: ' % ( format_iso8601(datetime.utcnow()), level, self.get_location(frame), module or 'unknown' )).encode('utf-8') for line in message.splitlines(): self.file.write(prefix + (line + u'\n').encode('utf-8')) self.file.flush()
def _dump_post(self, post): url = url_for(post, _external=True) entry = self.atom('entry', {'{%s}base' % XML_NS: url}) self.atom('title', text=post.title, type='text', parent=entry) self.atom('id', text=post.uid, parent=entry) self.atom('updated', text=format_iso8601(post.last_update), parent=entry) self.atom('published', text=format_iso8601(post.pub_date), parent=entry) self.atom('link', href=url, parent=entry) author = self.atom('author', parent=entry) author.attrib[self.z.dependency] = self.users[post.author.id] \ .attrib['dependency'] self.atom('name', text=post.author.display_name, parent=author) self.atom('email', text=post.author.email, parent=author) self.z('slug', text=post.slug, parent=entry) self.z('comments_enabled', text=post.comments_enabled and 'yes' or 'no', parent=entry) self.z('pings_enabled', text=post.pings_enabled and 'yes' or 'no', parent=entry) self.z('status', text=str(post.status), parent=entry) self.z('content_type', text=str(post.content_type), parent=entry) self.atom('content', type='text', text=post.text, parent=entry) self.atom('content', type='html', text=post.body.to_html(), parent=entry) if post.intro: self.atom('summary', type='html', text=post.intro.to_html(), parent=entry) for category in post.categories: attrib = dict(term=category.slug, scheme=ZINE_CATEGORY_URI) if category.slug != category.name: attrib['label'] = category.name element = self.atom('category', attrib=attrib, parent=entry) if category.description: self.rezine.description(category.description, parent=element) for tag in post.tags: attrib = dict(term=tag.slug, scheme=ZINE_TAG_URI) if tag.slug != tag.name: attrib['label'] = tag.name self.atom('category', attrib=attrib, parent=entry) self.z('parser_data', text=dump_parser_data(post.parser_data).encode('base64'), parent=entry) for c in post.comments: comment = self.z('comment', parent=entry) comment.attrib['id'] = str(c.id) author = self.z('author', parent=comment) self.z('name', text=c.author, parent=author) self.z('email', text=c.email, parent=author) self.z('uri', text=c.www, parent=author) if c.user is not None: author.attrib['dependency'] = self.users[c.user.id] \ .attrib['dependency'] self.z('published', text=format_iso8601(c.pub_date), parent=comment) self.z('blocked', text=c.blocked and 'yes' or 'no', parent=comment) self.z('is_pingback', text=c.is_pingback and 'yes' or 'no', parent=comment) self.z('status', text=str(c.status), parent=comment), self.z('blocked_msg', text=str(c.blocked_msg or ''), parent=comment) self.z('parent', text=c.parent_id is not None and str(c.parent_id) or '', parent=comment) self.z('submitter_ip', text=c.submitter_ip, parent=comment) self.z('content', type='html', text=c.body.to_html(), parent=comment) self.z('content', type='text', text=c.text, parent=comment) self.z('parser_data', text=dump_parser_data(c.parser_data).encode('base64'), parent=comment) for participant in self.participants: participant.process_post(entry, post) return entry