""" This module defines the structure and properties of documents. """ from django.db import models from closuretree.models import ClosureModel from simple_history.models import HistoricalRecords from jci.models import Standard class Audience(ClosureModel): name = models.CharField(max_length=50) parent = models.ForeignKey('self', related_name='children', null=True, blank=True) def __str__(self): return self.name class Meta: ordering = ('name',) class Site(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class Meta: ordering = ['name'] class Structure(ClosureModel): name = models.CharField(max_length=50) acronym = models.CharField(max_length=20, null=True, blank=True) parent = models.ForeignKey('self', related_name='children', null=True, blank=True) def __str__(self): return self.name class DocumentType(models.Model): name = models.CharField(max_length=50) level = models.IntegerField() template = models.FileField(upload_to='documents_templates/', null=True, blank=True) def __str__(self): return self.name class Meta: ordering = ['level'] class Document(models.Model): audiences = models.ManyToManyField(Audience) sites = models.ManyToManyField(Site) standards = models.ManyToManyField(Standard, related_name='documents') structures = models.ManyToManyField(Structure) title = models.CharField(max_length=255) overview = models.TextField(blank=True, null=True) type = models.ForeignKey(DocumentType, null=True) created_at = models.DateTimeField(auto_now_add=True) revised_at = models.DateTimeField(null=True, blank=True) history = HistoricalRecords() @property def last_published_version(self): try: return self.versions.filter(published__isnull=False).first().revisions.first() except Version.DoesNotExist: return 'None' except Exception: return 'None' @property def last_working_version(self): try: return self.versions.filter(published__isnull=True).first().revisions.first() except Version.DoesNotExist: return 'None' def __str__(self): return self.title def update_version(self, document): pass def publish(self): pass class Version(models.Model): document = models.ForeignKey(Document, related_name='versions') major = models.PositiveIntegerField() published = models.OneToOneField('Revision', related_name='published_version+', null=True, blank=True) class Meta: unique_together = ('document', 'major') @property def status(self): return 'Published' if self.published else 'Draft' def __str__(self): return '{} v{} ({})'.format(self.document, self.major, self.status) def publish(self): pass class Revision(models.Model): revision = models.FileField(upload_to='revisions/') created_at = models.DateTimeField(auto_now_add=True) version = models.ForeignKey(Version, related_name='revisions') minor = models.PositiveIntegerField() class Meta: ordering = ('-minor',) def __str__(self): return '{} rev {}'.format(self.version, self.minor)