Add archive generator

This commit is contained in:
Grégory Soutadé 2012-07-22 20:49:11 +02:00
parent 47d68daec0
commit 7a4b0892d3
7 changed files with 147 additions and 8 deletions

View File

@ -1 +1 @@
__all__ = ["generator", "index", "article", "category"]
__all__ = ["generator", "index", "article", "category", "archive"]

104
generators/archive.py Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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, '', '<b>No articles yet</b>')
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)

View File

@ -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 = '<br/><br/>Generation of ' + datetime.now().strftime("%d/%m/%Y at %H:%M:%S") + '<br/>\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 + '<br/>\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)

View File

@ -159,6 +159,7 @@ def delete_category(request, category_id):
if category is None:
raise Http404
category.remove()
category.delete()
return HttpResponseRedirect('/category')