def __init__(self): self.images = {} usercache = UserCache(settings.ASTAKOS_AUTH_URL, settings.CYCLADES_SERVICE_TOKEN) self.system_user_uuid = \ usercache.get_uuid(settings.SYSTEM_IMAGES_OWNER)
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)
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)