diff --git a/main/lib/idds/core/requests.py b/main/lib/idds/core/requests.py index b96068ad..71f865f8 100644 --- a/main/lib/idds/core/requests.py +++ b/main/lib/idds/core/requests.py @@ -327,7 +327,11 @@ def update_request_with_transforms(request_id, parameters, work = tf['transform_metadata']['work'] tf_copy = copy.deepcopy(tf) - tf_id = orm_transforms.add_transform(**tf_copy, session=session) + ret_tf = orm_transforms.get_transform_by_name(request_id=request_id, name=tf['name'], session=session) + if ret_tf is None: + tf_id = orm_transforms.add_transform(**tf_copy, session=session) + else: + tf_id = ret_tf['transform_id'] tf['transform_id'] = tf_id # work = tf['transform_metadata']['work'] diff --git a/main/lib/idds/orm/transforms.py b/main/lib/idds/orm/transforms.py index 43cccd7b..19c1ab70 100644 --- a/main/lib/idds/orm/transforms.py +++ b/main/lib/idds/orm/transforms.py @@ -245,6 +245,35 @@ def get_transform_by_id_status(transform_id, status=None, locking=False, session raise exceptions.NoObject('transform transform_id: %s cannot be found: %s' % (transform_id, error)) +@read_session +def get_transform_by_name(request_id, name, session=None): + """ + Get a transform or raise a NoObject exception. + + :param request_id: The request id. + :param name: transform name. + :param locking: the locking status. + + :param session: The database session in use. + + :raises NoObject: If no request is founded. + + :returns: Transform. + """ + + try: + query = select(models.Transform).where(models.Transform.request_id == request_id) + query = query.where(models.Transform.name == name) + + ret = session.execute(query).fetchone() + if not ret: + return None + else: + return ret[0].to_dict() + except sqlalchemy.orm.exc.NoResultFound as error: + raise exceptions.NoObject(f'transform (request_id: {request_id}, name: {name}) cannot be found: {error}') + + @read_session def get_transforms_with_input_collection(transform_type, transform_tag, coll_scope, coll_name, to_json=False, session=None): """