Uploads a *jterator* project.

        Parameters
        ----------
        pipeline: dict
            description of the jterator pipeline
        handles: dict, optional
            description of each module in the jterator pipeline

        See also
        --------
        :func:`tmserver.api.workflow.update_jterator_project`
        :class:`tmlib.workflow.jterator.description.PipelineDescription`
        :class:`tmlib.workflow.jterator.description.HandleDescriptions`

def upload_jterator_project(self, pipeline, handles):
        '''Uploads a *jterator* project.

        Parameters
        ----------
        pipeline: dict
            description of the jterator pipeline
        handles: dict, optional
            description of each module in the jterator pipeline

        See also
        --------
        :func:`tmserver.api.workflow.update_jterator_project`
        :class:`tmlib.workflow.jterator.description.PipelineDescription`
        :class:`tmlib.workflow.jterator.description.HandleDescriptions`
        '''
        logger.info(
            'upload jterator project for experiment "%s"', self.experiment_name
        )
        content = {
            'pipeline': pipeline,
            'handles': handles
        }
        url = self._build_api_url(
            '/experiments/{experiment_id}/workflow/jtproject'.format(
                experiment_id=self._experiment_id
            )
        )
        res = self._session.put(url, json=content)
        res.raise_for_status()