django-eav2/eav/managers.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

56 lines
1.5 KiB
Python
Raw Permalink Normal View History

"""
This module contains the custom manager used by entities registered with eav.
"""
2010-09-27 13:28:52 +00:00
from django.db import models
2021-10-16 17:45:01 +00:00
from eav.queryset import EavQuerySet
2010-09-27 13:28:52 +00:00
class EntityManager(models.Manager):
"""
Our custom manager, overrides ``models.Manager``.
"""
2021-10-16 17:43:02 +00:00
_queryset_class = EavQuerySet
2010-09-27 13:28:52 +00:00
def create(self, **kwargs):
"""
2010-09-27 13:28:52 +00:00
Parse eav attributes out of *kwargs*, then try to create and save
the object, then assign and save it's eav attributes.
"""
config_cls = getattr(self.model, "_eav_config_cls", None)
2010-09-27 13:28:52 +00:00
if not config_cls or config_cls.manager_only:
return super().create(**kwargs)
2010-09-27 13:28:52 +00:00
prefix = f"{config_cls.eav_attr}__"
2010-09-27 13:28:52 +00:00
new_kwargs = {}
eav_kwargs = {}
2018-04-06 11:59:51 +00:00
for key, value in kwargs.items():
2010-09-27 13:28:52 +00:00
if key.startswith(prefix):
2021-10-16 17:43:02 +00:00
eav_kwargs.update({key[len(prefix) :]: value})
2010-09-27 13:28:52 +00:00
else:
new_kwargs.update({key: value})
obj = self.model(**new_kwargs)
obj_eav = getattr(obj, config_cls.eav_attr)
2018-04-06 11:59:51 +00:00
for key, value in eav_kwargs.items():
2010-09-27 13:28:52 +00:00
setattr(obj_eav, key, value)
2010-09-27 13:28:52 +00:00
obj.save()
return obj
def get_or_create(self, defaults=None, **kwargs):
"""
2010-09-27 13:28:52 +00:00
Reproduces the behavior of get_or_create, eav friendly.
"""
2010-09-27 13:28:52 +00:00
try:
return self.get(**kwargs), False
2010-09-27 13:28:52 +00:00
except self.model.DoesNotExist:
if defaults:
kwargs = {**kwargs, **defaults}
return self.create(**kwargs), True