From fce57b2e1ce16529ab1d07353ee14b6ab761aa56 Mon Sep 17 00:00:00 2001 From: Arnaud Fabre Date: Wed, 1 Jul 2015 12:26:12 +0200 Subject: [PATCH] utils --- core/utils.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 core/utils.py diff --git a/core/utils.py b/core/utils.py new file mode 100644 index 0000000..6275dd3 --- /dev/null +++ b/core/utils.py @@ -0,0 +1,50 @@ +# coding: utf-8 + +# This file is part of memopol. +# +# memopol is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of +# the License, or any later version. +# +# memopol is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU General Affero Public +# License along with django-representatives. +# If not, see . +# +# Copyright (C) 2015 Arnaud Fabre +from __future__ import absolute_import + +from django.core.exceptions import ObjectDoesNotExist + +def create_child_instance_from_parent(child_cls, parent_instance): + parent_cls = parent_instance.__class__ + field = child_cls._meta.get_ancestor_link(parent_cls).column + + # We could specify a parent_identifier which is a unique field in + # the parent class that link child to parent + if hasattr(child_cls, 'parent_identifier'): + try: + child_instance = child_cls.objects.get( + **{child_cls.child_parent_identifier: + getattr(parent_instance, child_cls.parent_identifier)} + ) + setattr(child_instance, field, parent_instance.pk) + except ObjectDoesNotExist: + child_instance = child_cls(**{ + field: parent_instance.pk, + child_cls.child_parent_identifier: + getattr(parent_instance, child_cls.parent_identifier) + }) + else: + child_instance = child_cls(**{ + field: parent_instance.pk + }) + + child_instance.__dict__.update(parent_instance.__dict__) + child_instance.save() + return child_instance -- GitLab