public function postSubmitFinal($ordersandbox = 'order') { $batch = unserialize(Session::get('batch')); $batchColumnsNewTemplate = array(); $batchColumnsExtraChosenTemplate = array(); $associationsTemplBatch = array(); $ownTemplate = false; // Use existing job configuration content (if available) if (!($jc = unserialize(Session::get('jobconf')))) { $jc = new JobConfiguration(); $jc->documentType = "jobconf"; $jcco = array(); } else { $jcco = $jc->content; } $own = false; if (Input::has('templateTypeOwn') && strlen(Input::get('templateTypeOwn')) > 0) { $jcco['type'] = Input::get('templateTypeOwn'); $batchColumns = Input::get('batchColumns'); $newNamesForBatchColumns = Input::get('newcolnames'); $newNamesForBatchColumnsArray = explode(",", $newNamesForBatchColumns); array_pop($newNamesForBatchColumnsArray); if ($batchColumns == null) { return Redirect::back()->with('flashError', "You did not choose the batch columns"); } else { foreach ($newNamesForBatchColumnsArray as $value) { $oldNewArray = explode(" - ", $value); if (in_array($oldNewArray[0], $batchColumns)) { $batchColumnsNewTemplate[$oldNewArray[0]] = $oldNewArray[1]; } } } $ownTemplate = true; $own = true; } else { $jcco['type'] = Input::get('templateType'); if ($jcco['type'] == null) { return Redirect::back()->with('flashError', "You did not fill in the type of the template"); } // Get selected, newest template $jcbase = $this->findNewestTemplate($jcco['type'], $batch->format); if ($jcbase == null) { Session::flash('flashError', "template not found"); return Redirect::to("jobs2/submit"); } if (!isset($jcbase['cml'])) { // Template must have CML field Session::flash('flashError', "No template details in this template"); return Redirect::to("jobs2/submit"); } $batchColumnsExtraChosenTemplate = Input::get('addMoreColumns'); $fieldsInChosenTemplate = Input::get('tempFields'); $arrayFields = explode(",", $fieldsInChosenTemplate); foreach ($arrayFields as $field) { $association = Input::get($field); array_push($associationsTemplBatch, $field . " - " . $association); if ($association == null || $association == "---") { return Redirect::back()->with('flashError', "You did not fill in all the associations for the template fields"); } } $jcco['cml'] = $jcbase['cml']; if (isset($jcbase['css'])) { $jcco['css'] = $jcbase['css']; } if (isset($jcbase['instructions'])) { $jcco['instructions'] = $jcbase['instructions']; } if (isset($jcbase['js'])) { $jcco['js'] = $jcbase['js']; } $jcco['template_id'] = $jcbase['_id']; } if (Input::has('titleOwn') && strlen(Input::get('titleOwn')) > 0) { $jcco['title'] = Input::get('titleOwn'); } else { $jcco['title'] = Input::get('title'); } if ($jcco['title'] == null) { return Redirect::back()->with('flashError', "You did not fill in the title of the template"); } // TODO: dynamically load available platforms (in case more than cf are available). // At the moment this will work for CF2 and DrDetective but it is not flexible if (isset($jcbase['platform'])) { $jcco['platform'] = [$jcbase['platform']]; } else { $jcco['platform'] = ["cf2"]; $jcco['title'] = $jcco['title'] . "[[" . $jcco['type'] . "(" . $batch->_id . ", " . $batch->domain . ", " . $batch->format . ")]]"; } $jcco['description'] = Input::get('description'); ///////// PUT $jc->content = $jcco; if ($own) { $_tt = \MongoDB\Template::where('type', $jcco['type'])->where("format", $batch->format)->first(); if (isset($_tt)) { Session::flash('flashError', "There is already a template of this type. Please rename (or select this template from dropdown list."); return Redirect::to("jobs2/submit"); } } try { // Save activity $activity = new MongoDB\Activity(); $activity->label = "Job is uploaded to crowdsourcing platform."; $activity->softwareAgent_id = 'jobcreator'; // JOB softwareAgent_id = $platform. Does this need to be the same? $activity->save(); // Save jobconf if necessary $hash = md5(serialize($jc->content)); if ($existingid = JobConfiguration::where('hash', $hash)->pluck('_id')) { //[qq] $jcid = $existingid; // Don't save, it already exists. } else { $jc->format = $batch->format; $jc->domain = $batch->domain; $jc->project = $batch->project; $jc->user_id = $batch->user_id; $jc->softwareAgent_id = $activity->softwareAgent_id; $jc->hash = $hash; $jc->activity_id = $activity->_id; $jc->save(); $jcid = $jc->_id; } // Software Agent ID which will perform the job // TODO: Fix this -- choose one of the possibly many platforms in $jcco // at the moment we are picking the first arbitrarily $job_sw_agent = $jcco['platform'][0]; // Publish jobs $j = new Job(); $j->format = $batch->format; $j->project = $batch->project; $j->domain = $batch->domain; $j->user_id = $batch->user_id; $j->type = $jc->content['type']; $j->batch_id = $batch->_id; $j->jobConf_id = $jcid; $j->softwareAgent_id = $job_sw_agent; $j->activity_id = $activity->_id; $j->iamemptyjob = "yes"; $extraInfoBatch = array(); $extraInfoBatch["batchColumnsNewTemplate"] = $batchColumnsNewTemplate; $extraInfoBatch["batchColumnsExtraChosenTemplate"] = $batchColumnsExtraChosenTemplate; $extraInfoBatch["associationsTemplBatch"] = $associationsTemplBatch; $extraInfoBatch["ownTemplate"] = $ownTemplate; $j->extraInfoBatch = $extraInfoBatch; $j->save(); //convert to publish later $j->publish($ordersandbox == 'sandbox' ? true : false); $jobs[] = $j; $successmessage = "Created job with jobConf :-)"; $platform = App::make($job_sw_agent); $platform->refreshJob($j->_id); Session::flash('flashSuccess', $successmessage); return Redirect::to("jobs"); } catch (Exception $e) { // Undo creation and delete jobs // if(isset($jobs)) // foreach($jobs as $j){ // if(isset($j->platformJobId)) // $j->undoCreation($j->platformJobId); // $j->forceDelete(); // } //delete activity if (isset($j)) { $j->forceDelete(); } if (isset($jc)) { $jc->forceDelete(); } if ($activity) { $activity->forceDelete(); } throw $e; //for debugging Session::flash('flashError', $e->getMessage()); return Redirect::to("jobs2/submit"); } }
public function getHit($id) { $turk = new CrowdTruth\Mturk\Turkapi\MechanicalTurk('https://mechanicalturk.amazonaws.com/', false, Config::get('mturk::accesskey'), Config::get('mturk::secretkey')); //$hit = $turk->getHIT($id); //dd($hit); //dd($turk->getAssignmentsForHIT($id)); //echo json_encode($hit, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); // Create activity: annotate $activity = new \MongoDB\Activity(); $activity->label = "Imported job from AMT."; $activity->softwareAgent_id = 'amt'; $activity->save(); $f = fopen(base_path() . '/public/csv/AMT_HITIds.csv', 'r'); $array = array(); $keys = fgetcsv($f); while (!feof($f)) { $array[] = @array_combine($keys, fgetcsv($f)); } foreach ($array as $row) { set_time_limit(360); $id = $row['HITId']; $type = $row['Task']; $existing = \Workerunit::where('hitId', $id)->first(); if (isset($existing)) { continue; } $hit = $turk->getHIT($id); $h = $hit->toArray(); $jobId = isset($h['RequesterWorkerunit']) ? $h['RequesterWorkerunit'] : 'unknown'; //$job->_id; /* //Do this once: if(empty($job->Expiration)) $job->Expiration = new MongoDate(strtotime($h['Expiration'])); if(empty($job->HITGroupId)) $job->HITGroupId = $h['HITGroupId']; if(empty($job->HITTypeId)) $job->HITTypeId = $h['HITTypeId'];*/ // Convert status to our language if ($h['HITStatus'] == 'Assignable' or $h['HITStatus'] == 'Unassignable') { //and ($job->Expiration->sec > time())) // Not yet expired. TODO: Timezones $newstatus = 'running'; } elseif ($h['HITStatus'] == 'Reviewable' or $h['HITStatus'] == 'Reviewing') { $newstatus = 'review'; } elseif ($h['HITStatus'] == 'Disposed') { $newstatus = 'deleted'; } $newplatformhitid[] = array('id' => $id, 'status' => $newstatus); // todo: IF each is disposed, newstatus = deleted. // Get Assignments. $assignments = $turk->getAssignmentsForHIT($id); print 'Got ' . count($assignments) . " Assignments for {$id}\n"; foreach ($assignments as $ass) { $assignment = $ass->toArray(); $workerunit = Workerunit::where('job_id', $jobId)->where('platformWorkerunitId', $assignment['AssignmentId'])->first(); //print_r($workerunits); die(); if ($workerunit) { $annoldstatus = $workerunit['status']; $annnewstatus = $assignment['AssignmentStatus']; if ($annoldstatus != $annnewstatus) { $workerunit->status = $annnewstatus; $workerunit->update(); print "Status '{$annoldstatus}' changed to '{$annnewstatus}'."; Log::debug("Status of Workerunit {$workerunit->_id} changed from {$annoldstatus} to {$annnewstatus}"); } } else { // ASSIGNMENT entity not in DB: create activity, entity and refer to or create agent. // Create or retrieve Agent $workerId = $assignment['WorkerId']; if (!($agentId = MongoDB\CrowdAgent::where('platformAgentId', $workerId)->where('softwareAgent_id', 'amt')->pluck('_id'))) { $agent = new MongoDB\CrowdAgent(); $agent->_id = "crowdagent/amt/{$workerId}"; $agent->softwareAgent_id = 'amt'; $agent->platformAgentId = $workerId; $agent->save(); $agentId = "crowdagent/amt/{$workerId}"; } /* $groupedbyid = array(); foreach ($assignment['Answer'] as $q=>$ans){ // Retrieve the unitID and the QuestionId from the name of the input field. $split = strpos($q, "_"); $unitid = substr($q, 0, $split); // before the first _ $qid = substr($q, $split+1); // after the first _ $groupedbyid[$unitid][$qid] = $ans;// grouped to create an entity for every ID. } // Create entity FOR EACH UNIT foreach($groupedbyid as $uid=>$qidansarray){ */ $workerunit = new Workerunit(); $workerunit->activity_id = $activity->_id; $workerunit->type = $type; $workerunit->crowdAgent_id = $agentId; $workerunit->softwareAgent_id = 'amt'; $workerunit->job_id = $jobId; $workerunit->unit_id = ''; $workerunit->hitId = $id; $workerunit->question = $h['Question']; $workerunit->platformWorkerunitId = $assignment['AssignmentId']; $workerunit->acceptTime = new MongoDate(strtotime($assignment['AcceptTime'])); $workerunit->submitTime = new MongoDate(strtotime($assignment['SubmitTime'])); // // Todo: Optionally compute time spent doing the assignment here. // if (!empty($assignment['AutoApprovalTime'])) { $workerunit->autoApprovalTime = new MongoDate(strtotime($assignment['AutoApprovalTime'])); } if (!empty($assignment['ApprovalTime'])) { $workerunit->autoApprovalTime = new MongoDate(strtotime($assignment['ApprovalTime'])); } if (!empty($assignment['RejectionTime'])) { $workerunit->autoApprovalTime = new MongoDate(strtotime($assignment['RejectionTime'])); } $workerunit->content = $assignment['Answer']; $workerunit->status = $assignment['AssignmentStatus']; // Submitted | Approved | Rejected $workerunit->user_id = 'CrowdWatson'; $workerunit->save(); $newworkerunits[] = $workerunit; //} /* Possibly also: HITId 2P3Z6R70G5RC7PEQC857ZSST0J2P9T Deadline */ } } } }