8 def __init__(self, field_name):
9 self.field_name = field_name
12 return getattr(obj, self.field_name)
15 class RelatedViewField(Field):
16 def __init__(self, field_name, operator_view_class):
17 super(RelatedViewField, self).__init__(field_name)
18 self.__operator_view_class = operator_view_class
21 def _operator_view_class(self):
22 if inspect.isclass(self.__operator_view_class):
23 return self.__operator_view_class
24 elif isinstance(self.__operator_view_class, six.string_types):
26 module_name, class_name =\
27 self.__operator_view_class.rsplit('.', 1)
28 return class_for_name(module_name, class_name)
29 except (AttributeError, ValueError, ImportError):
30 raise WrongOperatorViewClassError(
31 'There is no "%s" class' % self.__operator_view_class
34 def retrieve_and_wrap(self, obj):
35 related_obj = self.get(obj)
36 return self.wrap(related_obj)
39 return self._operator_view_class(obj)
42 class RelatedListViewField(RelatedViewField):
46 class RelatedDictViewField(RelatedViewField):
50 class DataField(Field):
54 class OptionalDataField(DataField):
56 if hasattr(obj, self.field_name):
57 return getattr(obj, self.field_name)
62 class WrongOperatorViewClassError(Exception):
66 def class_for_name(module_name, class_name):
67 # load the module, will raise ImportError if module cannot be loaded
68 m = importlib.import_module(module_name)
69 # get the class, will raise AttributeError if class cannot be found
70 c = getattr(m, class_name)