Exemplo n.º 1
0
 def test_parse_many(self):
     res = utils.parse_queryset_filters("x=2,x>=3,y!=4,z<3")
     filters = {"x": "2", "x__gte": "3", "z__lt": "3"}
     excludes = {"y": "4"}
     self.assertEqual(res, (filters, excludes))
Exemplo n.º 2
0
 def test_parse_empty(self):
     res = utils.parse_queryset_filters("")
     self.assertEqual(res, ({}, {}))
Exemplo n.º 3
0
 def test_parse_one(self):
     res = utils.parse_queryset_filters("x=2")
     self.assertEqual(res, ({"x": "2"}, {}))
     res = utils.parse_queryset_filters("x!=2")
     self.assertEqual(res, ({}, {"x": "2"}))
Exemplo n.º 4
0
    def handle(self, *args, **options):
        if len(args) > 0:
            raise CommandError("List commands do not accept any argument")

        assert (self.object_class), "object_class variable must be declared"

        # If an user field is declared, include the USER_EMAIL_FIELD in the
        # available fields
        if self.user_uuid_field is not None:
            self.FIELDS[USER_EMAIL_FIELD] =\
                ("_user_email", "The email of the owner")

        if options["list_fields"]:
            self.display_fields()
            return

        if options["list_filters"]:
            self.display_filters()
            return

        # --output option
        if options["fields"]:
            fields = options["fields"]
            fields = fields.split(",")
            self.validate_fields(fields)
            self.fields = options["fields"].split(",")

        # --display-mails option
        if options.get("display_mails"):
            self.fields.append(USER_EMAIL_FIELD)

        # --filter-by option
        if options["filter_by"]:
            filters, excludes = \
                utils.parse_queryset_filters(options["filter_by"])
        else:
            filters, excludes = ({}, {})

        self.filters.update(filters)
        self.excludes.update(excludes)

        # --user option
        user = options.get("user")
        if user:
            if "@" in user:
                ucache = UserCache(self.astakos_auth_url, self.astakos_token)
                user = ucache.get_uuid(user)
            self.filters[self.user_uuid_field] = user

        # --deleted option
        if self.deleted_field:
            deleted = options.get("deleted")
            if deleted:
                self.filters[self.deleted_field] = True
            else:
                self.filters[self.deleted_field] = False

        # Special handling of arguments
        self.handle_args(self, *args, **options)

        select_related = getattr(self, "select_related", [])
        prefetch_related = getattr(self, "prefetch_related", [])

        objects = self.object_class.objects
        try:
            for sr in select_related:
                objects = objects.select_related(sr)
            for pr in prefetch_related:
                objects = objects.prefetch_related(pr)
            objects = objects.filter(**self.filters)
            objects = objects.exclude(**self.excludes)
        except FieldError as e:
            raise CommandError(e)
        except Exception as e:
            raise CommandError("Can not filter results: %s" % e)

        order_key = self.order_by if self.order_by is not None else 'pk'
        objects = objects.order_by(order_key)

        if USER_EMAIL_FIELD in self.fields:
            if '_user_email' in self.object_class._meta.get_all_field_names():
                raise RuntimeError("%s has already a 'user_mail' attribute")
            uuids = [getattr(obj, self.user_uuid_field) for obj in objects]
            ucache = UserCache(self.astakos_auth_url, self.astakos_token)
            ucache.fetch_names(list(set(uuids)))
            for obj in objects:
                uuid = getattr(obj, self.user_uuid_field)
                obj._user_email = ucache.get_name(uuid)

        # Special handling of DB results
        objects = list(objects)
        self.handle_db_objects(objects, **options)

        headers = self.fields
        columns = [self.FIELDS[key][0] for key in headers]

        table = []
        for obj in objects:
            row = []
            for attr in columns:
                if callable(attr):
                    row.append(attr(obj))
                else:
                    item = obj
                    attrs = attr.split(".")
                    for attr in attrs:
                        item = getattr(item, attr)
                    row.append(item)
            table.append(row)

        # Special handle of output
        self.handle_output(table, headers)

        # Print output
        output_format = options["output_format"]
        if output_format != "json" and not options["headers"]:
            headers = None
        utils.pprint_table(self.stdout, table, headers, output_format)
Exemplo n.º 5
0
    def handle(self, *args, **options):
        if len(args) > 0:
            raise CommandError("List commands do not accept any argument")

        assert(self.object_class), "object_class variable must be declared"

        # If an user field is declared, include the USER_EMAIL_FIELD in the
        # available fields
        if self.user_uuid_field is not None:
            self.FIELDS[USER_EMAIL_FIELD] =\
                ("_user_email", "The email of the owner")

        if options["list_fields"]:
            self.display_fields()
            return

        if options["list_filters"]:
            self.display_filters()
            return

        # --output option
        if options["fields"]:
            fields = options["fields"]
            fields = fields.split(",")
            self.validate_fields(fields)
            self.fields = options["fields"].split(",")

        # --display-mails option
        if options.get("display_mails"):
            self.fields.append(USER_EMAIL_FIELD)

        # --filter-by option
        if options["filter_by"]:
            try:
                filters, excludes = \
                    utils.parse_queryset_filters(options["filter_by"])
            except ValueError as e:
                raise CommandError(e)
        else:
            filters, excludes = ({}, {})

        self.filters.update(filters)
        self.excludes.update(excludes)

        # --user option
        user = options.get("user")
        if user:
            if "@" in user:
                ucache = UserCache(self.astakos_auth_url, self.astakos_token)
                user = ucache.get_uuid(user)
            self.filters[self.user_uuid_field] = user

        # --deleted option
        if self.deleted_field:
            deleted = options.get("deleted")
            if deleted:
                self.filters[self.deleted_field] = True
            else:
                self.filters[self.deleted_field] = False

        # Special handling of arguments
        self.handle_args(self, *args, **options)

        select_related = getattr(self, "select_related", [])
        prefetch_related = getattr(self, "prefetch_related", [])

        objects = self.object_class.objects
        try:
            if select_related:
                objects = objects.select_related(*select_related)
            if prefetch_related:
                objects = objects.prefetch_related(*prefetch_related)
            objects = objects.filter(**self.filters)
            for key, value in self.excludes.iteritems():
                objects = objects.exclude(**{key: value})
        except FieldError as e:
            raise CommandError(e)
        except Exception as e:
            raise CommandError("Can not filter results: %s" % e)

        order_key = self.order_by if self.order_by is not None else 'pk'
        objects = objects.order_by(order_key)

        if USER_EMAIL_FIELD in self.fields:
            if '_user_email' in self.object_class._meta.get_all_field_names():
                raise RuntimeError("%s has already a 'user_mail' attribute")
            uuids = [getattr(obj, self.user_uuid_field) for obj in objects]
            ucache = UserCache(self.astakos_auth_url, self.astakos_token)
            ucache.fetch_names(list(set(uuids)))
            for obj in objects:
                uuid = getattr(obj, self.user_uuid_field)
                obj._user_email = ucache.get_name(uuid)

        # Special handling of DB results
        objects = list(objects)
        self.handle_db_objects(objects, **options)

        headers = self.fields
        columns = [self.FIELDS[key][0] for key in headers]

        table = []
        for obj in objects:
            row = []
            for attr in columns:
                if callable(attr):
                    row.append(attr(obj))
                else:
                    item = obj
                    attrs = attr.split(".")
                    for attr in attrs:
                        item = getattr(item, attr)
                    row.append(item)
            table.append(row)

        # Special handle of output
        self.handle_output(table, headers)

        # Print output
        output_format = options["output_format"]
        if output_format != "json" and not options["headers"]:
            headers = None
        utils.pprint_table(self.stdout, table, headers, output_format)
Exemplo n.º 6
0
 def test_parse_many(self):
     res = utils.parse_queryset_filters("x=2,x>=3,y!=4,z<3")
     filters = {"x": "2", "x__gte": "3", "z__lt": "3"}
     excludes = {"y": "4"}
     self.assertEqual(res, (filters, excludes))
Exemplo n.º 7
0
 def test_parse_one(self):
     res = utils.parse_queryset_filters("x=2")
     self.assertEqual(res, ({"x": "2"}, {}))
     res = utils.parse_queryset_filters("x!=2")
     self.assertEqual(res, ({}, {"x": "2"}))
Exemplo n.º 8
0
 def test_parse_empty(self):
     res = utils.parse_queryset_filters("")
     self.assertEqual(res, ({}, {}))