diff --git a/forms.py b/forms.py
index 7d03673..63ce7ac 100644
--- a/forms.py
+++ b/forms.py
@@ -8,7 +8,7 @@ class BlogForm(ModelForm):
class ArticleForm(ModelForm):
class Meta:
model = Article
- exclude = ('creation_date', 'author', 'blog', 'tags')
+ exclude = ('title_slug', 'creation_date', 'author', 'blog', 'tags')
def __init__(self, *args, **kwargs):
super(ArticleForm, self).__init__(*args, **kwargs)
@@ -23,4 +23,3 @@ class UserForm(ModelForm):
class Meta:
model = User
exclude = ('is_staff', 'is_active', 'last_login', 'last_joined', 'user_permissions', 'groups', 'date_joined')
-
diff --git a/generators/__init__.py b/generators/__init__.py
index dd6dca6..8b4c9af 100644
--- a/generators/__init__.py
+++ b/generators/__init__.py
@@ -1 +1 @@
-__all__ = ["generator", "index"]
+__all__ = ["generator", "index", "article"]
diff --git a/generators/article.py b/generators/article.py
new file mode 100644
index 0000000..91ddfa8
--- /dev/null
+++ b/generators/article.py
@@ -0,0 +1,62 @@
+import os
+import datetime
+from xml.dom.minidom import parse, parseString
+from dynastie.generators.generator import DynastieGenerator
+from django.db import models
+
+# TODO : content
+
+class Article(DynastieGenerator):
+
+ 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, article, dom, root):
+ for node in root.childNodes:
+ if node.prefix == 'dyn':
+ if node.localName == 'content':
+ article_elem = self.createElement(dom, 'article')
+ self.createArticle(article, dom, article_elem, node)
+ root.replaceChild(article_elem, node)
+
+ continue
+ if node.hasChildNodes():
+ self.parse(article, dom, node)
+ return
+
+ def generate(self, blog, src, output):
+ from dynastie.models import Article, Blog
+
+ if not os.path.exists(src + '/_article.html'):
+ self.addError('No _article.html found, exiting')
+ return self.report
+
+ try:
+ dom = parse(src + '/_article.html')
+ except xml.dom.DOMException as e:
+ self.addError('Error parsing _article.html : ' + e)
+ return self.report
+
+ if not os.path.exists(output + '/articles'):
+ os.mkdir(output + '/articles')
+
+ articles = Article.objects.all()
+
+ for article in articles:
+ #print 'Generate ' + filename
+ nodes = dom.getElementsByTagName("*")
+ self.parse(article, dom, nodes[0])
+ self.writeIfNotTheSame(output + '/articles/' + article.title_slug + '.html', nodes[0].toxml('utf8'))
+ dom = parse(src + '/_article.html')
+
+ if not self.somethingWrote:
+ self.addReport('Nothing changed')
+
+ return self.report
+
diff --git a/generators/generator.py b/generators/generator.py
index 57ef22d..8ba551d 100644
--- a/generators/generator.py
+++ b/generators/generator.py
@@ -7,9 +7,11 @@ class DynastieGenerator:
URI = "http://indefero.soutade.fr/p/dynastie"
report = ''
+ somethingWrote = False
def __init__(self):
self.report = ''
+ self.somethingWrote = False
def addReport(self, string, color=''):
if color != '':
@@ -40,10 +42,8 @@ class DynastieGenerator:
dst_md5.update(content)
if src_md5.digest() == dst_md5.digest():
- self.addReport(filename + ' regenerated with the same content, skipping...')
filename = filename + '.gz'
if not os.path.exists(filename):
- self.addReport(filename + ' was not previously compressed')
f = gzip.open(filename, 'wb')
f.write(content)
f.close()
@@ -60,6 +60,8 @@ class DynastieGenerator:
f = gzip.open(filename, 'wb')
f.write(content)
f.close()
+
+ self.somethingWrote = True
def createElement(self, dom, name='', content=''):
div = dom.createElement('div')
diff --git a/generators/index.py b/generators/index.py
index b726040..9d5de23 100644
--- a/generators/index.py
+++ b/generators/index.py
@@ -135,5 +135,8 @@ class Index(DynastieGenerator):
self.cur_page = self.cur_page + 1
filename = output + '/index' + str(self.cur_page) + '.html'
+ if not self.somethingWrote:
+ self.addReport('Nothing changed')
+
return self.report
diff --git a/models.py b/models.py
index a516fcc..4a08a67 100644
--- a/models.py
+++ b/models.py
@@ -2,6 +2,8 @@ import os
import shutil
import hashlib
import inspect
+from unicodedata import normalize
+from re import sub
from datetime import datetime
from django.db import models
from django.contrib.auth.models import User
@@ -27,14 +29,16 @@ class Blog(models.Model):
self.output_path = 'sites/' + self.name + '_output'
def create(self):
+ self.create_paths()
if not os.path.exists('sites'):
os.mkdir('sites')
- self.remove()
-
- os.mkdir(self.src_path)
- os.mkdir(self.output_path)
+ if not os.path.exists(self.src_path):
+ os.mkdir(self.src_path)
+ if not os.path.exists(self.output_path):
+ os.mkdir(self.output_path)
+
def remove(self):
if os.path.exists(self.src_path):
shutil.rmtree(self.src_path)
@@ -109,6 +113,7 @@ class Blog(models.Model):
r = e.generate(self, self.src_path, self.output_path)
if not r is None:
self.report = self.report + '
\n' + r
+
return self.report
class Editor(models.Model):
@@ -124,6 +129,7 @@ class Tag(models.Model):
class Article(models.Model):
title = models.CharField(max_length=255)
+ title_slug = models.CharField(max_length=255)
category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
published = models.BooleanField()
creation_date = models.DateField()
@@ -134,6 +140,51 @@ class Article(models.Model):
tags = models.ManyToManyField(Tag, blank=True, null=True)
blog = models.ForeignKey(Blog)
+
+ def slugify(self):
+ name = normalize('NFKD', self.title).encode('ascii', 'ignore').replace(' ', '-').lower()
+ #remove `other` characters
+ name = sub('[^a-zA-Z0-9_-]', '', name)
+ #nomalize dashes
+ name = sub('-+', '-', name)
+ self.title_slug = name
+
+ def save(self):
+ self.slugify()
+ super(Article, self).save()
+
+ def createArticle(self, content):
+ b = self.blog
+ b.create_paths()
+ output = b.src_path
+ if not os.path.exists(output + '/_articles'):
+ os.mkdir(output + '/_articles')
+
+ filename = output + '/_articles/' + str(self.pk)
+ if os.path.exists(filename):
+ os.unlink(filename)
+ f = open(filename, 'wb')
+ f.write(content)
+ f.close()
+
+ def remove(self):
+ b = self.blog
+ b.create_paths()
+
+ output = b.src_path
+ filename = output + '/_articles/' + str(self.pk)
+ if os.path.exists(filename):
+ os.unlink(filename)
+
+ output = b.output_path
+ filename = output + '/articles/' + self.title_slug + '.html'
+ if os.path.exists(filename):
+ os.unlink(filename)
+ filename = filename + '.gz'
+ if os.path.exists(filename):
+ os.unlink(filename)
+
+
class Comment(models.Model):
article = models.ForeignKey(Article)
parent = models.ForeignKey('Comment')
@@ -149,3 +200,7 @@ def delete_blog_signal(sender, **kwargs):
@receiver(post_delete, sender=Blog)
def delete_blog_signal(sender, **kwargs):
sender.remove()
+
+@receiver(post_delete, sender=Article)
+def delete_article_signal(sender, **kwargs):
+ sender.remove()
diff --git a/templates/add_article.html b/templates/add_article.html
index 7e60962..e2e6bca 100644
--- a/templates/add_article.html
+++ b/templates/add_article.html
@@ -1,8 +1,35 @@
{% extends "templates/base.html" %}
+{% block head %}
+
+
+{% endblock %}
+
{% block content %}
User successfuly updated
+{% endif %} {% if user.is_superuser or user.id == user_to_edit.id %}