def filter_queryset(self, request, queryset, view): try: types = None for key, value in request.query_params.items(): if key == 'type': if ',' in value: types = value.split(',') else: types = (value, ) if types: types_map = {} for ct in ContentType.objects.filter( Q(app_label='main') | Q(app_label='auth', model='user')): ct_model = ct.model_class() if not ct_model: continue ct_type = get_type_for_model(ct_model) types_map[ct_type] = ct.pk model = queryset.model model_type = get_type_for_model(model) if 'polymorphic_ctype' in get_all_field_names(model): types_pks = set( [v for k, v in types_map.items() if k in types]) queryset = queryset.filter( polymorphic_ctype_id__in=types_pks) elif model_type in types: queryset = queryset else: queryset = queryset.none() return queryset except FieldError as e: # Return a 400 for invalid field names. raise ParseError(*e.args)
def start_task(self, task, dependent_tasks=[]): from cyborgbackup.main.tasks import handle_work_error, handle_work_success task_actual = { 'type': get_type_for_model(type(task)), 'id': task.id, } dependencies = [{'type': get_type_for_model(type(t)), 'id': t.id} for t in dependent_tasks] error_handler = handle_work_error.s(subtasks=[task_actual] + dependencies) success_handler = handle_work_success.s(task_actual=task_actual) task.status = 'waiting' (start_status, opts) = task.pre_start() if not start_status: task.status = 'failed' if task.job_explanation: task.job_explanation += ' ' task.job_explanation += 'Task failed pre-start check.' task.save() # TODO: run error handler to fail sub-tasks and send notifications else: logger.info('Submitting %s to instance group cyborgbackup.', task.log_format) with disable_activity_stream(): task.celery_task_id = str(uuid.uuid4()) task.save() self.consume_capacity(task, 'cyborgbackup') def post_commit(): task.websocket_emit_status(task.status) if task.status != 'failed': task.start_celery_task(opts, error_callback=error_handler, success_callback=success_handler, queue='cyborgbackup') connection.on_commit(post_commit)
def get_summary_fields(self, obj): # Return values for certain fields on related objects, to simplify # displaying lists of items without additional API requests. summary_fields = OrderedDict() for fk, related_fields in SUMMARIZABLE_FK_FIELDS.items(): try: fkval = getattr(obj, fk, None) if fkval is None: continue if fkval == obj: continue summary_fields[fk] = OrderedDict() for field in related_fields: if (self.version < 2 and field == 'credential_type_id' and fk in ['credential', 'vault_credential']): continue fval = getattr(fkval, field, None) if fval is None and field == 'type': if isinstance(fkval, PolymorphicModel): fkval = fkval.get_real_instance() fval = get_type_for_model(fkval) if fval is not None: summary_fields[fk][field] = fval # Can be raised by the reverse accessor for a OneToOneField. except ObjectDoesNotExist: pass if getattr(obj, 'created_by', None): summary_fields['created_by'] = OrderedDict() for field in SUMMARIZABLE_FK_FIELDS['user']: summary_fields['created_by'][field] = getattr( obj.created_by, field) if getattr(obj, 'modified_by', None): summary_fields['modified_by'] = OrderedDict() for field in SUMMARIZABLE_FK_FIELDS['user']: summary_fields['modified_by'][field] = getattr( obj.modified_by, field) return summary_fields
def log_format(self): return '{} {} ({})'.format(get_type_for_model(type(self)), self.id, self.status)
def get_type(self, obj): return get_type_for_model(self.Meta.model)