Example #1
0
    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
Example #2
0
    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'})
Example #3
0
    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
Example #4
0
 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()
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
        )