def _test_construct_id_filter(self, model, data):

        query = exists.construct_id_filter(model, data)
        qs = model.objects.filter(query)
        self.assertEqual(qs.count(), 1)
        p = qs.first()
        return p
Example #2
0
    def select_existing_item(self, manager, datum):
        automatic_filter = construct_id_filter(manager.model, datum)

        intermediate_result = manager.filter(automatic_filter)
        try:
            return intermediate_result.distinct().get()
        except manager.model.DoesNotExist:
            pass
        except manager.model.MultipleObjectsReturned as e:
            logger.error("Multiple objects on unique contrained items, freaky %s", e)
            logger.exception(e)

        # fallback to manually specified lookup_fields
        for lookup_field in self.Meta.lookup_fields:
            if lookup_field in datum:
                try:
                    return intermediate_result.get(
                        **{lookup_field: datum[lookup_field]}
                    )
                except manager.model.DoesNotExist:
                    continue
                except manager.model.MultipleObjectsReturned:
                    continue

        return None
Example #3
0
    def get_object(self):
        """
        Returns the object the view is displaying.

        Tries to extract a uniquely indentifying query from the posted data
        """
        try:
            automatic_filter = construct_id_filter(Product, self.request.data)
            obj = Product.objects.get(automatic_filter)
            self.check_object_permissions(self.request, obj)
            return obj
        except Product.DoesNotExist:
            raise Http404("No %s matches the given query." %
                          Product._meta.object_name)
Example #4
0
    def restrict_query_to_parent(self, query):
        ParentModelClass = self.parent.Meta.model
        relation_field = ParentModelClass._meta.get_field(self.field_name)

        parent_field_name = relation_field.field.name

        if self.parent.instance:
            return query.exclude(**{parent_field_name: self.parent.instance})
        else:
            parent_filter = construct_id_filter(
                ParentModelClass,
                self.parent.get_initial(),
                prefix="%s%s" % (parent_field_name, LOOKUP_SEP),
            )
            return query.exclude(parent_filter).distinct()