Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 37bc9bc5 authored by Robin Tissot's avatar Robin Tissot
Browse files

versionning tests & pep8.

parent 865f5c20
Branches
Tags
1 merge request!39Fix/tests and pep8
import json
import sys
import uuid
from datetime import datetime, timezone
......@@ -42,7 +41,7 @@ class Versioned(models.Model):
data: {} # no need to pickle since jsonb is compiled anyway
]}
"""
### these fields store the 'current' revision
# these fields store the 'current' revision
revision = models.UUIDField(default=uuid.uuid4, editable=False)
version_source = models.CharField(editable=False, max_length=128,
default=getattr(settings, 'VERSIONING_DEFAULT_SOURCE'))
......@@ -64,7 +63,7 @@ class Versioned(models.Model):
data = {}
for field in self._meta.fields:
if (field.name not in ('id', 'revision', 'versions')
and not field.name in self._meta.model.version_ignore_fields
and field.name not in self._meta.model.version_ignore_fields
and not field.name.startswith('version_')):
data[field.name] = getattr(self, field.name)
data.update(kwargs)
......@@ -87,8 +86,8 @@ class Versioned(models.Model):
# version_source, version_author, version_created_at, version_updated_at
fields.update(**{'version_%s' % key: value for key, value in v.items()})
# update the instance with the left over fields
fields.update(**{field:getattr(self, field) for field in self.version_ignore_fields})
data = {f:fields[f] for f in fields if f in [mf.name for mf in self._meta.fields]}
fields.update(**{field: getattr(self, field) for field in self.version_ignore_fields})
data = {f: fields[f] for f in fields if f in [mf.name for mf in self._meta.fields]}
instance = self._meta.model(**data)
# disable database operations
instance.save = _dummy_db
......@@ -97,26 +96,27 @@ class Versioned(models.Model):
def new_version(self, author=None, source=None, **kwargs):
packed = self.pack(**kwargs)
author_ = author or self.version_author
source_ = source or self.version_author
if self.versions:
last = self.versions[0]
if (packed['data'] == last['data']
and author==self.version_author
and source==self.version_source):
and author_ == self.version_author
and source_ == self.version_source):
raise NoChangeException
self.versions.insert(0, packed)
# if we passed version_history_max_length we delete the last one
if (self.version_history_max_length
and len(self.versions) > self.version_history_max_length):
self.delete_revision(self.versions[self.version_history_max_length]['revision'])
self.revision = uuid.uuid4() # new revision number
if author is not None:
self.version_author = author
if source is not None:
self.version_source = source
self.version_author = author_
self.version_source = source_
self.version_created_at = datetime.now(timezone.utc)
self.version_updated_at = datetime.now(timezone.utc)
def revert(self, revision):
"""
revision is a hex of the uuid field as stored in the history
......@@ -135,7 +135,8 @@ class Versioned(models.Model):
setattr(self, field_name, value)
self.version_source = version['source']
self.version_author = version['author']
# self.version_created_at = datetime.fromisoformat(version['created_at']) # 3.7 only
# 3.7 only
# self.version_created_at = datetime.fromisoformat(version['created_at'])
self.version_created_at = datetime.strptime(
version['created_at'][:26], "%Y-%m-%dT%H:%M:%S.%f")
self.version_updated_at = datetime.now(timezone.utc)
......
from django.db import IntegrityError
from django.test import TestCase, override_settings
from django.test import TestCase
from django.contrib.auth import get_user_model
from versioning.models import TestModel, NoChangeException
......@@ -16,7 +15,7 @@ class VersioningTest(TestCase):
self.instance = TestModel.objects.create(
content='test',
version_author=self.user1.username)
def test_nominal(self):
v1_revision = self.instance.revision
self.assertEqual(len(self.instance.history), 0)
......@@ -27,54 +26,59 @@ class VersioningTest(TestCase):
self.assertEqual(len(self.instance.history), 1)
self.assertNotEqual(self.instance.revision, v1_revision)
v2_revision = self.instance.revision
self.instance.new_version()
self.instance.content = 'test v3'
v3_revision = self.instance.revision
self.instance.new_version()
self.instance.content = 'test v4'
v4_revision = self.instance.revision
self.assertEqual(len(self.instance.history), 3)
self.instance.revert(v1_revision.hex)
self.assertEqual(len(self.instance.history), 3)
self.assertEqual(self.instance.revision, v1_revision)
self.assertEqual(self.instance.history[0].revision, v4_revision)
self.assertEqual(self.instance.history[1].revision, v3_revision)
self.assertEqual(self.instance.history[2].revision, v2_revision)
self.instance.revert(v3_revision.hex)
self.assertEqual(len(self.instance.history), 3)
self.assertEqual(self.instance.revision, v3_revision)
self.assertEqual(self.instance.history[0].revision, v1_revision)
self.assertEqual(self.instance.history[1].revision, v4_revision)
self.assertEqual(self.instance.history[2].revision, v2_revision)
def test_save_version(self):
self.instance.new_version()
with self.assertRaises(RuntimeError):
self.instance.history[0].save()
with self.assertRaises(RuntimeError):
self.instance.history[0].delete()
def test_ignored_field(self):
self.instance.new_version()
self.assertNotIn('ignored', self.instance.versions[0]['data'])
def test_no_change(self):
self.instance.new_version()
with self.assertRaises(NoChangeException):
self.instance.new_version()
def test_user_change(self):
self.instance.new_version()
# just check NoChangeException is not raised
self.instance.new_version(author=self.user2.username)
def test_delete(self):
self.instance.new_version()
self.assertEqual(len(self.instance.history), 1)
self.instance.delete_revision(self.instance.versions[0]['revision'])
self.assertEqual(len(self.instance.history), 0)
def test_flush(self):
self.instance.new_version()
self.instance.new_version(content='test replace')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment