From 7aa99e0cbe92ffd850ff742ab61632c11661af17 Mon Sep 17 00:00:00 2001 From: Gregory Soutade Date: Wed, 24 Sep 2014 20:27:27 +0200 Subject: [PATCH] Do things in a more python way --- .gitignore | 4 ++- dynastie/generators/all_posts.py | 16 +++------ dynastie/generators/archive.py | 19 ++-------- dynastie/generators/atom.py | 1 - dynastie/generators/category.py | 17 ++------- dynastie/generators/generator.py | 36 +++++++++---------- dynastie/generators/index.py | 61 ++++++++++++++++---------------- dynastie/generators/ljdc.py | 14 +++----- dynastie/generators/post.py | 29 +++++++-------- dynastie/generators/rss.py | 2 +- dynastie/generators/search.py | 5 ++- dynastie/generators/tag.py | 16 ++------- dynastie/models.py | 3 +- dynastie/search.py | 10 ++---- dynastie/views.py | 52 +++++++++------------------ 15 files changed, 108 insertions(+), 177 deletions(-) diff --git a/.gitignore b/.gitignore index a902b23..b9a8e1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *~ *.pyc *_* -*.bdd \ No newline at end of file +*.bdd +*.gz +*.bak \ No newline at end of file diff --git a/dynastie/generators/all_posts.py b/dynastie/generators/all_posts.py index 46490b5..62f78d4 100755 --- a/dynastie/generators/all_posts.py +++ b/dynastie/generators/all_posts.py @@ -17,17 +17,11 @@ You should have received a copy of the GNU General Public License along with Dynastie. If not, see . """ -import os -from xml.dom.minidom import parse, parseString -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index from django.db import models class AllPosts(Index): - filename = 'all_posts' - cur_post = 0 - def createPosts(self, posts, dom, root, node): posts_elem = self.createElement(dom, 'posts') @@ -46,7 +40,7 @@ class AllPosts(Index): def createMonth(self, posts, dom, root, node): date_format = node.getAttribute('format') - if date_format == '': + if not date_format: date_format = '%B' self.cur_month = posts[0].creation_date.month @@ -57,11 +51,9 @@ class AllPosts(Index): prev_month = None for p in posts: if p.creation_date.month == self.cur_month: - cur_posts.append(p) + cur_posts.insert(0, p) continue - cur_posts.reverse() - month_elem = self.createElement(dom, 'month') month_def = dom.createElement('month') month_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format))) @@ -81,7 +73,7 @@ class AllPosts(Index): cur_posts.append(p) # Last month - if len(cur_posts) != 0: + if cur_posts: cur_posts.reverse() month_elem = self.createElement(dom, 'month') month_def = dom.createElement('month') @@ -161,6 +153,8 @@ class AllPosts(Index): def generate(self, blog, src, output): from dynastie.models import Post, Blog, Category + self.filename = 'all_posts' + self.hooks['year'] = self.createYear self.hooks['month'] = self.createMonth self.hooks['posts'] = self.createPosts diff --git a/dynastie/generators/archive.py b/dynastie/generators/archive.py index 497022e..071830c 100755 --- a/dynastie/generators/archive.py +++ b/dynastie/generators/archive.py @@ -17,23 +17,12 @@ You should have received a copy of the GNU General Public License along with Dynastie. If not, see . """ -import os from datetime import datetime -from xml.dom.minidom import parse, parseString -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index from django.db import models class Archive(Index): - cur_page = 0 - nb_pages = 0 - cur_post = 0 - posts_per_page = 0 - filename = 'index' - dirname = '' - cur_year = 0 - def createArchive(self, posts, dom, root, node): if node.hasAttribute('year'): self.replaceByText(dom, root, node, str(self.cur_year)) @@ -54,7 +43,7 @@ class Archive(Index): return self.report first_post = posts[0] - last_post = Post.objects.filter(published=True, front_page=True).order_by('-creation_date')[0] + last_post = posts[len(posts)-1] start_year = first_post.creation_date.year end_year = last_post.creation_date.year @@ -65,11 +54,9 @@ class Archive(Index): self.cur_year = i - posts = Post.objects.filter(published=True, front_page=True, creation_date__gt=datetime(i, 1, 1), creation_date__lt=datetime(i+1, 1, 1)).order_by('-creation_date') + posts = Post.objects.filter(published=True, creation_date__gt=datetime(i, 1, 1), creation_date__lt=datetime(i+1, 1, 1)).order_by('-creation_date') - self.nb_pages = 0 - self.cur_page = 0 - self.cur_post = 0 + self.resetCounters() self.dirname = '/archive/' + str(i) diff --git a/dynastie/generators/atom.py b/dynastie/generators/atom.py index 06a45e7..a3dc621 100755 --- a/dynastie/generators/atom.py +++ b/dynastie/generators/atom.py @@ -20,7 +20,6 @@ import os import datetime import xml -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.rss import RSS from xml.dom.minidom import getDOMImplementation from django.db import models diff --git a/dynastie/generators/category.py b/dynastie/generators/category.py index e169e7e..399bec9 100755 --- a/dynastie/generators/category.py +++ b/dynastie/generators/category.py @@ -17,22 +17,11 @@ You should have received a copy of the GNU General Public License along with Dynastie. If not, see . """ -import os -from xml.dom.minidom import parse, parseString -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index from django.db import models class Category(Index): - cur_page = 0 - nb_pages = 0 - cur_post = 0 - posts_per_page = 0 - filename = 'index' - dirname = '' - cur_category = None - def createCategory(self, posts, dom, root, node): if node.hasAttribute('name'): self.replaceByText(dom, root, node, self.cur_category.name) @@ -43,6 +32,8 @@ class Category(Index): def generate(self, blog, src, output): from dynastie.models import Post, Blog, Category + self.cur_category = None + self.hooks['category'] = self.createCategory dom = self.parseTemplate(blog, src, output, 'category', 'category') @@ -54,9 +45,7 @@ class Category(Index): self.cur_category = category posts = Post.objects.filter(category__exact=category, published=True).order_by('-creation_date') - self.nb_pages = 0 - self.cur_page = 0 - self.cur_post = 0 + self.resetCounters() self.dirname = '/category/' + category.name_slug diff --git a/dynastie/generators/generator.py b/dynastie/generators/generator.py index 5dea852..f6de0b8 100755 --- a/dynastie/generators/generator.py +++ b/dynastie/generators/generator.py @@ -56,8 +56,6 @@ class StrictUTF8Writer(codecs.StreamWriter): class DynastieGenerator: URI = "http://indefero.soutade.fr/p/dynastie" - report = '' - somethingWrote = False def __init__(self, hash_posts=None, hash_posts_content=None): self.report = '' @@ -67,11 +65,11 @@ class DynastieGenerator: def addReport(self, string, color=''): if string in self.report: return - if color != '': + if color: self.report = self.report + '' self.report = self.report + '' + self.__class__.__name__ + ' : ' self.report = self.report + string - if color != '': + if color: self.report = self.report + '' self.report = self.report + '
\n' @@ -105,8 +103,8 @@ class DynastieGenerator: else: cache_obj = cache_objs[0] - if not cache_obj is None or os.path.exists(filename): - if cache_obj is None: + if cache_obj or os.path.exists(filename): + if not cache_obj: src_md5 = hashlib.md5() f = open(filename,'rb') src_md5.update(f.read()) @@ -125,7 +123,8 @@ class DynastieGenerator: f.write(content) f.close() return - os.unlink(filename) + if os.path.exists(filename): + os.unlink(filename) if cache_obj is None: cache_obj = FileOutputCache(name=filename, hash=dst_md5.hexdigest()) @@ -161,20 +160,20 @@ class DynastieGenerator: def createElement(self, dom, name='', content='', subtree=None): div = dom.createElement('div') - if name != '': + if name: div.setAttribute('class', name) - if content != '': + if content: div.appendChild(dom.createTextNode(content)) - if not subtree is None: + if subtree: self.cloneSubtree(div, subtree) return div def createMeta(self, dom, name='', content=''): div = dom.createElement('meta') - if name != '': + if name: div.setAttribute('name', name) - if content != '': + if content: div.setAttribute('content', content) return div @@ -185,7 +184,7 @@ class DynastieGenerator: if node.prefix == 'dyn': if node.localName in values: content = values[node.localName] - if type(content) == unicode or type(content) == str: + if isinstance(content, basestring): new_elem = self.createElement(dom, node.localName, content) else: new_elem = self.createElement(dom, node.localName) @@ -204,16 +203,15 @@ class DynastieGenerator: def _parse(self, hooks, posts, dom, root): for node in root.childNodes: - if node.prefix == 'dyn': - if node.localName in hooks: - node = hooks[node.localName](posts, dom, root, node) - if not node is None and node.hasChildNodes(): + if node.prefix == 'dyn' and node.localName in hooks: + node = hooks[node.localName](posts, dom, root, node) + if node and node.hasChildNodes(): self._parse(hooks, posts, dom, node) def parse(self, src, hooks, posts, dom, root): bases = dom.getElementsByTagNameNS(self.URI, 'base') - if len(bases) == 0: + if not bases: self._parse(hooks, posts, dom, root) return root @@ -233,7 +231,7 @@ class DynastieGenerator: return root target_blocks = base.getElementsByTagNameNS(self.URI, 'block') - if len(target_blocks) == 0: + if not target_blocks: self.addError('No \'block\' defined in ' + src + '/' + filename) return root diff --git a/dynastie/generators/index.py b/dynastie/generators/index.py index d0a10b7..34f1291 100755 --- a/dynastie/generators/index.py +++ b/dynastie/generators/index.py @@ -19,24 +19,17 @@ """ import os import datetime +import hashlib import xml from xml.parsers.expat import * import xml.parsers.expat from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer from django.db import models +from dynastie.generators import markdown2 class Index(DynastieGenerator): - cur_page = 0 - nb_pages = 0 - cur_post = 0 - cur_post_obj = None - posts_per_page = 0 - filename = 'index' - dirname = '' - blog = None - def __init__(self, hash_posts=None, hash_posts_content=None): DynastieGenerator.__init__(self, hash_posts, hash_posts_content) @@ -55,6 +48,19 @@ class Index(DynastieGenerator): self.first_try = True + self.posts_per_page = 5 + self.filename = 'index' + self.dirname = '' + self.blog = None + + self.resetCounters() + + def resetCounters(self): + self.nb_pages = 0 + self.cur_page = 0 + self.cur_post = 0 + self.cur_post_obj = None + def createReplace(self, posts, dom, root, replace_elem): if not replace_elem.hasAttribute('div_name'): self.addError('No attribute div_name for a replace tag') @@ -68,7 +74,7 @@ class Index(DynastieGenerator): value = value.replace('dyn:blog_id', str(self.blog.id)) - if not self.cur_post_obj is None: + if self.cur_post_obj: url = self.cur_post_obj.getPath() full_url = self.cur_post_obj.blog.name + url value = value.replace('dyn:post_url', url) @@ -96,10 +102,10 @@ class Index(DynastieGenerator): self.replaceByText(dom, root, node, category) def createNavigation(self, posts, dom, root, node): - if self.nb_pages == 0 or self.nb_pages == 1: + if 0 <= self.nb_pages <= 1: return None - if self.dirname != '': + if self.dirname: if self.dirname.startswith('/'): href = ' 0: + if post_nodes: if post_nodes[0].hasAttribute("limit"): self.posts_per_page = int(post_nodes[0].getAttribute("limit")) - else: - self.posts_per_page = 5 else: self.addWarning('No tag dyn:posts found') diff --git a/dynastie/generators/ljdc.py b/dynastie/generators/ljdc.py index db72c9f..863f51a 100755 --- a/dynastie/generators/ljdc.py +++ b/dynastie/generators/ljdc.py @@ -18,22 +18,13 @@ along with Dynastie. If not, see . """ import os -from xml.dom.minidom import parse, parseString +from xml.dom.minidom import parse import xml.parsers.expat -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index from django.db import models class LJDC(Index): - cur_page = 0 - nb_pages = 0 - cur_post = 0 - posts_per_page = 20 - filename = 'index' - dirname = '/ljdc' - cur_category = None - def createPost(self, posts, dom, post_elem, root): new_elem = self.createElement(dom, 'ljdc') @@ -73,6 +64,9 @@ class LJDC(Index): return srcdom def generate(self, blog, src, output): + self.posts_per_page = 20 + self.dirname = '/ljdc' + srcdom = self._load_references(src) if srcdom is None: return None diff --git a/dynastie/generators/post.py b/dynastie/generators/post.py index c3ea1d4..10e3b2c 100755 --- a/dynastie/generators/post.py +++ b/dynastie/generators/post.py @@ -19,6 +19,7 @@ """ import datetime import os +import xml from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer from dynastie.generators.index import Index @@ -27,9 +28,6 @@ from dynastie.tree import TreeNode 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') @@ -43,13 +41,10 @@ class Post(Index): value = value.replace('dyn:post_id', str(post.id)) if self.cur_comment is None: value = value.replace('dyn:comment_index', '0') - else: - value = value.replace('dyn:comment_index', str(self.comment_index[self.cur_comment.id])) - if self.cur_comment is None: value = value.replace('dyn:comment_id', '0') else: + value = value.replace('dyn:comment_index', str(self.comment_index[self.cur_comment.id])) value = value.replace('dyn:comment_id', str(self.cur_comment.id)) - value = value.replace('dyn:blog_id', str(self.blog.id)) url = post.getPath() full_url = post.blog.name + url @@ -86,8 +81,8 @@ class Post(Index): comments = Comment.objects.filter(post=post).order_by('date') - cur_comment = None - comment_index = {} + self.cur_comment = None + self.comment_index = {} index = 1 rootNode = TreeNode('', '') @@ -146,9 +141,12 @@ class Post(Index): self.addError('name attribute \'' + name + '\' unknown for dyn:meta' ) return None - def _createPost(self, post, dom, post_elem, root): - import sys, traceback + def createPostTitle(self, post, dom, root, node): + value = post.title.replace('"', '“') + self.replaceByText(dom, root, node, value) + return None + def _createPost(self, post, dom, post_elem, root): self.cur_post_obj = post posts = [post] self.createPost(posts, dom, post_elem, root) @@ -169,12 +167,16 @@ class Post(Index): return node def _generate(self, blog, src, output, posts): - import xml + from dynastie.search import Search + + self.cur_comment = None + self.comment_index = {} self.hooks['post'] = self._createPost self.hooks['meta'] = self.createMetas self.hooks['comments'] = self.createComments self.hooks['replace'] = self.createReplace + self.hooks['post_title'] = self.createPostTitle del self.hooks['navigation'] del self.hooks['recents'] del self.hooks['posts'] @@ -183,6 +185,7 @@ class Post(Index): if dom is None: return self.report impl = xml.dom.getDOMImplementation() + s = Search() for post in posts: filename = output + '/post/' filename = filename + post.creation_date.strftime("%Y") + '/' + post.creation_date.strftime("%m") + '/' @@ -192,11 +195,9 @@ class Post(Index): if not post.published: if os.path.exists(filename): - from dynastie.search import * os.unlink(filename) os.unlink(filename + '.gz') self.addReport('Remove ' + filename) - s = Search() s.delete_post(blog, post.id) continue #print 'Generate ' + filename diff --git a/dynastie/generators/rss.py b/dynastie/generators/rss.py index b399931..5bcfdae 100755 --- a/dynastie/generators/rss.py +++ b/dynastie/generators/rss.py @@ -30,7 +30,7 @@ class RSS(DynastieGenerator): def appendElement(self, dom, root, name='', content='', attributes=None): elem = dom.createElement(name) - if not attributes is None: + if attributes: for k, v in attributes.iteritems(): elem.setAttribute(k, v) if content != '': diff --git a/dynastie/generators/search.py b/dynastie/generators/search.py index 5f4d83f..f03927d 100755 --- a/dynastie/generators/search.py +++ b/dynastie/generators/search.py @@ -18,7 +18,6 @@ along with Dynastie. If not, see . """ import os -from datetime import datetime from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer from dynastie.generators.index import Index @@ -47,7 +46,7 @@ class Search(Index): return self.report post_nodes = dom.getElementsByTagNameNS(self.URI, "posts") - if not post_nodes is None: + if post_nodes: if post_nodes[0].hasAttribute("limit"): self.posts_per_page = int(post_nodes[0].getAttribute("limit")) else: @@ -64,7 +63,7 @@ class Search(Index): post = Post.objects.get(pk=post_id) except: continue - if not post is None: + if post: posts.append(post) nodes = dom.getElementsByTagName("*") diff --git a/dynastie/generators/tag.py b/dynastie/generators/tag.py index 8b1bb9e..143434a 100755 --- a/dynastie/generators/tag.py +++ b/dynastie/generators/tag.py @@ -17,22 +17,11 @@ You should have received a copy of the GNU General Public License along with Dynastie. If not, see . """ -import os -from xml.dom.minidom import parse, parseString -from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index from django.db import models class Tag(Index): - cur_page = 0 - nb_pages = 0 - cur_post = 0 - posts_per_page = 0 - filename = 'index' - dirname = '' - cur_tag = None - def createTag(self, posts, dom, root, node): if node.hasAttribute('name'): self.replaceByText(dom, root, node, self.cur_tag.name) @@ -43,6 +32,7 @@ class Tag(Index): def generate(self, blog, src, output): from dynastie.models import Post, Blog, Tag + self.cur_tag = None self.hooks['tag'] = self.createTag dom = self.parseTemplate(blog, src, output, 'tag', 'tag') @@ -54,9 +44,7 @@ class Tag(Index): self.cur_tag = tag posts = Post.objects.filter(tags__in=[tag.id], published=True).order_by('-creation_date') - self.nb_pages = 0 - self.cur_page = 0 - self.cur_post = 0 + self.resetCounters() self.dirname = '/tag/' + tag.name_slug diff --git a/dynastie/models.py b/dynastie/models.py index ab3bffd..ba5b444 100755 --- a/dynastie/models.py +++ b/dynastie/models.py @@ -84,7 +84,8 @@ class Blog(models.Model): engine = line.strip() if not engine in globals(): print 'Engine ' + engine + ' doesn\'t exists' - self.engines.append(globals()[engine]) + else: + self.engines.append(globals()[engine]) f.close() else: self.engines.append(globals()['post']) diff --git a/dynastie/search.py b/dynastie/search.py index ddcaa57..12b1e96 100755 --- a/dynastie/search.py +++ b/dynastie/search.py @@ -205,15 +205,11 @@ class Search: for key in hashtable.keys(): if reg.match(key): for post in hashtable[key]: - if not post[0] in res: - res[post[0]] = post[1] - else: - res[post[0]] += post[1] + res[post[0]] = res.get(post[0],0) + post[1] sorted_res = sorted(res.iteritems(), key=operator.itemgetter(1)) sorted_res.reverse() - res = [] - for i in range(len(sorted_res)): - res .append(sorted_res[i][0]) + res = [sorted_res[i][0] for i in range(len(sorted_res))] + return res diff --git a/dynastie/views.py b/dynastie/views.py index 641f296..08c03f9 100755 --- a/dynastie/views.py +++ b/dynastie/views.py @@ -53,7 +53,7 @@ def have_I_right(request, blog_id=None, post_id=None, must_be_superuser=False, c if must_be_superuser and not request.user.is_superuser: raise Http404 - if not post_id is None: + if post_id: p = cls.objects.get(pk=post_id) if p is None: @@ -61,10 +61,10 @@ def have_I_right(request, blog_id=None, post_id=None, must_be_superuser=False, c blog_id = p.blog.id - if not blog_id is None: + if blog_id: if not request.user.is_superuser: b = Blog.objects.filter(pk=blog_id, writers=request.user.id) - if len(b) == 0: + if not b: raise Http404 b = b[0] else: @@ -128,14 +128,11 @@ def index(request): def disconnect(request): logout(request) - c = {'login_failed' : False} return HttpResponseRedirect('/') @login_required def user(request): - users = User.objects.all() - - c = {'users' : users} + c = {'users' : User.objects.all()} return render(request, 'user.html', c) @@ -286,6 +283,7 @@ def edit_tag(request, tag_id): return HttpResponseRedirect('/tag/' + str(b.id)) if 'edit' in request.POST: name = tag.name + name = name.strip() form = TagForm(request.POST, instance=tag) if form.is_valid(): if request.POST['name'] != name: @@ -351,10 +349,7 @@ def view_blog(request, blog_id): if 'page' in request.GET: cur_page = int(request.GET['page']) else: - if 'cur_page' in request.session: - cur_page = request.session['cur_page'] - else: - cur_page = 0 + cur_page = request.session.get('cur_page',0) if cur_page <= 0: drafts = Draft.objects.filter(blog=b).order_by('-creation_date') @@ -374,15 +369,13 @@ def view_blog(request, blog_id): end = start + 50 + drafts.count() orig_posts = orig_posts.order_by('-creation_date')[start:end] - posts = [] - for p in orig_posts: - found = False - for d in drafts: - if d.id == p.id: - found = True - break - if not found: - posts.append(p) + + # Select post without drafts + if drafts: + drafts_id = [draft.id for draft in drafts] + posts = [p for p in orig_posts if not p.id in drafts_id] + else: + posts = orig_posts form = BlogForm(instance=b) @@ -390,10 +383,7 @@ def view_blog(request, blog_id): dict_comments = {} for comment in comments: key = comment.post.id - if not key in dict_comments: - dict_comments[key] = 1 - else: - dict_comments[key] = dict_comments[key] + 1 + dict_comments[key] = dict_comments.get(key, 0) + 1 navigation_bar = createNavigationBar(b.id, cur_page, nb_pages) @@ -461,10 +451,7 @@ def search_blog(request, blog_id): dict_comments = {} for comment in comments: key = comment.post.id - if not key in dict_comments: - dict_comments[key] = 1 - else: - dict_comments[key] = dict_comments[key] + 1 + dict_comments[key] = dict_comments.get(key, 0) + 1 c = {'blog' : b, 'posts' : posts, 'comments' : dict_comments} @@ -552,9 +539,7 @@ def edit_post(request, post_id): content = 'Empty post' comments = Comment.objects.filter(post=post).order_by('date') - comment_list = [] - for comment in comments: - comment_list.append(comment) + comment_list = [comment for comment in comments] return render(request, 'edit_post.html', { 'form': form, 'post_id' : post_id, 'content' : content, @@ -652,10 +637,7 @@ def _generate(request, blog_id, report): dict_comments = {} for comment in comments: key = comment.post.id - if not key in dict_comments: - dict_comments[key] = 1 - else: - dict_comments[key] = dict_comments[key] + 1 + dict_comments[key] = dict_comments.get(key, 0) + 1 navigation_bar = createNavigationBar(b.id, 0, nb_pages)