def getSubJobs(self):
     """
     gets the list of subjobs (along with their status)
     @return: subjobs list of dictionaries
     @rtype: dictionary
     """
     endpointUrl = self.endpoint + "/job_subjobs.py"
     requestDict = {}
     requestDict['jobId'] = self.jobId
     response = self._remoteRequest(endpointUrl, requestDict)
     rv= []
     if response:
         for job_entry in response:
             if job_entry.has_key('jobSortDate'):
                 jobDate = time.strptime(job_entry['jobSortDate'],"%Y%m%d%H%M%S")
             if job_entry.has_key('status'):
                 jobstatus = Status(string=job_entry['status'], message=job_entry.get('status_message'))
             jobID = job_entry['url']
             jobPID = self.server.name + '.' + job_entry['jobID']
             serviceName = job_entry['programName']
             rv.append({'jobID':jobID,
                             'jobPID':jobPID,
                             'userName':jobID,
                             'programName':serviceName,
                             'date':jobDate,
                             'status':jobstatus,
                             'owner':registry.getJobPID(self.jobId)
                             })
     return rv
 def create(self, request_fs=None, request_dict=None, session=None):
     """
     create sets up most of the class attributes TODO: check if this could be done in __init__?
     """
     self.request = {}
     if request_dict:
         self.request = request_dict
     elif request_fs:
         for key in request_fs.keys():
             self.request[key] = request_fs.getvalue(key)
     self.email = self.request.get('email', None)
     if not(self.email) and session:
         self.email = session.getEmail()
     self.parseService()
     if ( not( self.email ) and not( _cfg.opt_email( self.servicePID ) ) ):
         return {"emailNeeded":"true"}
     if (session and not(session.isActivated())):
         return {"activationNeeded":"true"}                
     self.params = {}
     self.session = session
     self._processForm()
     resp = self.submit(session)
     if resp.has_key('id'):
         self.jobId = resp['id']
         resp['pid'] = str(registry.getJobPID(resp['id']))
     # log the job in the access log
     if not(resp.has_key('errormsg')):
         msg = "%s %s %s %s %s" % (self.servicePID, # service PID
                                           resp.get('pid','').replace(self.servicePID+'.',''), #job key
                                           str(self.email), # user email
                                           os.environ.get('REMOTE_HOST',os.environ.get('REMOTE_ADDR','local')), # ip or host
                                           os.environ.get('HTTP_X_MOBYLEPORTALNAME','unknown') # client portal
                                           )
         acc_log.info( msg )
     return resp
 def submit(self, session=None):
     """
     submits the job on the local server
     @param session: the session used to load infile values
     @type session: Mobyle.Session
     @return: job information as a dictionary
     @rtype: dictionary
     """
     try:
         if isinstance(self.service, Program):
             self.job = MobyleJob( service    = self.service , 
                                   email      = self.email,
                                   session    = session,
                                   workflowID = self.workflowId)
         elif isinstance(self.service, Workflow):
             self.job = WorkflowJob( workflow   = self.service,
                                     email      = self.email,
                                     session    = session,
                                     workflowID = self.workflowId)
         else:
             raise NotImplementedError("No Job can be instanciated for a %s service" % str(self.service.__class__))
         for name, param in self.params.items():
             if param['parameter'].isInfile():
                 if param['src']:
                     param['src'] = DataProvider.get(param['src'])
                     self.job.setValue(name, (param['userName'], None, param['src'], param['srcFileName']))      
                 else:
                     self.job.setValue(name, (param['userName'], param['value'], None, None))      
             else:
                 if param['parameter'].getDataType().getName() == 'MultipleChoice': 
                     from types import StringTypes
                     if isinstance(  param['value'] , StringTypes ):
                         param['value'] = [ param['value'] ]
                 self.job.setValue(name, param['value'])
         # run Job
         self.job.run()
         return {
                 'id': str(self.job.getJobid()),
                 'date':str(time.strftime( "%x  %X", self.job.getDate())),
                 'status': str( self.job.getStatus() ),
                 }
     except UserValueError, e:
         if hasattr(e, 'message') and e.message:
             msg = {'errormsg':str(e.message)}
         else:
             msg = {'errormsg':str(e)}
         if hasattr(self, 'job') and self.job:
             jobId = self.job.getJobid()
             msg['id'] = str(jobId)
         if hasattr(e, 'param') and e.param:
             msg["errorparam"] = e.param.getName()
         if jobId:
             pid_str = str(registry.getJobPID(jobId))
         else:
             pid_str = "none"
         j_log.error("user error in job %s (email %s): %s"% (pid_str, getattr(self,"email","anonymous"),str(e)))
         return msg
 def getSubJobs(self):
     """
     gets the list of subjobs (along with their status)
     @return: subjobs list of dictionaries
     @rtype: list
     """
     js = JobState(self.jobId)
     if hasattr(js, 'getSubJobs'):
         subjobs = js.getSubJobs()
         subsubjobs = []
         for s in subjobs:
             s['jobPID'] = registry.getJobPID(self.jobId) + '::'+ registry.getJobPID(s['jobID'])
             child_jf = JobFacade.getFromJobId(s['jobID'])
             s['status'] = child_jf.getStatus()
             for ss in child_jf.getSubJobs():
                 ss['jobPID'] = s['jobPID'] + '::' + registry.getJobPID(ss['jobID'])
                 schild_jf = JobFacade.getFromJobId(ss['jobID'])
                 ss['status'] = schild_jf.getStatus() 
                 subsubjobs.append(ss)                   
         subjobs.extend(subsubjobs)
         return subjobs
     else:
         return []