import datetime from xml.dom.minidom import parse from dynastie.generators.generator import DynastieGenerator from django.db import models # TODO : links between indexes # TODO : gzip class Index(DynastieGenerator): cur_page = 0 cur_article = 0 articles_per_page = 0 def createArticle(self, article, dom, article_elem, root): values = {} values['title'] = article.title values['author'] = article.author.first_name values['date'] = article.creation_date.strftime("%d/%m/%Y") values['content'] = '' self.simpleTransform(values, dom, article_elem, root) def parse(self, articles, dom, root): for node in root.childNodes: if node.prefix == 'dyn': if node.localName == 'articles': articles_elem = dom.createElement("articles") for i in range(0, self.articles_per_page): article_elem = dom.createElementNS(self.URI, "article") self.createArticle(articles[self.cur_article], dom, article_elem, node) articles_elem.appendChild(article_elem) self.cur_article = self.cur_article + 1 if self.cur_article == articles.count(): break root.replaceChild(articles_elem, node) continue if node.hasChildNodes(): self.parse(articles, dom, node) return def generate(self, blog, src, output): from dynastie.models import * self.report = '' if not os.path.exists(src + '/_index.html'): self.addError('No _index.html found, exiting') return self.report try: dom = parse(src + '/_index.html') except xml.dom.DOMException as e: self.addError('Error parsing _index.html : ' + e) return self.report 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') now = datetime.datetime.now() cur_year = now.year articles = Article.objects.filter(creation_date__year=cur_year) if articles.count() < self.articles_per_page: articles = Article.objects.all()[:self.articles_per_page] filename = 'index.html' while self.cur_article < articles.count(): nodes = dom.getElementsByTagName("*") self.parse(articles, dom, nodes[0]) self.writeIfNotTheSame(output + '/' + filename, nodes[0].toxml('utf8')) self.cur_page = self.cur_page + 1 filename = 'index' + str(self.cur_page) + '.html' while os.path.exists(filename): self.addReport('Removing unused ' + filename) os.unlink(filename) self.cur_page = self.cur_page + 1 filename = 'index' + str(self.cur_page) + '.html' return self.report