def update(plan_id, values): """ .. function:: XML-RPC TestPlan.update(plan_id, values) Update the fields of the selected test plan. :param plan_id: PK of TestPlan to modify :type plan_id: int :param values: Field values for :class:`tcms.testplans.models.TestPlan` :type values: dict :return: Serialized :class:`tcms.testplans.models.TestPlan` object :rtype: dict :raises: TestPlan.DoesNotExist if object specified by PK doesn't exist :raises: PermissionDenied if missing *testplans.change_testplan* permission :raises: ValueError if validations fail """ if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') form = EditPlanForm(values) if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) test_plan = TestPlan.objects.get(pk=plan_id) if form.is_valid(): return _get_updated_test_plan(values, form, test_plan).serialize() raise ValueError(form_errors_to_list(form))
def update(plan_ids, values): """ Description: Updates the fields of the selected test plan. Params: $plan_ids - Integer: A single (or list of) TestPlan ID. $values - Hash of keys matching TestPlan fields and the new values to set each field to. +---------------------------+----------------+--------------------------------------------+ | Field | Type | Description | +---------------------------+----------------+--------------------------------------------+ | product | Integer | ID of product | | name | String | | | type | Integer | ID of plan type | | product_version | Integer | ID of version, product_version(recommend), | | (default_product_version)| | default_product_version will be deprecated | | | | in future release. | | owner | String/Integer | user_name/user_id | | parent | Integer | Parent plan ID | | is_active | Boolean | True/False | | env_group | Integer | New environment group ID | +---------------------------+-------------------------------------------------------------+ Returns: Hash: The updated test plan object. Example: # Update product to 61 for plan 207 and 208 >>> TestPlan.update([207, 208], {'product': 61}) """ from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data[ 'product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) # requested to update environment group for selected test plans if form.cleaned_data['env_group']: # prepare the list of new objects to be inserted into DB new_objects = [ TCMSEnvPlanMap( plan_id=plan_pk, group_id=form.cleaned_data['env_group'].pk ) for plan_pk in plan_ids ] # first delete the old values (b/c many-to-many I presume ?) TCMSEnvPlanMap.objects.filter(plan__in=plan_ids).delete() # then create all objects with 1 INSERT TCMSEnvPlanMap.objects.bulk_create(new_objects) else: raise ValueError(form_errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)
def update(request, plan_ids, values): """ Description: Updates the fields of the selected test plan. Params: $plan_ids - Integer: A single (or list of) TestPlan ID. $values - Hash of keys matching TestPlan fields and the new values to set each field to. +-------------------------------------------+----------------+--------------------------------------------+ | Field | Type | Description | +-------------------------------------------+----------------+--------------------------------------------+ | product | Integer | ID of product | | name | String | | | type | Integer | ID of plan type | | product_version(default_product_version) | Integer | ID of version, product_version(recommend), | | | | default_product_version will be deprecated | | | | in future release. | | owner | String/Integer | user_name/user_id | | parent | Integer | Parent plan ID | | is_active | Boolean | True/False | | env_group | Integer | New environment group ID | +-------------------------+----------------+--------------------------------------------------------------+ Returns: Hash: The updated test plan object. Example: # Update product to 61 for plan 207 and 208 >>> TestPlan.update([207, 208], {'product': 61}) """ from tcms.core import forms from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data[ 'product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) # requested to update environment group for selected test plans if form.cleaned_data['env_group']: # prepare the list of new objects to be inserted into DB new_objects = [ TCMSEnvPlanMap( plan_id=plan_pk, group_id=form.cleaned_data['env_group'].pk ) for plan_pk in plan_ids ] # first delete the old values (b/c many-to-many I presume ?) TCMSEnvPlanMap.objects.filter(plan__in=plan_ids).delete() # then create all objects with 1 INSERT TCMSEnvPlanMap.objects.bulk_create(new_objects) else: raise ValueError(forms.errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)
def update(request, plan_ids, values): """ Description: Updates the fields of the selected test plan. Params: $plan_ids - Integer: A single TestPlan ID. $values - Hash of keys matching TestPlan fields and the new values to set each field to. +-------------------------------------------+----------------+--------------------------------------------+ | Field | Type | Description | +-------------------------------------------+----------------+--------------------------------------------+ | product | Integer | ID of product | | name | String | | | type | Integer | ID of plan type | | product_version(default_product_version) | Integer | ID of version, product_version(recommend), | | | | default_product_version will be deprecated | | | | in future release. | | owner | String/Integer | user_name/user_id | | parent | Integer | Parent plan ID | | is_active | Boolean | True/False | | env_group | Integer | | +-------------------------+----------------+--------------------------------------------------------------+ Returns: Hash: The updated test plan object. Example: # Update product to 61 for plan 207 and 208 >>> TestPlan.update([207, 208], {'product': 61}) """ from tcms.core import forms from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data['product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) if form.cleaned_data['env_group']: # NOTE: MyISAM does not support transaction, so no need to use # transaction.commit_on_success to control the commit. cursor = connection.writer_cursor in_condition = ','.join(itertools.repeat('%s', len(plan_ids))) del_env_group_sql = TP_CLEAR_ENV_GROUP % in_condition cursor.execute(del_env_group_sql, plan_ids) insert_values = ','.join( itertools.repeat('(%s, %s)', len(plan_ids))) insert_env_group_sql = TP_ADD_ENV_GROUP % insert_values args = list() for arg in itertools.izip( plan_ids, itertools.repeat(form.cleaned_data['env_group'].pk, len(plan_ids))): args.extend(arg) cursor.execute(insert_env_group_sql, args) transaction.commit_unless_managed() else: raise ValueError(forms.errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)
def update(plan_id, values, **kwargs): """ .. function:: XML-RPC TestPlan.update(plan_id, values) Update the fields of the selected test plan. :param plan_id: PK of TestPlan to modify :type plan_id: int :param values: Field values for :class:`tcms.testplans.models.TestPlan` :type values: dict :return: Serialized :class:`tcms.testplans.models.TestPlan` object :rtype: dict :raises: TestPlan.DoesNotExist if object specified by PK doesn't exist :raises: PermissionDenied if missing *testplans.change_testplan* permission :raises: ValueError if validations fail """ if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') form = EditPlanForm(values) if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) tp = TestPlan.objects.get(pk=plan_id) if form.is_valid(): if form.cleaned_data['name']: tp.name = form.cleaned_data['name'] if form.cleaned_data['type']: tp.type = form.cleaned_data['type'] if form.cleaned_data['product']: tp.product = form.cleaned_data['product'] if form.cleaned_data['product_version']: tp.product_version = form.cleaned_data['product_version'] if form.cleaned_data['owner']: tp.owner = form.cleaned_data['owner'] if form.cleaned_data['parent']: tp.parent = form.cleaned_data['parent'] if values.get('is_active') is not None: tp.is_active = form.cleaned_data['is_active'] tp.save() if form.cleaned_data['text']: request = kwargs.get(REQUEST_KEY) tp.add_text( author=request.user, plan_text=values['text'], ) if form.cleaned_data['env_group']: tp.clear_env_groups() tp.add_env_group(form.cleaned_data['env_group']) else: raise ValueError(form_errors_to_list(form)) return tp.serialize()
def update(request, plan_ids, values): """Updates the fields of the selected test plan. :param plan_ids: give one or more plan IDs. It could be an integer, a string containing comma separated IDs, or a list of int each of them is a plan ID. :type plan_ids: int, str or list :param dict values: a mapping containing these plan data to update * product: (int) ID of product * name: (str) * type: (int) ID of plan type * product_version: (int) ID of version * default_product_version: (int) alternative version ID. * owner: (str)/(int) user_name/user_id * parent: (int) Parent plan ID * is_active: bool True/False * env_group: (int) New environment group ID :return: a mapping of updated :class:`TestPlan`. :rtype: dict Example:: # Update product to 7 for plan 1 and 2 TestPlan.update([1, 2], {'product': 7}) .. deprecated:: x.y ``default_product_version`` is deprecated and will be removed. """ from tcms.core import forms from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data['product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) # requested to update environment group for selected test plans if form.cleaned_data['env_group']: # prepare the list of new objects to be inserted into DB new_objects = [ TCMSEnvPlanMap(plan_id=plan_pk, group_id=form.cleaned_data['env_group'].pk) for plan_pk in plan_ids ] # first delete the old values (b/c many-to-many I presume ?) TCMSEnvPlanMap.objects.filter(plan__in=plan_ids).delete() # then create all objects with 1 INSERT TCMSEnvPlanMap.objects.bulk_create(new_objects) else: raise ValueError(forms.errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)
def update(request, plan_ids, values): """Updates the fields of the selected test plan. :param plan_ids: give one or more plan IDs. It could be an integer, a string containing comma separated IDs, or a list of int each of them is a plan ID. :type plan_ids: int, str or list :param dict values: a mapping containing these plan data to update * product: (int) ID of product * name: (str) * type: (int) ID of plan type * product_version: (int) ID of version * default_product_version: (int) alternative version ID. * owner: (str)/(int) user_name/user_id * parent: (int) Parent plan ID * is_active: bool True/False * env_group: (int) New environment group ID :return: a mapping of updated :class:`TestPlan`. :rtype: dict Example:: # Update product to 7 for plan 1 and 2 >>> TestPlan.update([1, 2], {'product': 7}) .. deprecated:: x.y ``default_product_version`` is deprecated and will be removed. """ from tcms.core import forms from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data[ 'product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) # requested to update environment group for selected test plans if form.cleaned_data['env_group']: # prepare the list of new objects to be inserted into DB new_objects = [ TCMSEnvPlanMap( plan_id=plan_pk, group_id=form.cleaned_data['env_group'].pk ) for plan_pk in plan_ids ] # first delete the old values (b/c many-to-many I presume ?) TCMSEnvPlanMap.objects.filter(plan__in=plan_ids).delete() # then create all objects with 1 INSERT TCMSEnvPlanMap.objects.bulk_create(new_objects) else: raise ValueError(forms.errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)
def update(request, plan_ids, values): """ Description: Updates the fields of the selected test plan. Params: $plan_ids - Integer: A single TestPlan ID. $values - Hash of keys matching TestPlan fields and the new values to set each field to. +-------------------------------------------+----------------+--------------------------------------------+ | Field | Type | Description | +-------------------------------------------+----------------+--------------------------------------------+ | product | Integer | ID of product | | name | String | | | type | Integer | ID of plan type | | product_version(default_product_version) | Integer | ID of version, product_version(recommend), | | | | default_product_version will be deprecated | | | | in future release. | | owner | String/Integer | user_name/user_id | | parent | Integer | Parent plan ID | | is_active | Boolean | True/False | | env_group | Integer | | +-------------------------+----------------+--------------------------------------------------------------+ Returns: Hash: The updated test plan object. Example: # Update product to 61 for plan 207 and 208 >>> TestPlan.update([207, 208], {'product': 61}) """ from tcms.core import forms from tcms.xmlrpc.forms import EditPlanForm if values.get('default_product_version'): values['product_version'] = values.pop('default_product_version') form = EditPlanForm(values) if values.get('product_version') and not values.get('product'): raise ValueError('Field "product" is required by product_version') if values.get('product') and not values.get('product_version'): raise ValueError('Field "product_version" is required by product') if values.get('product_version') and values.get('product'): form.populate(product_id=values['product']) plan_ids = pre_process_ids(value=plan_ids) tps = TestPlan.objects.filter(pk__in=plan_ids) if form.is_valid(): _values = dict() if form.cleaned_data['name']: _values['name'] = form.cleaned_data['name'] if form.cleaned_data['type']: _values['type'] = form.cleaned_data['type'] if form.cleaned_data['product']: _values['product'] = form.cleaned_data['product'] if form.cleaned_data['product_version']: _values['product_version'] = form.cleaned_data[ 'product_version'] if form.cleaned_data['owner']: _values['owner'] = form.cleaned_data['owner'] if form.cleaned_data['parent']: _values['parent'] = form.cleaned_data['parent'] if not (values.get('is_active') is None): _values['is_active'] = form.cleaned_data['is_active'] tps.update(**_values) if form.cleaned_data['env_group']: # NOTE: MyISAM does not support transaction, so no need to use # transaction.commit_on_success to control the commit. cursor = connection.writer_cursor in_condition = ','.join(itertools.repeat('%s', len(plan_ids))) del_env_group_sql = TP_CLEAR_ENV_GROUP % in_condition cursor.execute(del_env_group_sql, plan_ids) insert_values = ','.join(itertools.repeat('(%s, %s)', len(plan_ids))) insert_env_group_sql = TP_ADD_ENV_GROUP % insert_values args = list() for arg in itertools.izip(plan_ids, itertools.repeat(form.cleaned_data['env_group'].pk, len(plan_ids))): args.extend(arg) cursor.execute(insert_env_group_sql, args) transaction.commit_unless_managed() else: raise ValueError(forms.errors_to_list(form)) query = {'pk__in': tps.values_list('pk', flat=True)} return TestPlan.to_xmlrpc(query)