diff --git a/generators/archive.py b/generators/archive.py index 35621a0..0ffae95 100644 --- a/generators/archive.py +++ b/generators/archive.py @@ -19,6 +19,8 @@ class Archive(Index): if node.hasAttribute('year'): self.replaceByText(dom, root, node, str(self.cur_year)) + return None + def createArchives(self, src, output, dom, hooks, posts): filename = self.filename + '.html' self.nb_pages = 0 diff --git a/generators/category.py b/generators/category.py index 9bf3e6c..3c3aff2 100644 --- a/generators/category.py +++ b/generators/category.py @@ -19,6 +19,7 @@ class Category(Index): self.replaceByText(dom, root, node, self.cur_category.name) if node.hasAttribute('description'): self.replaceByText(dom, root, node, self.cur_category.description) + return None def generate(self, blog, src, output): from dynastie.models import Post, Blog, Category diff --git a/generators/generator.py b/generators/generator.py index 017ad03..d99de02 100644 --- a/generators/generator.py +++ b/generators/generator.py @@ -141,14 +141,13 @@ class DynastieGenerator: else: new_elem = self.createElement(dom, node.localName) new_elem.appendChild(content) - elem.appendChild(new_elem) else: - new_elem = node.cloneNode(True) - elem.appendChild(new_elem) + new_elem = node.cloneNode(False) + self.simpleTransform(values, dom, new_elem, node) else: new_elem = node.cloneNode(False) self.simpleTransform(values, dom, new_elem, node) - elem.appendChild(new_elem) + elem.appendChild(new_elem) def replaceByText(self, dom, root, node, content): new_node = dom.createTextNode(content) @@ -158,10 +157,9 @@ class DynastieGenerator: for node in root.childNodes: if node.prefix == 'dyn': if node.localName in hooks: - hooks[node.localName](posts, dom, root, node) - if node.hasChildNodes(): + node = hooks[node.localName](posts, dom, root, node) + if not node is None and node.hasChildNodes(): self._parse(hooks, posts, dom, node) - return def parse(self, src, hooks, posts, dom, root): bases = dom.getElementsByTagNameNS(self.URI, 'base') diff --git a/generators/index.py b/generators/index.py index 3dc1a06..ccdfac1 100644 --- a/generators/index.py +++ b/generators/index.py @@ -17,7 +17,7 @@ class Index(DynastieGenerator): def createNavigation(self, posts, dom, root, node): if self.nb_pages == 0 or self.nb_pages == 1: - return '' + return None if self.dirname != '': if self.dirname.startswith('/'): @@ -58,8 +58,11 @@ class Index(DynastieGenerator): new_dom = parseString('') new_node = new_dom.getElementsByTagName('div')[0] - root.replaceChild(new_node.cloneNode(True), node) - + res = new_node.cloneNode(True) + root.replaceChild(res, node) + + return res + def createPost(self, post, dom, post_elem, root): values = {} values['title'] = self.createLinkElem(dom, post.getPath(), post.title) @@ -106,6 +109,7 @@ class Index(DynastieGenerator): if self.cur_post == len(posts): break root.replaceChild(posts_elem, node) + return posts_elem def createRecents(self, posts, dom, root, node): if self.cur_post == len(posts): @@ -132,6 +136,8 @@ class Index(DynastieGenerator): recents_elem.appendChild(list_elem) root.replaceChild(recents_elem, node) + + return recents_elem def generate(self, blog, src, output): from dynastie.models import Post, Blog diff --git a/generators/post.py b/generators/post.py index d5e92cc..03010ac 100644 --- a/generators/post.py +++ b/generators/post.py @@ -7,22 +7,62 @@ from django.db import models class Post(Index): + cur_comment = None + comment_index = {} + + def createReplace(self, post, dom, root, replace_elem): + if not replace_elem.hasAttribute('div_name'): + self.addError('No attribute div_name for a replace tag') + return + + div_element = replace_elem.cloneNode(True) + div_element.tagName = replace_elem.getAttribute('div_name') + div_element.removeAttribute('div_name') + for key,value in replace_elem.attributes.items(): + if key == 'div_name': continue + value = value.replace('dyn:post_id', str(post.id)) + if self.cur_comment is None: + value = value.replace('dyn:comment_id', '0') + else: + value = value.replace('dyn:comment_id', str(self.comment_index[self.cur_comment.id])) + if self.cur_comment is None or self.cur_comment.parent is None: + value = value.replace('dyn:comment_parent_id', '0') + else: + value = value.replace('dyn:comment_parent_id', str(self.cur_comment.id)) + + div_element.setAttribute(key, value) + + root.replaceChild(div_element, replace_elem) + return div_element + + def createComment(self, comment, dom, comment_elem, root): + values = {} + values['comment_id'] = str(comment.id) + values['comment_author'] = comment.author + values['comment_date'] = comment.date.strftime('%d %B %Y %H:%m') + values['comment_content'] = comment.the_comment + + self.simpleTransform(values, dom, comment_elem, root) + def createComments(self, post, dom, post_elem, root): from dynastie.models import Post, Blog, Comment - base_url = root.getAttribute('base_url') - add_comment = (root.getAttribute('add_comment') == '1') + comments = Comment.objects.filter(post=post).order_by('date') - comments = Comment.objects.filter(post=post) + cur_comment = None + comment_index = {} comment_list_list = [] + index = 1 for comment in comments: + self.comment_index[comment.id] = index + index = index + 1 try: - if comment.parent_id == 0: + if comment.parent is None: comment_list_list.append([comment]) else: for comment_list in comment_list_list: - if comment_list[0].id == comment.parent_id: + if comment_list[0].id == comment.parent.id: comment_list.append(comment) break except Comment.DoesNotExist: @@ -31,13 +71,20 @@ class Post(Index): initial_root_comment = root_comment = self.createElement(dom, 'comments') for comment_list in comment_list_list: for comment in comment_list: + self.cur_comment = comment comment_element = self.createElement(dom, 'comment') - comment_content = self.createElement(dom, 'comment_content', comment.the_comment) - comment_element.appendChild(comment_content) + self.createComment(comment, dom, comment_element, root) root_comment.appendChild(comment_element) root_comment = comment_element root_comment = initial_root_comment - post_elem.replaceChild(root_comment, root) + + # Empty tag seems to crap rendering + if len(comment_list_list) == 0: + post_elem.removeChild(root) + return None + else: + post_elem.replaceChild(root_comment, root) + return root_comment def createMetas(self, post, dom, meta_elem, root): name = root.getAttribute('name') @@ -57,14 +104,14 @@ class Post(Index): if not new_elem is None: root.parentNode.replaceChild(new_elem, root) + return new_elem else: self.addError('name attribute \'' + name + '\' unknown for dyn:meta' ) + return None def _createPost(self, post, dom, post_elem, root): import sys, traceback - if post.id == 122: - print post_elem.toxml() self.createPost(post, dom, post_elem, root) # Post are appended by index. Remove template @@ -80,11 +127,14 @@ class Post(Index): node.removeChild(node.childNodes[0]) node.appendChild(dom.createTextNode(post.title)) + return node + def _generate(self, blog, src, output, posts): import xml hooks = {'post' : self._createPost, 'meta' : self.createMetas, - 'comments' : self.createComments} + 'comments' : self.createComments, + 'replace' : self.createReplace} if not os.path.exists(src + '/_post.html'): self.addError('No _post.html found, exiting') @@ -149,6 +199,8 @@ class Post(Index): post_elem = post_nodes[0] post_elem.parentNode.removeChild(post_elem) + return post_elem + def preview(self, src, values): from dynastie.models import Blog diff --git a/models.py b/models.py index a655726..9f610d1 100644 --- a/models.py +++ b/models.py @@ -259,7 +259,7 @@ class Post(models.Model): class Comment(models.Model): post = models.ForeignKey(Post) - parent = models.ForeignKey('self', null=True) + parent = models.ForeignKey('self', null=True, blank=True) date = models.DateTimeField() author = models.CharField(max_length=255) email = models.EmailField(max_length=255, blank=True) diff --git a/views.py b/views.py index 8b5874a..a8a16aa 100644 --- a/views.py +++ b/views.py @@ -599,10 +599,15 @@ def delete_comment(request, comment_id): (b, post) = have_I_right(request, None, comment.post_id) post_id = comment.post_id - childs = Comment.objects.filter(parent=comment) + childs = Comment.objects.filter(parent=comment.id) + + try: + parent = comment.parent + except: + parent = None for child in childs: - child.parent = comment.parent + child.parent = parent child.save() comment.delete()