include django_reversion for document and version history

This commit is contained in:
Fred Pauchet 2017-10-27 15:19:18 +02:00
parent 86538ce3c8
commit a57db26156
11 changed files with 155 additions and 22 deletions

View File

@ -39,7 +39,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'evolus', 'evolus',
'jci', 'jci',
'simple_history', 'reversion',
'process' 'process'
] ]
@ -51,6 +51,7 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'simple_history.middleware.HistoryRequestMiddleware',
] ]
ROOT_URLCONF = 'config.urls' ROOT_URLCONF = 'config.urls'

Binary file not shown.

View File

@ -1,9 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import Audience, Document, DocumentType, Version, Site, Structure, Revision, Keyword from reversion.admin import VersionAdmin
from .models import Audience, Document, DocumentType, Version, Site, Structure, Keyword
class DocumentAdmin(admin.ModelAdmin): class DocumentAdmin(VersionAdmin):
list_filter = ('type', 'audiences', 'sites', 'structures') list_filter = ('type', 'audiences', 'sites', 'structures')
@ -16,6 +18,5 @@ admin.site.register(Site)
admin.site.register(Structure) admin.site.register(Structure)
admin.site.register(Document, DocumentAdmin) admin.site.register(Document, DocumentAdmin)
admin.site.register(DocumentType, DocumentTypeAdmin) admin.site.register(DocumentType, DocumentTypeAdmin)
admin.site.register(Version) admin.site.register(Version, VersionAdmin)
admin.site.register(Revision)
admin.site.register(Keyword) admin.site.register(Keyword)

View File

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-10-27 11:46
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('evolus', '0008_auto_20171026_1555'),
]
operations = [
migrations.CreateModel(
name='HistoricalVersion',
fields=[
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
('document', models.TextField(max_length=100)),
('major', models.PositiveIntegerField()),
('published', models.BooleanField(default=False)),
('revised_at', models.DateTimeField(blank=True, null=True)),
('created_at', models.DateTimeField(blank=True, editable=False)),
('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_date', models.DateTimeField()),
('history_change_reason', models.CharField(max_length=100, null=True)),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'historical version',
'ordering': ('-history_date', '-history_id'),
'get_latest_by': 'history_date',
},
),
migrations.RemoveField(
model_name='revision',
name='version',
),
migrations.AddField(
model_name='version',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AlterField(
model_name='version',
name='document',
field=models.FileField(upload_to='revisions/'),
),
migrations.AlterField(
model_name='version',
name='published',
field=models.BooleanField(default=False),
),
migrations.DeleteModel(
name='Revision',
),
]

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-10-27 11:51
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evolus', '0009_auto_20171027_1346'),
]
operations = [
migrations.AddField(
model_name='historicalversion',
name='revision',
field=models.PositiveIntegerField(default=1),
preserve_default=False,
),
migrations.AddField(
model_name='version',
name='revision',
field=models.PositiveIntegerField(default=1),
preserve_default=False,
),
migrations.AlterField(
model_name='version',
name='keywords',
field=models.ManyToManyField(blank=True, related_name='document_versions', to='evolus.Keyword'),
),
]

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-10-27 13:12
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('evolus', '0010_auto_20171027_1351'),
]
operations = [
migrations.RemoveField(
model_name='historicalversion',
name='history_user',
),
migrations.AddField(
model_name='version',
name='file',
field=models.FileField(default=1, upload_to='revisions/'),
preserve_default=False,
),
migrations.AlterField(
model_name='version',
name='document',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='evolus.Document'),
),
migrations.DeleteModel(
name='HistoricalVersion',
),
]

View File

@ -6,6 +6,7 @@ from django.db import models
from closuretree.models import ClosureModel from closuretree.models import ClosureModel
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from django.contrib.auth.models import User from django.contrib.auth.models import User
import reversion
from jci.models import Standard from jci.models import Standard
@ -53,6 +54,7 @@ class DocumentType(models.Model):
ordering = ['level'] ordering = ['level']
@reversion.register()
class Document(models.Model): class Document(models.Model):
audiences = models.ManyToManyField(Audience) audiences = models.ManyToManyField(Audience)
sites = models.ManyToManyField(Site) sites = models.ManyToManyField(Site)
@ -81,6 +83,10 @@ class Document(models.Model):
except Version.DoesNotExist: except Version.DoesNotExist:
return 'None' return 'None'
@reversion.create_revision()
def save(self, *args, **kwargs):
super().save()
def __str__(self): def __str__(self):
return self.title return self.title
@ -102,15 +108,24 @@ class Keyword(ClosureModel):
return self.name return self.name
@reversion.register()
class Version(models.Model): class Version(models.Model):
document = models.ForeignKey(Document, related_name='versions') document = models.ForeignKey(Document)
keywords = models.ManyToManyField(Keyword, related_name='document_versions') file = models.FileField(upload_to='revisions/')
keywords = models.ManyToManyField(Keyword, blank=True, related_name='document_versions')
major = models.PositiveIntegerField() major = models.PositiveIntegerField()
published = models.OneToOneField('Revision', related_name='published_version+', null=True, blank=True) revision = models.PositiveIntegerField()
published = models.BooleanField(default=False)
revised_at = models.DateTimeField(null=True, blank=True) revised_at = models.DateTimeField(null=True, blank=True)
authors = models.ManyToManyField(User, related_name='authors') authors = models.ManyToManyField(User, related_name='authors')
reviewers = models.ManyToManyField(User, related_name='reviewers') reviewers = models.ManyToManyField(User, related_name='reviewers')
validators = models.ManyToManyField(User, related_name='validators') validators = models.ManyToManyField(User, related_name='validators')
created_at = models.DateTimeField(auto_now_add=True)
@reversion.create_revision()
def save(self, *args, **kwargs):
self.revision = self.revision + 1
super().save(*args, **kwargs)
class Meta: class Meta:
unique_together = ('document', 'major') unique_together = ('document', 'major')
@ -120,20 +135,7 @@ class Version(models.Model):
return 'Published' if self.published else 'Draft' return 'Published' if self.published else 'Draft'
def __str__(self): def __str__(self):
return '{} v{} ({})'.format(self.document, self.major, self.status) return 'v{}.{} ({})'.format(self.major, self.revision, self.status)
def publish(self): def publish(self):
pass 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB