def create(self, validated_data): if not (validated_data.get("label_set") or validated_data.get("project_id")): raise serializers.ValidationError('Label set or project_id must be present') if validated_data.get("label_set") and validated_data.get("project_id"): raise serializers.ValidationError('Project must have only one of Label set or project_id') labels = validated_data.pop('label_set', []) db_task = models.Task.objects.create(**validated_data) label_names = list() for label in labels: attributes = label.pop('attributespec_set') if not label.get('color', None): label['color'] = get_label_color(label['name'], label_names) label_names.append(label['name']) db_label = models.Label.objects.create(task=db_task, **label) for attr in attributes: models.AttributeSpec.objects.create(label=db_label, **attr) task_path = db_task.get_task_dirname() if os.path.isdir(task_path): shutil.rmtree(task_path) os.makedirs(db_task.get_task_logs_dirname()) os.makedirs(db_task.get_task_artifacts_dirname()) db_task.save() return db_task
def create(self, validated_data): labels = validated_data.pop('label_set') training_data = validated_data.pop('training_project', {}) if training_data.get('enabled'): host = training_data.pop('host').strip('/') username = training_data.pop('username').strip() password = training_data.pop('password').strip() tr_p = models.TrainingProject.objects.create(**training_data, host=host, username=username, password=password) db_project = models.Project.objects.create(**validated_data, training_project=tr_p) else: db_project = models.Project.objects.create(**validated_data) label_names = list() for label in labels: attributes = label.pop('attributespec_set') if not label.get('color', None): label['color'] = get_label_color(label['name'], label_names) label_names.append(label['name']) db_label = models.Label.objects.create(project=db_project, **label) for attr in attributes: models.AttributeSpec.objects.create(label=db_label, **attr) project_path = db_project.get_project_dirname() if os.path.isdir(project_path): shutil.rmtree(project_path) os.makedirs(db_project.get_project_logs_dirname()) return db_project
def update_instance(validated_data, parent_instance): attributes = validated_data.pop('attributespec_set', []) instance = dict() if isinstance(parent_instance, models.Project): instance['project'] = parent_instance logger = slogger.project[parent_instance.id] else: instance['task'] = parent_instance logger = slogger.task[parent_instance.id] if not validated_data.get('id') is None: try: db_label = models.Label.objects.get(id=validated_data['id'], **instance) except models.Label.DoesNotExist: raise exceptions.NotFound( detail='Not found label with id #{} to change'.format( validated_data['id'])) db_label.name = validated_data.get('name', db_label.name) logger.info("{}({}) label was updated".format( db_label.name, db_label.id)) else: db_label = models.Label.objects.create( name=validated_data.get('name'), **instance) logger.info("New {} label was created".format(db_label.name)) if validated_data.get('deleted') == True: db_label.delete() return if not validated_data.get('color', None): label_names = [ l.name for l in instance[tuple(instance.keys())[0]].label_set.exclude( id=db_label.id).order_by('id') ] db_label.color = get_label_color(db_label.name, label_names) else: db_label.color = validated_data.get('color', db_label.color) db_label.save() for attr in attributes: (db_attr, created) = models.AttributeSpec.objects.get_or_create( label=db_label, name=attr['name'], defaults=attr) if created: logger.info("New {} attribute for {} label was created".format( db_attr.name, db_label.name)) else: logger.info("{} attribute for {} label was updated".format( db_attr.name, db_label.name)) # FIXME: need to update only "safe" fields db_attr.default_value = attr.get('default_value', db_attr.default_value) db_attr.mutable = attr.get('mutable', db_attr.mutable) db_attr.input_type = attr.get('input_type', db_attr.input_type) db_attr.values = attr.get('values', db_attr.values) db_attr.save()
def alter_label_colors(apps, schema_editor): Label = apps.get_model('engine', 'Label') Task = apps.get_model('engine', 'Task') for task in Task.objects.all(): labels = Label.objects.filter(task_id=task.id).order_by('id') label_names = list() for label in labels: label.color = get_label_color(label.name, label_names) label_names.append(label.name) label.save()
def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.owner = validated_data.get('owner', instance.owner) instance.assignee = validated_data.get('assignee', instance.assignee) instance.bug_tracker = validated_data.get('bug_tracker', instance.bug_tracker) instance.z_order = validated_data.get('z_order', instance.z_order) instance.project = validated_data.get('project', instance.project) labels = validated_data.get('label_set', []) for label in labels: attributes = label.pop('attributespec_set', []) (db_label, created) = models.Label.objects.get_or_create(task=instance, name=label['name']) if created: slogger.task[instance.id].info( "New {} label was created".format(db_label.name)) else: slogger.task[instance.id].info("{} label was updated".format( db_label.name)) if not label.get('color', None): label_names = [ l.name for l in models.Label.objects.filter( task_id=instance.id).exclude( id=db_label.id).order_by('id') ] db_label.color = get_label_color(db_label.name, label_names) else: db_label.color = label.get('color', db_label.color) db_label.save() for attr in attributes: (db_attr, created) = models.AttributeSpec.objects.get_or_create( label=db_label, name=attr['name'], defaults=attr) if created: slogger.task[instance.id].info( "New {} attribute for {} label was created".format( db_attr.name, db_label.name)) else: slogger.task[instance.id].info( "{} attribute for {} label was updated".format( db_attr.name, db_label.name)) # FIXME: need to update only "safe" fields db_attr.default_value = attr.get('default_value', db_attr.default_value) db_attr.mutable = attr.get('mutable', db_attr.mutable) db_attr.input_type = attr.get('input_type', db_attr.input_type) db_attr.values = attr.get('values', db_attr.values) db_attr.save() instance.save() return instance
def update_instance(validated_data, parent_instance): attributes = validated_data.pop('attributespec_set', []) instance = dict() if isinstance(parent_instance, models.Project): instance['project'] = parent_instance logger = slogger.project[parent_instance.id] else: instance['task'] = parent_instance logger = slogger.task[parent_instance.id] (db_label, created) = models.Label.objects.get_or_create( name=validated_data['name'], **instance) if created: logger.info("New {} label was created".format(db_label.name)) else: logger.info("{} label was updated".format(db_label.name)) if not validated_data.get('color', None): label_names = [ l.name for l in instance[tuple(instance.keys())[0]].label_set.exclude( id=db_label.id).order_by('id') ] db_label.color = get_label_color(db_label.name, label_names) else: db_label.color = validated_data.get('color', db_label.color) db_label.save() for attr in attributes: (db_attr, created) = models.AttributeSpec.objects.get_or_create( label=db_label, name=attr['name'], defaults=attr) if created: logger.info("New {} attribute for {} label was created".format( db_attr.name, db_label.name)) else: logger.info("{} attribute for {} label was updated".format( db_attr.name, db_label.name)) # FIXME: need to update only "safe" fields db_attr.default_value = attr.get('default_value', db_attr.default_value) db_attr.mutable = attr.get('mutable', db_attr.mutable) db_attr.input_type = attr.get('input_type', db_attr.input_type) db_attr.values = attr.get('values', db_attr.values) db_attr.save()
def create(self, validated_data): labels = validated_data.pop('label_set') db_project = models.Project.objects.create(**validated_data) label_names = list() for label in labels: attributes = label.pop('attributespec_set') if not label.get('color', None): label['color'] = get_label_color(label['name'], label_names) label_names.append(label['name']) db_label = models.Label.objects.create(project=db_project, **label) for attr in attributes: models.AttributeSpec.objects.create(label=db_label, **attr) project_path = db_project.get_project_dirname() if os.path.isdir(project_path): shutil.rmtree(project_path) os.makedirs(db_project.get_project_logs_dirname()) db_project.save() return db_project