def assign(contract_id, flow_id, user_id): '''Assign a contract to an admin or a conductor ''' contract = ContractBase.query.get(contract_id) try: stages = create_contract_stages(flow_id, contract_id, contract=contract) _, contract, _ = transition_stage(contract_id, contract=contract, stages=stages) except IntegrityError, e: # we already have the sequence for this, so just # rollback and pass db.session.rollback() pass
def assign_a_contract(contract, flow, user, clone=True): # if we don't have a flow, stop and throw an error if not flow: return False # if the contract is already assigned, # resassign it and continue on if contract.assigned_to and not contract.completed_last_stage(): contract.assigned_to = user.id db.session.commit() current_app.logger.info('CONDUCTOR ASSIGN - old contract "{}" assigned to {} with flow {}'.format( contract.description, contract.assigned.email, contract.flow.flow_name )) return contract # otherwise, it's new work. perform the following: # 1. create a cloned version of the contract # 2. create the relevant contract stages # 3. transition into the first stage # 4. assign the contract to the user else: if clone: contract = ContractBase.clone(contract) db.session.add(contract) db.session.commit() try: stages, _, _ = create_contract_stages(flow.id, contract.id, contract=contract) actions = contract.transition(user) for i in actions: db.session.add(i) db.session.flush() except IntegrityError: # we already have the sequence for this, so just # rollback and pass db.session.rollback() pass contract.assigned_to = user.id db.session.commit() current_app.logger.info('CONDUCTOR ASSIGN - new contract "{}" assigned to {} with flow {}'.format( contract.description, contract.assigned.email, contract.flow.flow_name )) return contract