summaryrefslogtreecommitdiff
path: root/factory/django.py
diff options
context:
space:
mode:
authorRaphaël Barrois <raphael.barrois@polytechnique.org>2014-05-17 18:47:04 +0200
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2014-05-18 14:17:05 +0200
commit69894fce7977ea55f8cc3ad141840bab49330859 (patch)
tree07eb056883112ef58b7be037cde76c5f805c8ba2 /factory/django.py
parent1fdba9d9417e8f69b39784ee19129a6c43128620 (diff)
downloadfactory-boy-69894fce7977ea55f8cc3ad141840bab49330859.tar
factory-boy-69894fce7977ea55f8cc3ad141840bab49330859.tar.gz
Switch FACTORY_FOR and related to 'class Meta'.
This is easier to declare, avoids cluttering the namespace, and provides entry points for ORM-specific customization. Signed-off-by: Raphaël Barrois <raphael.barrois@polytechnique.org>
Diffstat (limited to 'factory/django.py')
-rw-r--r--factory/django.py31
1 files changed, 24 insertions, 7 deletions
diff --git a/factory/django.py b/factory/django.py
index a3dfdfc..9a4e07a 100644
--- a/factory/django.py
+++ b/factory/django.py
@@ -52,6 +52,13 @@ def require_django():
raise import_failure
+class DjangoOptions(base.FactoryOptions):
+ def _build_default_options(self):
+ return super(DjangoOptions, self)._build_default_options() + [
+ base.OptionDefault('django_get_or_create', (), inherit=True),
+ ]
+
+
class DjangoModelFactory(base.Factory):
"""Factory for Django models.
@@ -61,8 +68,18 @@ class DjangoModelFactory(base.Factory):
handle those for non-numerical primary keys.
"""
- ABSTRACT_FACTORY = True # Optional, but explicit.
- FACTORY_DJANGO_GET_OR_CREATE = ()
+ _options_class = DjangoOptions
+ class Meta:
+ abstract = True # Optional, but explicit.
+
+ @classmethod
+ def _get_blank_options(cls):
+ return DjangoOptions()
+
+ _OLDSTYLE_ATTRIBUTES = base.Factory._OLDSTYLE_ATTRIBUTES.copy()
+ _OLDSTYLE_ATTRIBUTES.update({
+ 'FACTORY_DJANGO_GET_OR_CREATE': 'django_get_or_create',
+ })
@classmethod
def _load_target_class(cls, definition):
@@ -101,13 +118,13 @@ class DjangoModelFactory(base.Factory):
"""Create an instance of the model through objects.get_or_create."""
manager = cls._get_manager(target_class)
- assert 'defaults' not in cls.FACTORY_DJANGO_GET_OR_CREATE, (
+ assert 'defaults' not in cls._meta.django_get_or_create, (
"'defaults' is a reserved keyword for get_or_create "
- "(in %s.FACTORY_DJANGO_GET_OR_CREATE=%r)"
- % (cls, cls.FACTORY_DJANGO_GET_OR_CREATE))
+ "(in %s._meta.django_get_or_create=%r)"
+ % (cls, cls._meta.django_get_or_create))
key_fields = {}
- for field in cls.FACTORY_DJANGO_GET_OR_CREATE:
+ for field in cls._meta.django_get_or_create:
key_fields[field] = kwargs.pop(field)
key_fields['defaults'] = kwargs
@@ -119,7 +136,7 @@ class DjangoModelFactory(base.Factory):
"""Create an instance of the model, and save it to the database."""
manager = cls._get_manager(target_class)
- if cls.FACTORY_DJANGO_GET_OR_CREATE:
+ if cls._meta.django_get_or_create:
return cls._get_or_create(target_class, *args, **kwargs)
return manager.create(*args, **kwargs)