Ejemplo n.º 1
0
 def choices(self):
     yield {
         'selected': self.lookup_exact_val == '' and not self.lookup_isnull_val,
         'query_string': self.query_string({},
                                           [self.lookup_exact_name, self.lookup_isnull_name]),
         'display': _('All'),
     }
     for pk_val, val in self.lookup_choices:
         yield {
             'selected': self.lookup_exact_val == smart_unicode(pk_val),
             'query_string': self.query_string({
                 self.lookup_exact_name: pk_val,
             }, [self.lookup_isnull_name]),
             'display': val,
         }
     if (is_related_field(self.field)
             and self.field.field.null or hasattr(self.field, 'rel')
             and self.field.null):
         yield {
             'selected': bool(self.lookup_isnull_val),
             'query_string': self.query_string({
                 self.lookup_isnull_name: 'True',
             }, [self.lookup_exact_name]),
             'display': EMPTY_CHANGELIST_VALUE,
         }
Ejemplo n.º 2
0
 def choices(self):
     yield {
         'selected': self.lookup_exact_val == '' and self.lookup_isnull_val is None,
         'query_string': self.query_string({},
                                           [self.lookup_exact_name, self.lookup_isnull_name]),
         'display': '(%s)' % _('All'),
     }
     for pk_val, val in self.lookup_choices:
         yield {
             'selected': self.lookup_exact_val == smart_text(pk_val),
             'query_string': self.query_string({
                 self.lookup_exact_name: pk_val,
             }, [self.lookup_isnull_name]),
             'display': val,
         }
     if (is_related_field(self.field)
             and self.field.field.null or hasattr(self.field, 'rel')
             and self.field.null):
         yield {
             'selected': self.lookup_isnull_val is False and self.lookup_exact_val == '',
             'query_string': self.query_string({self.lookup_isnull_name: 'False'},
                                               [self.lookup_exact_name]),
             'display': '(%s)' % _('Has value'),
         }
         yield {
             'selected': self.lookup_isnull_val is True,
             'query_string': self.query_string({self.lookup_isnull_name: 'True'},
                                               [self.lookup_exact_name]),
             'display': EMPTY_CHANGELIST_VALUE,
         }
Ejemplo n.º 3
0
 def has_output(self):
     if (is_related_field(self.field)
             and self.field.field.null or hasattr(self.field, 'rel')
             and self.field.null):
         extra = 1
     else:
         extra = 0
     return len(self.lookup_choices) + extra > 1
Ejemplo n.º 4
0
 def choices(self):
     yield {
         "selected": self.lookup_exact_val == "" and not self.lookup_isnull_val,
         "query_string": self.query_string({}, [self.lookup_exact_name, self.lookup_isnull_name]),
         "display": _("All"),
     }
     for pk_val, val in self.lookup_choices:
         yield {
             "selected": self.lookup_exact_val == smart_unicode(pk_val),
             "query_string": self.query_string({self.lookup_exact_name: pk_val}, [self.lookup_isnull_name]),
             "display": val,
         }
     if is_related_field(self.field) and self.field.field.null or hasattr(self.field, "rel") and self.field.null:
         yield {
             "selected": bool(self.lookup_isnull_val),
             "query_string": self.query_string({self.lookup_isnull_name: "True"}, [self.lookup_exact_name]),
             "display": EMPTY_CHANGELIST_VALUE,
         }
Ejemplo n.º 5
0
    def lookup_allowed(self, lookup, value):
        model = self.model
        # Check FKey lookups that are allowed, so that popups produced by
        # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to,
        # are allowed to work.
        for l in model._meta.related_fkey_lookups:
            for k, v in widgets.url_params_from_lookup_dict(l).items():
                if k == lookup and v == value:
                    return True
 
        parts = lookup.split(LOOKUP_SEP)
 
        # Last term in lookup is a query term (__exact, __startswith etc)
        # This term can be ignored.
        if len(parts) > 1 and parts[-1] in QUERY_TERMS:
            parts.pop()
 
        # Special case -- foo__id__exact and foo__id queries are implied
        # if foo has been specificially included in the lookup list; so
        # drop __id if it is the last part. However, first we need to find
        # the pk attribute name.
        rel_name = None
        for part in parts[:-1]:
            try:
                field = model._meta.get_field(part)
            except FieldDoesNotExist:
                # Lookups on non-existants fields are ok, since they're ignored
                # later.
                return True
            if hasattr(field, 'rel'):
                model = field.rel.to
                rel_name = field.rel.get_related_field().name
            elif is_related_field(field):
                model = field.model
                rel_name = model._meta.pk.name
            else:
                rel_name = None
        if rel_name and len(parts) > 1 and parts[-1] == rel_name:
            parts.pop()
 
        if len(parts) == 1:
            return True
        clean_lookup = LOOKUP_SEP.join(parts)
        return clean_lookup in self.list_quick_filter
Ejemplo n.º 6
0
    def lookup_allowed(self, lookup, value):
        model = self.model
        # Check FKey lookups that are allowed, so that popups produced by
        # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to,
        # are allowed to work.
        for l in model._meta.related_fkey_lookups:
            for k, v in widgets.url_params_from_lookup_dict(l).items():
                if k == lookup and v == value:
                    return True

        parts = lookup.split(LOOKUP_SEP)

        # Last term in lookup is a query term (__exact, __startswith etc)
        # This term can be ignored.
        if len(parts) > 1 and parts[-1] in QUERY_TERMS:
            parts.pop()

        # Special case -- foo__id__exact and foo__id queries are implied
        # if foo has been specificially included in the lookup list; so
        # drop __id if it is the last part. However, first we need to find
        # the pk attribute name.
        rel_name = None
        for part in parts[:-1]:
            try:
                field = model._meta.get_field(part)
            except FieldDoesNotExist:
                # Lookups on non-existants fields are ok, since they're ignored
                # later.
                return True
            if hasattr(field, 'rel'):
                model = field.rel.to
                rel_name = field.rel.get_related_field().name
            elif is_related_field(field):
                model = field.model
                rel_name = model._meta.pk.name
            else:
                rel_name = None
        if rel_name and len(parts) > 1 and parts[-1] == rel_name:
            parts.pop()

        if len(parts) == 1:
            return True
        clean_lookup = LOOKUP_SEP.join(parts)
        return clean_lookup in self.list_quick_filter
Ejemplo n.º 7
0
    def post(self, request, object_id, *args, **kwargs):
        object_id = unquote(object_id)
        self.obj = self.get_object(object_id)

        if not self.has_change_permission(self.obj):
            raise PermissionDenied

        params = self.request.POST
        if 'version_a' not in params or 'version_b' not in params:
            self.message_user(_("Must select two versions."), 'error')
            return self.get_response()

        version_a_id = params['version_a']
        version_b_id = params['version_b']

        if version_a_id == version_b_id:
            self.message_user(
                _("Please select two different versions."), 'error')
            return self.get_response()

        version_a = get_object_or_404(Version, pk=version_a_id)
        version_b = get_object_or_404(Version, pk=version_b_id)

        diffs = []

        obj_a, detail_a = self.get_version_object(version_a)
        obj_b, detail_b = self.get_version_object(version_b)

        for f in (self.opts.fields + self.opts.many_to_many):
            if is_related_field(f):
                label = f.opts.verbose_name
            else:
                label = f.verbose_name

            value_a = f.value_from_object(obj_a)
            value_b = f.value_from_object(obj_b)
            is_diff = value_a != value_b

            if type(value_a) in (list, tuple) and type(value_b) in (list, tuple) \
                    and len(value_a) == len(value_b) and is_diff:
                is_diff = False
                for i in xrange(len(value_a)):
                    if value_a[i] != value_a[i]:
                        is_diff = True
                        break
            if type(value_a) is QuerySet and type(value_b) is QuerySet:
                is_diff = list(value_a) != list(value_b)

            diffs.append((label, detail_a.get_field_result(
                f.name).val, detail_b.get_field_result(f.name).val, is_diff))

        context = super(RevisionListView, self).get_context()
        context.update({
            'object': self.obj,
            'opts': self.opts,
            'version_a': version_a,
            'version_b': version_b,
            'revision_a_url': self.model_admin_url('revision', quote(version_a.object_id), version_a.id),
            'revision_b_url': self.model_admin_url('revision', quote(version_b.object_id), version_b.id),
            'diffs': diffs
        })

        return TemplateResponse(
            self.request, self.revision_diff_template or self.get_template_list('views/revision_diff.html'),
            context, current_app=self.admin_site.name)
Ejemplo n.º 8
0
    def post(self, request, object_id, *args, **kwargs):
        object_id = unquote(object_id)
        self.obj = self.get_object(object_id)

        if not self.has_change_permission(self.obj):
            raise PermissionDenied

        params = self.request.POST
        if 'version_a' not in params or 'version_b' not in params:
            self.message_user(_("Must select two versions."), 'error')
            return self.get_response()

        version_a_id = params['version_a']
        version_b_id = params['version_b']

        if version_a_id == version_b_id:
            self.message_user(_("Please select two different versions."),
                              'error')
            return self.get_response()

        version_a = get_object_or_404(Version, pk=version_a_id)
        version_b = get_object_or_404(Version, pk=version_b_id)

        diffs = []

        obj_a, detail_a = self.get_version_object(version_a)
        obj_b, detail_b = self.get_version_object(version_b)

        for f in (self.opts.fields + self.opts.many_to_many):
            if is_related_field(f):
                label = f.opts.verbose_name
            else:
                label = f.verbose_name

            value_a = f.value_from_object(obj_a)
            value_b = f.value_from_object(obj_b)
            is_diff = value_a != value_b

            if type(value_a) in (list, tuple) and type(value_b) in (list, tuple) \
                    and len(value_a) == len(value_b) and is_diff:
                is_diff = False
                for i in range(len(value_a)):
                    if value_a[i] != value_a[i]:
                        is_diff = True
                        break
            if type(value_a) is QuerySet and type(value_b) is QuerySet:
                is_diff = list(value_a) != list(value_b)

            diffs.append((label, detail_a.get_field_result(f.name).val,
                          detail_b.get_field_result(f.name).val, is_diff))

        context = super(RevisionListView, self).get_context()
        context.update({
            'object':
            self.obj,
            'opts':
            self.opts,
            'version_a':
            version_a,
            'version_b':
            version_b,
            'revision_a_url':
            self.model_admin_url('revision', quote(version_a.object_id),
                                 version_a.id),
            'revision_b_url':
            self.model_admin_url('revision', quote(version_b.object_id),
                                 version_b.id),
            'diffs':
            diffs
        })

        return TemplateResponse(
            self.request,
            self.revision_diff_template
            or self.get_template_list('views/revision_diff.html'),
            context,
            current_app=self.admin_site.name)