8 @author: ymh |
8 @author: ymh |
9 ''' |
9 ''' |
10 from django.core.exceptions import ObjectDoesNotExist |
10 from django.core.exceptions import ObjectDoesNotExist |
11 from django.db import models |
11 from django.db import models |
12 from django.db.models import fields as django_fields |
12 from django.db.models import fields as django_fields |
13 from south.modelsinspector import add_introspection_rules |
|
14 |
13 |
|
14 def isalambda(v): |
|
15 LAMBDA = lambda:0 |
|
16 return isinstance(v, type(LAMBDA)) and v.__name__ == LAMBDA.__name__ |
15 |
17 |
16 class OneToOneField(models.OneToOneField): |
18 class OneToOneField(models.OneToOneField): |
17 def __init__(self, to, **kwargs): |
19 def __init__(self, *args, **kwargs): |
18 self.related_default = kwargs.pop('related_default', None) |
20 self.related_default = kwargs.pop('related_default', None) |
19 super(OneToOneField, self).__init__(to, **kwargs) |
21 #This is BAD. Did this to avoid more work in Django 1.7 migration |
|
22 #TODO: correct this |
|
23 if self.related_default == "lambda:": |
|
24 self.related_default = lambda instance: None |
|
25 super(OneToOneField, self).__init__(*args, **kwargs) |
20 |
26 |
21 def contribute_to_related_class(self, cls, related): |
27 def contribute_to_related_class(self, cls, related): |
22 setattr(cls, related.get_accessor_name(), |
28 setattr(cls, related.get_accessor_name(), |
23 SingleRelatedObjectDescriptor(related, self.related_default)) |
29 SingleRelatedObjectDescriptor(related, self.related_default)) |
24 |
30 |
|
31 def deconstruct(self): |
|
32 name, path, args, kwargs = super(OneToOneField, self).deconstruct() |
|
33 if self.related_default is not None: |
|
34 # this is VERY dirty and works only in our application. |
|
35 #TODO: correct this... |
|
36 if isalambda(self.related_default): |
|
37 kwargs['related_default'] = "lambda:" |
|
38 else: |
|
39 kwargs['related_default'] = self.related_default |
|
40 return name, path, args, kwargs |
25 |
41 |
26 class SingleRelatedObjectDescriptor(django_fields.related.SingleRelatedObjectDescriptor): |
42 class SingleRelatedObjectDescriptor(django_fields.related.SingleRelatedObjectDescriptor): |
27 def __init__(self, related, default): |
43 def __init__(self, related, default): |
28 super(SingleRelatedObjectDescriptor, self).__init__(related) |
44 super(SingleRelatedObjectDescriptor, self).__init__(related) |
29 self.default = default |
45 self.default = default |
39 setattr(instance, self.cache_name, value) |
55 setattr(instance, self.cache_name, value) |
40 if value is not None: |
56 if value is not None: |
41 setattr(value, self.related.field.get_cache_name(), instance) |
57 setattr(value, self.related.field.get_cache_name(), instance) |
42 return value |
58 return value |
43 |
59 |
44 add_introspection_rules([ |
|
45 ( |
|
46 [OneToOneField], |
|
47 [], # Positional arguments (not used) |
|
48 { # Keyword argument |
|
49 "related_default": ["related_default", {"default": None, "is_django_function": True}], |
|
50 }, |
|
51 ), |
|
52 ], ["^hdalab\.fields\.OneToOneField"]) |
|