def patch(self, request, *args, **kwargs): project = self.get_object() label_config = self.request.query_params.get('label_config') # config changes can break view, so we need to reset them if parse_config(label_config) != parse_config(project.label_config): View.objects.filter(project=project).all().delete() return super(ProjectAPI, self).patch(request, *args, **kwargs)
def get(self, request, *args, **kwargs): project = self.get_object() label_config = self.request.query_params.get('label_config') # check new config includes meaningful changes config_essential_data_has_changed = False if parse_config(label_config) != parse_config(project.label_config): config_essential_data_has_changed = True project.validate_config(label_config) return Response({'config_essential_data_has_changed': config_essential_data_has_changed}, status=status.HTTP_200_OK)
def config_essential_data_has_changed(cls, new_config_str, old_config_str): new_config = parse_config(new_config_str) old_config = parse_config(old_config_str) for tag, new_info in new_config.items(): if tag not in old_config: return True old_info = old_config[tag] if new_info['type'] != old_info['type']: return True if new_info['inputs'] != old_info['inputs']: return True if not set(old_info['labels']).issubset(new_info['labels']): return True
def get_updated_weights(self): outputs = parse_config(self.label_config) control_weights = {} exclude_control_types = ('Filter',) for control_name in outputs: control_type = outputs[control_name]['type'] if control_type in exclude_control_types: continue control_weights[control_name] = { 'overall': 1.0, 'type': control_type, 'labels': {label: 1.0 for label in outputs[control_name].get('labels', [])} } return control_weights
def get_parsed_config(self): return parse_config(self.label_config)
def get_control_tags_from_config(self): return parse_config(self.label_config)