texts/text/models.py
2009-08-28 12:03:07 +02:00

134 lines
4.6 KiB
Python

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
# Written 2009 by j@mailb.org
import os
import re
from glob import glob
import oxlib
import oxlib.normalize
from django.db import models
from django.conf import settings
def getAuthor(name, name_sort=''):
try:
a = Author.objects.get(name=name)
except Author.DoesNotExist:
a = Author(name=name, name_sort=name_sort)
a.save()
return a
class Author(models.Model):
name = models.CharField(blank=True, max_length=255, unique=True)
name_sort = models.CharField('Sort Name', blank=True, max_length=1000)
class Meta:
ordering = ('name_sort', )
def __unicode__(self):
return self.name
def save(self, *args, **kwargs):
if not self.name_sort:
self.name_sort = oxlib.normalize.canonicalName(self.name)
super(Author, self).save(*args, **kwargs)
#update path in related texts
for text in self.texts.all():
text.save()
class Language(models.Model):
name = models.CharField(blank=True, max_length=1000)
class Meta:
ordering = ('name', )
def __unicode__(self):
return self.name
class Text(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
title = models.CharField(blank=True, max_length=1000)
version = models.CharField(blank=True, max_length=1000)
file = models.FileField(upload_to='Incoming', blank=True, max_length=2000)
authors = models.ManyToManyField(Author, related_name='texts', blank=True)
languages = models.ManyToManyField(Language, related_name='texts', blank=True)
compilation = models.BooleanField(default=False)
class Meta:
ordering = ('file', 'title', 'version')
def __unicode__(self):
return self.title
def getComputedPath(self):
authors = [a.name_sort for a in self.authors.all()]
author = "; ".join(authors)
if not author:
author = "Unknown Author"
if self.compilation:
author += " (Ed.)"
elif author.endswith("."):
author = author[:-1] + "_"
title = self.title
title = re.sub('[:/]', '_', title)
if self.version:
title += ".%s" % self.version
extension = os.path.splitext(self.file.path)[1].lower()
path = u"%s/%s/%s%s" % (author[0].upper(), author, title, extension)
return os.path.join(settings.MEDIA_ROOT, path).encode('utf-8')
def parsePath(self):
if self.file:
match = re.compile('./(.*)/(.*)').findall(self.file.name)
title = os.path.splitext(match[0][1])[0]
compilation = False
#FIXME: parse version
version = re.compile("\.(\w+)$").findall(title)
if version:
version = version[0]
title = title[:-(len(version) + 1)]
else:
version = ''
authors = match[0][0]
if authors.endswith("_"):
authors = authors[:-1] + "."
if authors.endswith(' (Ed.)'):
authors = authors[:-len(' (Ed.)')]
compilation = True
if authors != 'Unknown Author':
authors = [(oxlib.normalize.normalizeName(a), a) for a in authors.split("; ")]
else:
authors = []
self.title = title
self.version = version
self.compilation = compilation
self.save(rename=False)
for a in authors:
author = getAuthor(a[0], a[1])
self.authors.add(author)
self.save()
def save(self, *args, **kwargs):
rename = True
if "rename" in kwargs:
rename = kwargs['rename']
del kwargs['rename']
super(Text, self).save(*args, **kwargs)
if rename and self.file:
path = self.getComputedPath()
if path != self.file.path:
#FIXME: make sure path is not used by other test in system
if not os.path.exists(os.path.dirname(path)):
os.makedirs(os.path.dirname(path))
old_dir = os.path.dirname(self.file.path)
#print 'old', self.file.path
#print 'new', path
os.rename(self.file.path, path)
#FIXME: remove old dir if its empy
if not glob('%s/*' % old_dir):
os.rmdir(old_dir)
self.file.name = path[len(settings.MEDIA_ROOT) + 1:]
#this could be recursive!
self.save()