Source code for djenerator.utility
#!/usr/bin/env python
"""
This module contains utiltiy functions that are used in generating data.
"""
from django.db.models import Model
from model_reader import list_of_fields
from model_reader import names_of_fields
[docs]def unique_items(var_tuple):
"""
Generate a function that can be used to check the uniqueness constraint.
:param tuple var_tuple:
A tuple of the names of the fields that should be unique together
:rtype: function
:returns:
boolean function(variable, model, field):
variable: A list of tuples in the form (field name, field value)
model: A reference to the class of the given model.
field: A reference to the class of the given field.
"""
def uniqueness_constraint(variable, model, field):
keys = dict(variable).keys()
for key_name in var_tuple:
if key_name not in keys:
return True
l = [(val, var) for (val, var) in variable if val in var_tuple]
while model != Model and not model._meta.abstract:
if list(model.objects.filter(**dict(l))):
return False
model = model.__base__
return True
return uniqueness_constraint
[docs]def sort_unique_tuple(var_tuple, model):
"""
Sorts a tuple of names of a fields for a given model, in the order of
which field comes first.
:param tuple var_tuple:
A tuple of strings of the names of some fields in the given model.
:param DjangoModel model: A reference to the class of the given model.
:rtype: tuple(str)
:returns: A tuple of the names of the fields.
"""
result = []
fields = list_of_fields(model)
for field in fields:
if field.name in var_tuple:
result.append(field.name)
return tuple(result)
[docs]def sort_unique_tuples(var_tuples, model):
"""
Sort lexicographically the tuples of fields according to what appears first
in the model.
:param var_tuples: a list of tuples of names of some fields.
:type var_tuples: List(tuple(str))
:param model: A reference to the class of the given model.
:rtype: List(tuple(str))
:returns: A list of tuples of names of some fields.
"""
fields = names_of_fields(model)
var_tuples = [sort_unique_tuple(var_tup, model) for var_tup in var_tuples]
def cm(a, b):
if not len(a) and not len(b):
return 0
elif not len(a):
return -1
elif not len(b):
return 1
if a[0] == b[0]:
return cm(a[1:], b[1:])
else:
if fields.index(a[0]) < fields.index(b[0]):
return -1
else:
return 1
clone = var_tuples[:]
clone.sort(cmp=cm)
return tuple(clone)