2012-07-08 20:41:16 +02:00
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
import hashlib
|
2012-07-15 18:21:26 +02:00
|
|
|
import inspect
|
2012-07-08 16:23:39 +02:00
|
|
|
from django.db import models
|
|
|
|
from django.contrib.auth.models import User
|
2012-07-08 20:41:16 +02:00
|
|
|
from django.db.models.signals import post_init, post_delete, post_save
|
|
|
|
from django.dispatch import receiver
|
|
|
|
from dynastie.generators import *
|
2012-07-08 16:23:39 +02:00
|
|
|
|
|
|
|
class Blog(models.Model):
|
2012-07-08 20:41:16 +02:00
|
|
|
name = models.CharField(max_length=255, unique=True)
|
2012-07-08 16:23:39 +02:00
|
|
|
title = models.CharField(max_length=255)
|
|
|
|
description = models.TextField(max_length=255, blank=True)
|
|
|
|
keywords = models.TextField(blank=True)
|
|
|
|
writers = models.ManyToManyField(User)
|
2012-07-08 20:41:16 +02:00
|
|
|
|
2012-07-15 18:21:26 +02:00
|
|
|
engines = list()
|
2012-07-08 20:41:16 +02:00
|
|
|
|
2012-07-15 18:21:26 +02:00
|
|
|
src_path = ''
|
|
|
|
output_path = ''
|
2012-07-08 20:41:16 +02:00
|
|
|
|
2012-07-15 18:21:26 +02:00
|
|
|
def create_paths(self):
|
|
|
|
self.src_path = 'sites/' + self.name
|
|
|
|
self.output_path = 'sites/' + self.name + '_output'
|
|
|
|
|
|
|
|
def create(self):
|
2012-07-08 20:41:16 +02:00
|
|
|
if not os.path.exists('sites'):
|
|
|
|
os.mkdir('sites')
|
|
|
|
|
|
|
|
self.remove()
|
|
|
|
|
2012-07-15 18:21:26 +02:00
|
|
|
os.mkdir(self.src_path)
|
|
|
|
os.mkdir(self.output_path)
|
2012-07-08 20:41:16 +02:00
|
|
|
|
|
|
|
def remove(self):
|
2012-07-15 18:21:26 +02:00
|
|
|
if os.path.exists(self.src_path):
|
|
|
|
shutil.rmtree(self.src_path)
|
|
|
|
if os.path.exists(self.output_path):
|
|
|
|
shutil.rmtree(self.output_path)
|
2012-07-08 20:41:16 +02:00
|
|
|
|
|
|
|
def load_generators(self):
|
2012-07-15 18:21:26 +02:00
|
|
|
if os.path.exists(self.src_path + '/_generators'):
|
|
|
|
f = open(self.src_path + '/_generators', 'r')
|
2012-07-08 20:41:16 +02:00
|
|
|
for line in f:
|
2012-07-15 18:21:26 +02:00
|
|
|
self.engines.append(globals()[line.strip()])
|
2012-07-08 20:41:16 +02:00
|
|
|
f.close()
|
|
|
|
else:
|
2012-07-15 18:21:26 +02:00
|
|
|
self.engines.append(globals()['index'])
|
|
|
|
self.engines.append(globals()['categories'])
|
|
|
|
self.engines.append(globals()['archives'])
|
2012-07-08 20:41:16 +02:00
|
|
|
|
|
|
|
def copytree(self, src, dst):
|
|
|
|
names = os.listdir(src)
|
|
|
|
|
|
|
|
errors = []
|
|
|
|
for name in names:
|
|
|
|
if name.startswith('_') or name.endswith('~'):
|
|
|
|
continue
|
|
|
|
srcname = os.path.join(src, name)
|
|
|
|
dstname = os.path.join(dst, name)
|
|
|
|
try:
|
|
|
|
if os.path.islink(srcname) and not os.path.exists(dstname):
|
|
|
|
linkto = os.readlink(srcname)
|
|
|
|
os.symlink(linkto, dstname)
|
2012-07-15 18:21:26 +02:00
|
|
|
if os.path.isdir(srcname):
|
|
|
|
if not os.path.exists(dstname):
|
|
|
|
os.makedirs(dstname)
|
2012-07-08 20:41:16 +02:00
|
|
|
self.copytree(srcname, dstname)
|
|
|
|
else:
|
2012-07-15 18:21:26 +02:00
|
|
|
if os.path.exists(dstname):
|
|
|
|
src_md5 = hashlib.md5()
|
|
|
|
f = open(srcname,'rb')
|
|
|
|
src_md5.update(f.read())
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
dst_md5 = hashlib.md5()
|
|
|
|
f = open(dstname,'rb')
|
|
|
|
dst_md5.update(f.read())
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
if src_md5.digest() != dst_md5.digest():
|
|
|
|
shutil.copy2(srcname, dstname)
|
|
|
|
else:
|
|
|
|
shutil.copy2(srcname, dstname)
|
2012-07-08 20:41:16 +02:00
|
|
|
|
|
|
|
# XXX What about devices, sockets etc.?
|
|
|
|
except (IOError, os.error), why:
|
|
|
|
errors.append((srcname, dstname, str(why)))
|
|
|
|
# catch the Error from the recursive copytree so that we can
|
|
|
|
# continue with other files
|
2012-07-15 18:21:26 +02:00
|
|
|
except Exception, err:
|
2012-07-08 20:41:16 +02:00
|
|
|
errors.extend(err.args[0])
|
|
|
|
if errors:
|
2012-07-15 18:21:26 +02:00
|
|
|
raise Exception(errors)
|
2012-07-08 20:41:16 +02:00
|
|
|
|
|
|
|
def generate(self):
|
|
|
|
self.load_generators()
|
2012-07-15 18:21:26 +02:00
|
|
|
self.copytree(self.src_path, self.output_path)
|
2012-07-18 11:30:54 +02:00
|
|
|
report = ''
|
2012-07-15 18:21:26 +02:00
|
|
|
for engine in self.engines:
|
|
|
|
for name, obj in inspect.getmembers(engine):
|
|
|
|
if inspect.isclass(obj):
|
|
|
|
e = obj()
|
2012-07-18 11:30:54 +02:00
|
|
|
r = e.generate(self, self.src_path, self.output_path)
|
|
|
|
if not r is None:
|
|
|
|
report = report + '<br/>\n' + r
|
|
|
|
return report
|
2012-07-08 16:23:39 +02:00
|
|
|
|
|
|
|
class Editor(models.Model):
|
2012-07-08 20:41:16 +02:00
|
|
|
name = models.CharField(max_length=255, unique=True)
|
2012-07-08 16:23:39 +02:00
|
|
|
|
|
|
|
class Category(models.Model):
|
2012-07-08 20:41:16 +02:00
|
|
|
name = models.CharField(max_length=255, unique=True)
|
2012-07-08 16:23:39 +02:00
|
|
|
parent = models.ForeignKey('self', blank=True, null=True)
|
|
|
|
description = models.TextField(max_length=255, blank=True)
|
|
|
|
|
|
|
|
class Tag(models.Model):
|
2012-07-08 20:41:16 +02:00
|
|
|
name = models.CharField(max_length=255, unique=True)
|
2012-07-08 16:23:39 +02:00
|
|
|
|
|
|
|
class Article(models.Model):
|
|
|
|
title = 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()
|
|
|
|
front_page = models.BooleanField()
|
|
|
|
author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
|
|
|
|
description = models.TextField(max_length=255, blank=True)
|
|
|
|
keywords = models.TextField(blank=True)
|
|
|
|
tags = models.ManyToManyField(Tag, blank=True, null=True)
|
|
|
|
blog = models.ForeignKey(Blog)
|
|
|
|
|
|
|
|
class Comment(models.Model):
|
|
|
|
article = models.ForeignKey(Article)
|
|
|
|
parent = models.ForeignKey('Comment')
|
|
|
|
date = models.DateField(max_length=255)
|
|
|
|
author = models.CharField(max_length=255)
|
|
|
|
email = models.EmailField(max_length=255)
|
|
|
|
the_comment = models.TextField(max_length=255)
|
|
|
|
|
2012-07-08 20:41:16 +02:00
|
|
|
@receiver(post_init, sender=Blog)
|
2012-07-15 18:21:26 +02:00
|
|
|
def delete_blog_signal(sender, **kwargs):
|
|
|
|
sender.create_paths()
|
2012-07-08 16:23:39 +02:00
|
|
|
|
2012-07-08 20:41:16 +02:00
|
|
|
@receiver(post_delete, sender=Blog)
|
|
|
|
def delete_blog_signal(sender, **kwargs):
|
|
|
|
sender.remove()
|