Added tests for custom db-backend

This commit is contained in:
Swen Kooij
2017-02-02 14:36:22 +02:00
parent 5ba9be4aeb
commit 1ef02616ec
5 changed files with 162 additions and 42 deletions

View File

@@ -117,11 +117,8 @@ class SchemaEditor(_get_schema_editor_base()):
)
self.execute(sql)
def _update_hstore_constraints(self, model, old_field, new_field):
"""Updates the UNIQUE constraints for the specified field."""
old_uniqueness = getattr(old_field, 'uniqueness', None)
new_uniqueness = getattr(new_field, 'uniqueness', None)
def _apply_hstore_constraints(self, method, model, field):
"""Creates/drops UNIQUE constraints for a field."""
def _compose_keys(constraint):
if isinstance(constraint, str):
@@ -129,23 +126,38 @@ class SchemaEditor(_get_schema_editor_base()):
return constraint
uniqueness = getattr(field, 'uniqueness', None)
if not uniqueness:
return
for keys in uniqueness:
method(
model,
field,
_compose_keys(keys)
)
def _update_hstore_constraints(self, model, old_field, new_field):
"""Updates the UNIQUE constraints for the specified field."""
old_uniqueness = getattr(old_field, 'uniqueness', None)
new_uniqueness = getattr(new_field, 'uniqueness', None)
# drop any old uniqueness constraints
if old_uniqueness:
for keys in old_uniqueness:
self._drop_hstore_unique(
model,
old_field,
_compose_keys(keys)
)
self._apply_hstore_constraints(
self._drop_hstore_unique,
model,
old_field
)
# (re-)create uniqueness constraints
if new_uniqueness:
for keys in new_uniqueness:
self._create_hstore_unique(
model,
old_field,
_compose_keys(keys)
)
self._apply_hstore_constraints(
self._create_hstore_unique,
model,
new_field
)
def _alter_field(self, model, old_field, new_field, *args, **kwargs):
"""Ran when the configuration on a field changed."""
@@ -170,7 +182,26 @@ class SchemaEditor(_get_schema_editor_base()):
if not isinstance(field, LocalizedField):
continue
self._update_hstore_constraints(model, field, field)
self._apply_hstore_constraints(
self._create_hstore_unique,
model,
field
)
def delete_model(self, model):
"""Ran when a model is being deleted."""
super().delete_model(model)
for field in model._meta.local_fields:
if not isinstance(field, LocalizedField):
continue
self._apply_hstore_constraints(
self._drop_hstore_unique,
model,
field
)
class DatabaseWrapper(_get_backend_base()):

View File

@@ -1,6 +1,5 @@
from django.db import models
from django.db import models, transaction
from django.db.utils import IntegrityError
from django.db import transaction
from .fields import LocalizedField
from .localized_value import LocalizedValue
@@ -41,7 +40,6 @@ class LocalizedModel(models.Model):
if not hasattr(self, 'retries'):
self.retries = 0
error = None
with transaction.atomic():
try:
return super(LocalizedModel, self).save(*args, **kwargs)
@@ -52,12 +50,8 @@ class LocalizedModel(models.Model):
# that apply to slug fields... so yea.. this is as
# retarded as it gets... i am sorry :(
if 'slug' not in str(ex):
raise ex
error = ex
if self.retries >= 100:
raise error
if self.retries >= 100:
raise ex
self.retries += 1
return self.save()