def get_values_of_attribute(cls, attribute_name): result = [] for dependency in cls.get_all(): value = resolve_attribute(attribute=attribute_name, obj=dependency) try: label = resolve_attribute( attribute='{}_verbose_name'.format(attribute_name), obj=dependency) except AttributeError: label = value try: help_text = resolve_attribute( attribute='{}_help_text'.format(attribute_name), obj=dependency) except AttributeError: help_text = None dictionary = { 'label': label, 'help_text': help_text, 'value': value } if dictionary not in result: result.append(dictionary) return result
def __init__(self, *args, **kwargs): self.opts = DetailFormOption(form=self, kwargs=kwargs, options=getattr(self, 'Meta', None)) super(DetailForm, self).__init__(*args, **kwargs) for extra_field in self.opts.extra_fields: obj = extra_field.get('object', self.instance) field = extra_field['field'] result = resolve_attribute(attribute=field, obj=obj) label = extra_field.get('label', None) # If label is not specified try to get it from the object itself if not label: attribute_name, obj = introspect_attribute( attribute_name=field, obj=obj) if not obj: label = _('None') else: try: label = getattr(getattr(obj, attribute_name), 'short_description') except AttributeError: label = label_for_field(name=attribute_name, model=obj) help_text = extra_field.get('help_text', None) # If help_text is not specified try to get it from the object itself if not help_text: if obj: try: field_object = obj._meta.get_field(field_name=field) except FieldDoesNotExist: field_object = field help_text = getattr(field_object, 'help_text', None) if isinstance(result, models.query.QuerySet): self.fields[field] = forms.ModelMultipleChoiceField( queryset=result, label=label) else: self.fields[field] = forms.CharField( initial=resolve_attribute(obj=obj, attribute=field), label=label, help_text=help_text, widget=extra_field.get('widget', PlainWidget)) for field_name, field in self.fields.items(): self.fields[field_name].widget.attrs.update( {'readonly': 'readonly'})
def resolve(self, context): if self.views: if get_current_view_name( request=context.request) not in self.views: return if self.attribute: result = resolve_attribute(attribute=self.attribute, kwargs=self.kwargs, obj=context['object']) elif self.func: result = self.func(context=context, **self.kwargs) else: result = context['object'] self.absolute_url = self.get_absolute_url(obj=context['object']) if self.widget: if self.check_widget_condition(context=context): widget_instance = self.widget() widget_instance.column = self return widget_instance.render(name=self.attribute, value=result) if not result: if self.empty_value: return self.empty_value else: return result else: return result
def get_absolute_url(self, obj): if self.is_object_absolute_url: return obj.get_absolute_url() elif self.is_attribute_absolute_url: result = resolve_attribute(attribute=self.attribute, kwargs=self.kwargs, obj=obj) return result.get_absolute_url()
def get_for_attribute(cls, attribute_name, attribute_value, **kwargs): result = [] for dependency in cls.get_all(**kwargs): if resolve_attribute(attribute=attribute_name, obj=dependency) == attribute_value: result.append(dependency) return result
def _calculate_help_text(self): if not self._help_text: if self.attribute: try: attribute = resolve_attribute(obj=self.source, attribute=self.attribute) self._help_text = getattr(attribute, 'help_text') except AttributeError: try: name, model = SourceColumn.get_attribute_recursive( attribute=self.attribute, model=self.source._meta.model) self._help_text = help_text_for_field(name=name, model=model) except AttributeError: self._help_text = None self.help_text = self._help_text
def _get_inherited_object_permissions(self, obj, role): queryset = StoredPermission.objects.none() if not obj: return queryset try: related_field = ModelPermission.get_inheritance( model=type(obj) ) except KeyError: pass else: try: parent_object = resolve_attribute( obj=obj, attribute=related_field ) except AttributeError: # Parent accessor is not an attribute, try it as a related # field. parent_object = return_related( instance=obj, related_field=related_field ) content_type = ContentType.objects.get_for_model( model=parent_object ) try: queryset = queryset | self.get( content_type=content_type, object_id=parent_object.pk, role=role ).permissions.all() except self.model.DoesNotExist: pass if type(parent_object) == type(obj): # Object and parent are of the same type. Break recursion return queryset else: queryset = queryset | self._get_inherited_object_permissions( obj=parent_object, role=role ) return queryset
def _calculate_label(self): if not self._label: if self.attribute: try: attribute = resolve_attribute(obj=self.source, attribute=self.attribute) self._label = getattr(attribute, 'short_description') except AttributeError: try: name, model = SourceColumn.get_attribute_recursive( attribute=self.attribute, model=self.source._meta.model) self._label = label_for_field(name=name, model=model) except AttributeError: self._label = self.attribute else: self._label = getattr(self.func, 'short_description', _('Unnamed function')) self.label = self._label
def get_url(self, obj, view_name, request, format): """ Extends HyperlinkedRelatedField to allow passing more than one view keyword argument. ---- Given an object, return the URL that hyperlinks to the object. May raise a `NoReverseMatch` if the `view_name` and `lookup_field` attributes are not configured to correctly match the URL conf. """ # Unsaved objects will not yet have a valid URL. if hasattr(obj, 'pk') and obj.pk in (None, ''): return None kwargs = {} for entry in self.view_kwargs: kwargs[entry['lookup_url_kwarg']] = resolve_attribute( obj=obj, attribute=entry['lookup_field'] ) return self.reverse( viewname=view_name, kwargs=kwargs, request=request, format=format )