From 7a4b0892d3c6e9947786746f9c87b4885c75a94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Sun, 22 Jul 2012 20:49:11 +0200 Subject: [PATCH] Add archive generator --- generators/__init__.py | 2 +- generators/archive.py | 104 +++++++++++++++++++++++++++++++++++++++++ generators/article.py | 1 - generators/category.py | 1 - generators/index.py | 4 +- models.py | 42 +++++++++++++++-- views.py | 1 + 7 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 generators/archive.py diff --git a/generators/__init__.py b/generators/__init__.py index 625fb79..a22d781 100644 --- a/generators/__init__.py +++ b/generators/__init__.py @@ -1 +1 @@ -__all__ = ["generator", "index", "article", "category"] +__all__ = ["generator", "index", "article", "category", "archive"] diff --git a/generators/archive.py b/generators/archive.py new file mode 100644 index 0000000..7376e83 --- /dev/null +++ b/generators/archive.py @@ -0,0 +1,104 @@ +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_article = 0 + articles_per_page = 0 + filename = 'index' + cur_year = 0 + + def createArchive(self, articles, dom, root, node): + if node.hasAttribute('year'): + self.replaceByText(dom, root, node, str(self.cur_year)) + + def createArchives(self, src, output, dom, hooks, articles): + filename = self.filename + '.html' + self.nb_pages = 0 + self.cur_page = 0 + if len(articles) > self.articles_per_page: + self.nb_pages = len(articles) / self.articles_per_page + + if not os.path.exists(output + '/archive/' + str(self.cur_year)): + os.mkdir(output + '/archive/' + str(self.cur_year)) + + while self.cur_page <= self.nb_pages: + #print 'Generate ' + filename + nodes = dom.getElementsByTagName("*") + self.parse(hooks, articles, dom, nodes[0]) + self.writeIfNotTheSame(output + '/archive/' + str(self.cur_year) + '/' + filename, nodes[0].toxml('utf8')) + self.cur_page = self.cur_page + 1 + filename = self.filename + str(self.cur_page) + '.html' + dom = parse(src + '/_archive.html') + + while os.path.exists(filename): + self.addReport('Removing unused ' + filename) + os.unlink(filename) + filename = filename + '.gz' + if os.path.exists(filename): + self.addReport('Removing unused ' + filename) + os.unlink(filename) + self.cur_page = self.cur_page + 1 + filename = output + '/archive/' + str(self.cur_year) + '/' + self.filename + str(self.cur_page) + '.html' + + def generate(self, blog, src, output): + from dynastie.models import Article, Blog + + hooks = {'articles' : self.createArticles, + 'navigation' : self.createNavigation, + 'archive' : self.createArchive} + + if not os.path.exists(src + '/_archive.html'): + self.addError('No _archive.html found, exiting') + return self.report + + try: + dom = parse(src + '/_archive.html') + except xml.dom.DOMException as e: + self.addError('Error parsing _archive.html : ' + e) + return self.report + + if not os.path.exists(output + '/archive'): + os.mkdir(output + '/archive') + + article_nodes = dom.getElementsByTagNameNS(self.URI, "articles") + if not article_nodes is None: + self.articles_per_page = int(article_nodes[0].getAttribute("limit")) + else: + self.addError('No tag dyn:articles found') + + articles = Article.objects.all() + + if articles.count() != 0: + self.cur_year = articles[0].creation_date.year + + my_articles = [] + now = datetime.now() + for article in articles: + # if self.cur_year == now.year: + # break + + if article.creation_date.year != self.cur_year: + self.createArchives(src, output, dom, hooks, my_articles) + self.cur_year = article.creation_date.year + #print 'New year ' + str(self.cur_year) + # if self.cur_year == now.year: + # continue + my_articles = [] + else: + my_articles.append(article) + + if len(my_articles) != 0: + self.createArchives(src, output, dom, hooks, my_articles) + + if not self.somethingWrote: + self.addReport('Nothing changed') + + return self.report + diff --git a/generators/article.py b/generators/article.py index 0576e0c..c9900a5 100644 --- a/generators/article.py +++ b/generators/article.py @@ -1,5 +1,4 @@ import os -import datetime from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator from django.db import models diff --git a/generators/category.py b/generators/category.py index 1614fa0..a15c50c 100644 --- a/generators/category.py +++ b/generators/category.py @@ -1,5 +1,4 @@ import os -import datetime from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator from dynastie.generators.index import Index diff --git a/generators/index.py b/generators/index.py index ae74fa7..482d931 100644 --- a/generators/index.py +++ b/generators/index.py @@ -60,14 +60,14 @@ class Index(DynastieGenerator): articles_elem = self.createElement(dom, 'articles') for i in range(0, self.articles_per_page): article_elem = self.createElement(dom, 'article') - if articles.count() > self.cur_article: + if len(articles) > self.cur_article: self.createArticle(articles[self.cur_article], dom, article_elem, node) else: article_elem = self.createElement(dom, '', 'No articles yet') articles_elem.appendChild(article_elem) self.cur_article = self.cur_article + 1 - if self.cur_article == articles.count(): + if self.cur_article == len(articles): break root.replaceChild(articles_elem, node) diff --git a/models.py b/models.py index a6ac0f1..66f7aaa 100644 --- a/models.py +++ b/models.py @@ -49,12 +49,15 @@ class Blog(models.Model): if os.path.exists(self.src_path + '/_generators'): f = open(self.src_path + '/_generators', 'r') for line in f: + if line.startswith("#"): + continue self.engines.append(globals()[line.strip()]) f.close() else: + self.engines.append(globals()['article']) self.engines.append(globals()['index']) - self.engines.append(globals()['categories']) - self.engines.append(globals()['archives']) + self.engines.append(globals()['category']) + self.engines.append(globals()['archive']) def copytree(self, src, dst): names = os.listdir(src) @@ -106,11 +109,16 @@ class Blog(models.Model): self.report = '

Generation of ' + datetime.now().strftime("%d/%m/%Y at %H:%M:%S") + '
\n' self.load_generators() self.copytree(self.src_path, self.output_path) + generated = [] for engine in self.engines: + if not inspect.ismodule(engine): + continue for name, obj in inspect.getmembers(engine): - if inspect.isclass(obj): + if inspect.isclass(obj) and obj.__module__.startswith("dynastie"): + if obj.__module__ in generated: continue e = obj() r = e.generate(self, self.src_path, self.output_path) + generated.append(obj.__module__) if not r is None: self.report = self.report + '
\n' + r @@ -137,6 +145,34 @@ class Category(models.Model): self.slugify() super(Category, self).save() + def remove(self, blog): + blog.create_paths() + + output = blob.output_path + cur_cat = 0 + while True: + found = False + filename = output + '/category/' + if cur_cat == 0: + filename = filename + self.name_slug + '.html' + else: + filename = filename + self.name_slug + str(cur_cat) + '.html' + if os.path.exists(filename): + os.unlink(filename) + found = True + filename = filename + '.gz' + if os.path.exists(filename): + os.unlink(filename) + found = True + if not found: + break + cur_cat = cur_cat + 1 + + filename = output + '/category/' + if len(os.listdir(filename)) == 0: + os.rmdir(filename) + + class Tag(models.Model): name = models.CharField(max_length=255, unique=True) diff --git a/views.py b/views.py index c3d5cf1..79cfbbb 100644 --- a/views.py +++ b/views.py @@ -159,6 +159,7 @@ def delete_category(request, category_id): if category is None: raise Http404 + category.remove() category.delete() return HttpResponseRedirect('/category')