src/hdalab/fields.py
changeset 545 c752fdee555b
parent 458 604b887e70c3
equal deleted inserted replaced
544:ed812f1f7592 545:c752fdee555b
     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"])