From d7cd0b371d4e96917fa787bbbd16fa939ed2be18 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Wed, 30 Oct 2013 19:09:08 +0100 Subject: [PATCH 1/8] removed old remnant, reference to `users` table --- webroot/admin/run/user_overview.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webroot/admin/run/user_overview.php b/webroot/admin/run/user_overview.php index aa9759617..f04f6057a 100755 --- a/webroot/admin/run/user_overview.php +++ b/webroot/admin/run/user_overview.php @@ -16,7 +16,7 @@ `survey_run_sessions`.created, `survey_runs`.name AS run_name, `survey_units`.type AS unit_type, - `users`.`email`, + `survey_users`.`email`, DATEDIFF(NOW(), `survey_run_sessions`.last_access) AS last_access_days, (`survey_units`.type IN ('Survey','External') AND DATEDIFF(NOW(), `survey_run_sessions`.last_access) >= 2) AS hang @@ -32,8 +32,8 @@ LEFT JOIN `survey_runs` ON `survey_run_sessions`.run_id = `survey_runs`.id -LEFT JOIN `users` -ON `survey_run_sessions`.session = `users`.code +LEFT JOIN `survey_users` +ON `survey_run_sessions`.session = `survey_users`.user_code WHERE `survey_runs`.name = :run_name From 6fc2e0be0a82e01f078c1e653313186d66cb58eb Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Wed, 30 Oct 2013 19:09:41 +0100 Subject: [PATCH 2/8] branch now uses R :-) --- Model/Branch.php | 83 +++++++++++++++++++------------------------ Model/OpenCPU.php | 62 ++++++++++++++++++++++++-------- Model/RunUnit.php | 42 ++++++++++++---------- Model/Site.php | 6 ++++ webroot/assets/run.js | 2 +- 5 files changed, 114 insertions(+), 81 deletions(-) diff --git a/Model/Branch.php b/Model/Branch.php index 955e4a3e6..525baf7ac 100644 --- a/Model/Branch.php +++ b/Model/Branch.php @@ -87,32 +87,35 @@ public function removeFromRun($run_id) } public function test() { - $join = join_builder($this->dbh, $this->condition); -$q = "SELECT DISTINCT ( {$this->condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` - -$join - -WHERE - `survey_run_sessions`.run_id = :run_id + $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id FROM `survey_run_sessions` -ORDER BY IF(ISNULL( ( {$this->condition} ) ),1,0), RAND() + WHERE + `survey_run_sessions`.run_id = :run_id -LIMIT 20"; + ORDER BY RAND() - echo "
$q
"; - $evaluate = $this->dbh->prepare($q); // should use readonly - $evaluate->bindParam(':run_id',$this->run_id); + LIMIT 20"; + $get_sessions = $this->dbh->prepare($q); // should use readonly + $get_sessions->bindParam(':run_id',$this->run_id); - $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); - if($evaluate->rowCount()>=1): + $get_sessions->execute() or die(print_r($get_sessions->errorInfo(), true)); + if($get_sessions->rowCount()>=1): $results = array(); - while($temp = $evaluate->fetch()) + while($temp = $get_sessions->fetch()) $results[] = $temp; else: - echo 'Nothing found'; + echo 'No data to compare to yet.'; return false; endif; - + + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = current($results)['id']; + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->condition) + )); + echo $openCPU->isTrueAdmin($this->condition); + echo ' @@ -120,47 +123,33 @@ public function test() "'; foreach($results AS $row): + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = $row['id']; + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->condition) + )); + echo " - + "; endforeach; echo '
Code
{$row['session']}".h((int)$row['test'])."".stringBool($openCPU->isTrue($this->condition) )."
'; } public function exec() { - $join = join_builder($this->dbh, $this->condition); - - $q = "SELECT ( {$this->condition} ) AS test FROM `survey_run_sessions` - $join - - WHERE - `survey_run_sessions`.`id` = :run_session_id - - ORDER BY IF(ISNULL( ( {$this->condition} ) ),1,0), `survey_unit_sessions`.id DESC - - LIMIT 1"; - -# pr($q); - $evaluate = $this->dbh->prepare($q); // should use readonly - $evaluate->bindParam(":run_session_id", $this->run_session_id); + $openCPU = $this->makeOpenCPU(); - $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); - if($evaluate->rowCount()===1): - $temp = $evaluate->fetch(); - $result = (bool)$temp['test']; - else: - $result = false; - endif; -# pr($temp); -# pr($this->run_session_id); - - // evaluate condition + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->condition) + )); + $result = (bool)$openCPU->isTrue($this->condition); + $join = join_builder($this->dbh, $this->condition); + $position = $result ? $this->if_true : $this->if_false; -# $run_to_id = $this->getUnitIdAtPosition( $run_to ); - -# $run_session = new RunSession($this->dbh, $this->run_id, $this->user_id, $this->session); + global $run_session; if($run_session->session): $this->end(); diff --git a/Model/OpenCPU.php b/Model/OpenCPU.php index 6c309f409..b3d64789a 100644 --- a/Model/OpenCPU.php +++ b/Model/OpenCPU.php @@ -40,13 +40,39 @@ private function identity($post, $return = '/json',$headers = false) return $this->r_function('base/R/identity'.$return, $post, $headers); } - public function isTrue($source,$return = 'json',$headers = false) + public function isTrue($source,$return = '/json',$headers = false) { - $post = array('x' => '{ $source }'); - return $this->identity($post,$return,$headers); + $post = array('x' => '{ + (function() { + '.$this->user_data.' + '.$source.' + })() }'); + + $result = $this->identity($post,$return,$headers); + $parsed = json_decode($result); + if($parsed===null): + alert($result,'alert-error'); + alert("
".$source."
",'alert-error'); + return null; + elseif(empty($parsed)): + return null; + else: + return $parsed[0]; + endif; + } + public function isTrueAdmin($source,$return = '',$headers = true) + { + $post = array('x' => '{ + (function() { + '.$this->user_data.' + '.$source.' + })() }'); + + $result = $this->identity($post,$return,$headers); + return $this->debugCall($result); } - public function knit($source,$return,$headers = false) + public function knit($source,$return = '/json',$headers = false) { $post = array('x' => '{ library(knitr) @@ -127,26 +153,32 @@ public function selftest() private function debugCall($results) { list($header, $results) = explode("\r\n\r\n", $results, 2); - if($this->http_status > 302): $response = array( 'Response' => '
'. htmlspecialchars($results). '
', 'HTTP headers' => '
'. htmlspecialchars($header). '
', ); else: - list($first) = explode("\n",$results); + $available = explode("\n",$results); - $session = explode('/',$first); + $session = explode('/',$available[0]); $session = '/'.$session[1].'/'.$session[2] .'/'.$session[3] . '/'; // info/text stdout/text console/text R/.val/text - - $response = array( - 'Result' => file_get_contents($this->instance. $session . 'R/.val/text'), - 'Console' => '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'console/text')).'
', - 'Stdout' => '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'stdout/text')). '
', - 'HTTP headers' => '
'. htmlspecialchars($header). '
', - 'Session info' => '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'info/text')). '
' - ); + + $response = array(); + if(in_array($session . 'R/.val',$available)) + $response['Result'] = file_get_contents($this->instance. $session . 'R/.val/text'); + + if(in_array($session . 'console',$available)) + $response['Console'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'console/text')).'
'; + if(in_array($session . 'stdout',$available)) + + $response['Stdout'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'stdout/text')). '
'; + + $response['HTTP headers'] = '
'. htmlspecialchars($header). '
'; + + if(in_array($session . 'info',$available)) + $response['Session info'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'info/text')). '
'; endif; return $this->ArrayToAccordion($response); diff --git a/Model/RunUnit.php b/Model/RunUnit.php index c5f4cfd5c..3cf920c4e 100644 --- a/Model/RunUnit.php +++ b/Model/RunUnit.php @@ -171,23 +171,8 @@ public function displayForRun($prepend = '') { return parent::runDialog($prepend,''); } - private function getUserDataInRun() + protected function getUserDataInRun($surveys) { - $result_tables = $this->dbh->prepare("SELECT `survey_studies`.name FROM survey_run_units - LEFT JOIN survey_units - ON `survey_units`.id = `survey_run_units`.unit_id - LEFT JOIN `survey_studies` - ON `survey_units`.id = `survey_studies`.id - - WHERE `survey_run_units`.run_id = :run_id - AND `survey_units`.type = 'Survey'"); - - $result_tables->bindParam(":run_id",$this->run_id); - $result_tables->execute(); - $surveys = array(); - while($res = $result_tables->fetch(PDO::FETCH_ASSOC)) - $surveys[] = $res['name']; - $results = array(); foreach($surveys AS $survey_name): $get_results = $this->dbh->prepare("SELECT `survey_run_sessions`.session, `$survey_name`.* FROM `$survey_name` @@ -213,7 +198,7 @@ private function getUserDataInRun() endforeach; return $results; } - private function makeOpenCPU() + protected function makeOpenCPU() { require_once INCLUDE_ROOT . "Model/OpenCPU.php"; @@ -223,7 +208,6 @@ private function makeOpenCPU() global $settings; $openCPU = new OpenCPU($settings['opencpu_instance']); - $openCPU->addUserData($this->getUserDataInRun()); return $openCPU; } private function knittingNeeded($source) @@ -233,6 +217,20 @@ private function knittingNeeded($source) else return false; } + protected function dataNeeded($fdb,$q) + { + $result_tables = $fdb->query("SELECT name FROM `survey_studies`"); + $tables = array(); + + while($res = $result_tables->fetch(PDO::FETCH_ASSOC)): + $result = $res['name']; + if(preg_match("/($result\\\$|$result\\[)/",$q)): + $tables[] = $result; + endif; + endwhile; + + return $tables; + } public function getParsedBodyAdmin($source) { $q = "SELECT id,run_session_id FROM `survey_unit_sessions` @@ -255,6 +253,11 @@ public function getParsedBodyAdmin($source) if($this->knittingNeeded($source)): $openCPU = $this->makeOpenCPU(); + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$source) + )); + return $openCPU->knitForAdminDebug($source); else: return $this->body_parsed; @@ -282,6 +285,9 @@ public function getParsedBody($source) else { $openCPU = $this->makeOpenCPU(); + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$source) + )); $report = $openCPU->knitForUserDisplay($source); if($report) { diff --git a/Model/Site.php b/Model/Site.php index 66c2694dd..80d9a9213 100644 --- a/Model/Site.php +++ b/Model/Site.php @@ -333,3 +333,9 @@ function makeUnit($dbh, $session, $unit) function emptyNull(&$x){ $x = ($x=='') ? null : $x; } +function stringBool($x) +{ + if($x===false) return 'false'; + elseif($x===true) return 'true'; + else return 'null'; +} \ No newline at end of file diff --git a/webroot/assets/run.js b/webroot/assets/run.js index 9cf7cac2d..ef4bd5527 100644 --- a/webroot/assets/run.js +++ b/webroot/assets/run.js @@ -79,7 +79,7 @@ RunUnit.prototype.test = function(e) .done($.proxy(function(data) { - var $modal = $($.parseHTML('')); + var $modal = $($.parseHTML('')); $modal.modal('show'); $("#opencpu_accordion").collapse({toggle:true}); },this)) From f8757ca6ebe7afe215907cf427b706c7fd1a4848 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Thu, 31 Oct 2013 15:04:50 +0100 Subject: [PATCH 3/8] switching to R --- Model/Branch.php | 15 ++-- Model/Email.php | 83 +++++++++----------- Model/Item.php | 9 ++- Model/OpenCPU.php | 11 +-- Model/Pause.php | 45 +++++++---- Model/Site.php | 4 +- Model/Survey.php | 20 ++++- documentation/Example files/all_widgets.xls | Bin 49664 -> 50688 bytes webroot/assets/run.js | 7 +- 9 files changed, 112 insertions(+), 82 deletions(-) diff --git a/Model/Branch.php b/Model/Branch.php index 525baf7ac..fd73ccd13 100644 --- a/Model/Branch.php +++ b/Model/Branch.php @@ -87,12 +87,12 @@ public function removeFromRun($run_id) } public function test() { - $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id FROM `survey_run_sessions` + $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id,`survey_run_sessions`.position FROM `survey_run_sessions` WHERE `survey_run_sessions`.run_id = :run_id - ORDER BY RAND() + ORDER BY `survey_run_sessions`.position DESC,RAND() LIMIT 20"; $get_sessions = $this->dbh->prepare($q); // should use readonly @@ -114,11 +114,11 @@ public function test() $openCPU->addUserData($this->getUserDataInRun( $this->dataNeeded($this->dbh,$this->condition) )); - echo $openCPU->isTrueAdmin($this->condition); + echo $openCPU->evaluateAdmin($this->condition); echo ' - + "'; @@ -131,11 +131,12 @@ public function test() )); echo " - - + + "; endforeach; echo '
CodeCode (Position) Test
{$row['session']}".stringBool($openCPU->isTrue($this->condition) )."{$row['session']} ({$row['position']})".stringBool($openCPU->evaluate($this->condition) )."
'; + $this->run_session_id = null; } public function exec() { @@ -145,7 +146,7 @@ public function exec() $openCPU->addUserData($this->getUserDataInRun( $this->dataNeeded($this->dbh,$this->condition) )); - $result = (bool)$openCPU->isTrue($this->condition); + $result = (bool)$openCPU->evaluate($this->condition); $join = join_builder($this->dbh, $this->condition); $position = $result ? $this->if_true : $this->if_false; diff --git a/Model/Email.php b/Model/Email.php index d6bd345e6..48ffa1a0b 100644 --- a/Model/Email.php +++ b/Model/Email.php @@ -140,7 +140,7 @@ public function displayForRun($prepend = '')


@@ -154,35 +154,16 @@ public function displayForRun($prepend = '') } public function getRecipientField() { - if($this->recipient_field === null OR trim($this->recipient_field)=='') - $this->recipient_field = '`survey_users`.email'; - - $join = join_builder($this->dbh, $this->recipient_field); - -$q = "SELECT {$this->recipient_field} AS email_field FROM `survey_run_sessions` - -$join + $openCPU = $this->makeOpenCPU(); -WHERE `survey_run_sessions`.id = :run_session_id + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->recipient_field) + )); -ORDER BY IF(ISNULL(email_field),1,0), `survey_unit_sessions`.id DESC - -LIMIT 1"; - -#pr($q); -#pr($this->run_session_id); - - $g_email = $this->dbh->prepare($q); // should use readonly - $g_email->bindParam(":run_session_id", $this->run_session_id); + if($this->recipient_field === null OR trim($this->recipient_field)=='') + $this->recipient_field = 'survey_users$email'; - $g_email->execute() or die(print_r($g_email->errorInfo(), true)); - if($g_email->rowCount()===1): - $temp = $g_email->fetch(PDO::FETCH_ASSOC); - $email = $temp['email_field']; - else: - $email = ''; - endif; - return $email; + return $openCPU->evaluate($this->recipient_field); } public function sendMail($who = NULL) { @@ -236,47 +217,53 @@ public function test() echo $this->getBody(); + if($this->recipient_field === null OR trim($this->recipient_field)=='') - $this->recipient_field = '`survey_users`.email'; + $this->recipient_field = 'survey_users$email'; - $join = join_builder($this->dbh, $this->recipient_field); - -$q = "SELECT DISTINCT {$this->recipient_field} AS email,`survey_run_sessions`.session FROM `survey_run_sessions` + $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id,`survey_run_sessions`.position FROM `survey_run_sessions` -$join + WHERE + `survey_run_sessions`.run_id = :run_id -WHERE `survey_run_sessions`.run_id = :run_id -AND email IS NOT NULL + ORDER BY `survey_run_sessions`.position DESC,RAND() -ORDER BY RAND() -LIMIT 20"; -#echo $q; - $g_email = $this->dbh->prepare($q); // should use readonly - $g_email->bindParam(':run_id',$this->run_id); + LIMIT 20"; + $get_sessions = $this->dbh->prepare($q); // should use readonly + $get_sessions->bindParam(':run_id',$this->run_id); - $g_email->execute() or die(print_r($g_email->errorInfo(), true)); - if($g_email->rowCount()>=1): + $get_sessions->execute() or die(print_r($get_sessions->errorInfo(), true)); + if($get_sessions->rowCount()>=1): $results = array(); - while($temp = $g_email->fetch()) + while($temp = $get_sessions->fetch()) $results[] = $temp; else: - echo 'Nothing found'; + echo 'No data to compare to yet.'; return false; endif; - + echo ' - - + + "'; foreach($results AS $row): + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = $row['id']; + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->recipient_field) + )); + $email = stringBool($openCPU->evaluate($this->recipient_field) ); + $good = filter_var( $email, FILTER_VALIDATE_EMAIL) ? '' : 'warning'; echo " - - + + "; endforeach; echo '
CodeEmailCode (Position)Test
{$row['session']}".h($row['email'])."{$row['session']} ({$row['position']})".$email."
'; + $this->run_session_id = null; } public function remind($who) { diff --git a/Model/Item.php b/Model/Item.php index 548112a57..b21119cbc 100644 --- a/Model/Item.php +++ b/Model/Item.php @@ -4,11 +4,12 @@ class ItemFactory public $errors; private $choice_lists = array(); private $used_choice_lists = array(); + public $skipifs = array(); function __construct($choice_lists) { $this->choice_lists = $choice_lists; } - function make($item) { + public function make($item) { $type = $item['type']; if(isset($item['choice_list']) AND $item['choice_list']): @@ -36,6 +37,11 @@ public function unusedChoiceLists() array_keys($this->used_choice_lists) ); } + public function skip($openCPU, $skipif) + { + $this->skipifs[$skipif] = $openCPU->evaluate($skipif); + return $this->skipifs[$skipif]; + } } // the default item is a text input, as many browser render any input type they don't understand as 'text'. @@ -195,6 +201,7 @@ public function getResultField() public function skip($session_id, $run_session_id, $rdb, $results_table) { if($this->skipif!=null): + if( (strpos($this->skipif,'AND')!==false AND strpos($this->skipif,'OR')!==false) // and/or mixed? OR strpos($this->skipif,'.') !== false // references to other tables (very simplistic check) diff --git a/Model/OpenCPU.php b/Model/OpenCPU.php index b3d64789a..ea7c597d7 100644 --- a/Model/OpenCPU.php +++ b/Model/OpenCPU.php @@ -40,7 +40,7 @@ private function identity($post, $return = '/json',$headers = false) return $this->r_function('base/R/identity'.$return, $post, $headers); } - public function isTrue($source,$return = '/json',$headers = false) + public function evaluate($source,$return = '/json',$headers = false) { $post = array('x' => '{ (function() { @@ -60,7 +60,7 @@ public function isTrue($source,$return = '/json',$headers = false) return $parsed[0]; endif; } - public function isTrueAdmin($source,$return = '',$headers = true) + public function evaluateAdmin($source,$return = '',$headers = true) { $post = array('x' => '{ (function() { @@ -170,15 +170,15 @@ private function debugCall($results) $response['Result'] = file_get_contents($this->instance. $session . 'R/.val/text'); if(in_array($session . 'console',$available)) - $response['Console'] = '

'. htmlspecialchars(file_get_contents($this->instance. $session . 'console/text')).'
'; + $response['Console'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'console/print')).'
'; if(in_array($session . 'stdout',$available)) - $response['Stdout'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'stdout/text')). '
'; + $response['Stdout'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'stdout/print')). '
'; $response['HTTP headers'] = '
'. htmlspecialchars($header). '
'; if(in_array($session . 'info',$available)) - $response['Session info'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'info/text')). '
'; + $response['Session info'] = '
'. htmlspecialchars(file_get_contents($this->instance. $session . 'info/print')). '
'; endif; return $this->ArrayToAccordion($response); @@ -188,6 +188,7 @@ private function ArrayToAccordion($array) $acc = '
'; $first = ' in'; foreach($array AS $title => $content): + if($content == null) $content = stringBool($content); $acc .= '
diff --git a/Model/Pause.php b/Model/Pause.php index bda1a9303..19e474729 100644 --- a/Model/Pause.php +++ b/Model/Pause.php @@ -132,28 +132,33 @@ public function test() { if($this->relative_to=== null OR trim($this->relative_to)=='') { - $this->relative_to = '`survey_unit_sessions`.created'; + $this->relative_to = 'survey_unit_sessions$created'; } - $join = join_builder($this->dbh, $this->relative_to); + $openCPU = $this->makeOpenCPU(); - $conditions = array(); - + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + $relative_to = $openCPU->evaluate($this->relative_to); + + + $conditions = array(); if($this->wait_minutes AND $this->wait_minutes!='') - $conditions['minute'] = "DATE_ADD({$this->relative_to}, INTERVAL :wait_minutes MINUTE) <= NOW()"; + $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') $conditions['date'] = "CURDATE() >= :wait_date"; if($this->wait_until_time AND $this->wait_until_time != '00:00:00') $conditions['time'] = "CURTIME() >= :wait_time"; if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) - $conditions['date'] = "DATE_ADD({$this->relative_to}, INTERVAL 1 DAY) >= CURDATE()"; + $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; if(!empty($conditions)): $condition = implode($conditions," AND "); - $order = str_replace(array(':wait_minutes',':wait_date','wait_time'),array(':wait_minutes2',':wait_date2','wait_time2'),$condition); + $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); $q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` @@ -164,7 +169,7 @@ public function test() ORDER BY IF(ISNULL($order),1,0), RAND() -LIMIT 20"; +LIMIT 1"; echo "
$q
"; $evaluate = $this->dbh->prepare($q); // should use readonly @@ -180,6 +185,8 @@ public function test() $evaluate->bindParam(':wait_time',$this->wait_until_time); $evaluate->bindParam(':wait_time2',$this->wait_until_time); endif; + $evaluate->bindParam(':relative_to',$relative_to); + $evaluate->bindParam(':relative_to2',$relative_to); $evaluate->bindParam(':run_id',$this->run_id); $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); @@ -217,31 +224,34 @@ public function exec() { if($this->relative_to=== null OR trim($this->relative_to)=='') { - $this->relative_to = '`survey_unit_sessions`.created'; + $this->relative_to = 'survey_unit_sessions$created'; } - $join = join_builder($this->dbh, $this->relative_to); - + $openCPU = $this->makeOpenCPU(); + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + $relative_to = $openCPU->evaluate($this->relative_to); + $conditions = array(); if($this->wait_minutes AND $this->wait_minutes!='') - $conditions['minute'] = "DATE_ADD({$this->relative_to}, INTERVAL :wait_minutes MINUTE) <= NOW()"; + $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') $conditions['date'] = "CURDATE() >= :wait_date"; if($this->wait_until_time AND $this->wait_until_time != '00:00:00') $conditions['time'] = "CURTIME() >= :wait_time"; if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) - $conditions['date'] = "DATE_ADD({$this->relative_to}, INTERVAL 1 DAY) >= CURDATE()"; + $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; if(!empty($conditions)): $condition = implode($conditions," AND "); - $order = str_replace(array(':wait_minutes',':wait_date','wait_time'),array(':wait_minutes2',':wait_date2','wait_time2'),$condition); + $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); $q = "SELECT ( {$condition} ) AS test FROM `survey_run_sessions` - $join - WHERE `survey_run_sessions`.`id` = :run_session_id @@ -261,7 +271,8 @@ public function exec() $evaluate->bindParam(':wait_time',$this->wait_until_time); $evaluate->bindParam(':wait_time2',$this->wait_until_time); endif; - + $evaluate->bindParam(':relative_to',$relative_to); + $evaluate->bindParam(':relative_to2',$relative_to); $evaluate->bindParam(":run_session_id", $this->run_session_id); diff --git a/Model/Site.php b/Model/Site.php index 80d9a9213..727d4d330 100644 --- a/Model/Site.php +++ b/Model/Site.php @@ -337,5 +337,7 @@ function stringBool($x) { if($x===false) return 'false'; elseif($x===true) return 'true'; - else return 'null'; + elseif($x===null) return 'null'; + elseif($x===0) return '0'; + else return $x; } \ No newline at end of file diff --git a/Model/Survey.php b/Model/Survey.php index b1844bd76..bc6184813 100644 --- a/Model/Survey.php +++ b/Model/Survey.php @@ -234,9 +234,25 @@ protected function getNextItems() { { $name = $item['name']; $this->unanswered_batch[$name] = $item_factory->make($item); - if($this->unanswered_batch[$name]->skipif !== null) + $skipif = $this->unanswered_batch[$name]->skipif; + if($skipif !== null) { - if($this->unanswered_batch[$name]->skip($this->session_id,$this->run_session_id,$this->dbh,$this->results_table)) + if(isset($item_factory->skipifs[ $skipif ])) + { + $skip = $item_factory->skipifs[ $skipif ]; + } + else + { + $openCPU = $this->makeOpenCPU(); + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh, $skipif ) + )); + + $skip = $item_factory->skip($openCPU, $skipif ); + } + + if($skip) { unset($this->unanswered_batch[$name]); // todo: do something else with this when we want JS? } diff --git a/documentation/Example files/all_widgets.xls b/documentation/Example files/all_widgets.xls index 9135c4eeb9c4d652a23bf2499290da40729ea05c..45782135a6dc6fdd068a107571eb4ac1a9853d7e 100644 GIT binary patch delta 6689 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 delta 5877 zcmaJ_TX0n69skZ|Hg`ywQqP|KqdK`*}qb(;5qZ zs<<=cO;?mxg~cNAm?nhgU94PQ{jms(dWDxpn#0>f#M@HSR#q-nc&#;!-dxSPvI=pX z_fbu=*IQHXeO6QM$+|E&dqt)9Va-9U#cQukYa6|nYFo9K_ipV8ZBt>et|zQ*^3E?^ z4g!6~__L+(!O|x~;d@#d&K8a}9Edg|*tsY?2;oaUpTCMj{QdQ4t@oZhxq#T&*{O(y z?5dxJ7EtGl7CNr4&=ycHUAm-Xy(4S?kK(_sePLPs6I23GE}Wcw)Hr@h)QMZ}^IqOL z5&C_DSGTKSWw{W#HLhC|a5^(qi;rB|HK)_Y*kslmGYT!cKGC#adD*^(ZLX1VWX5!* zVOmB;-fSBt@D;}~EIEZ|^6(7wIL`6Rw42RH2amkp^mXPFU?-VzeQeT@eSv=2!v^GD zTc0pk?d*(U$}Y>D$=Ysq+RR#p70(N?X3ZMe*AxA`966FPCT+upc_rogVzSS4T_f$t zlws%P;Iy804Y_(Otvk+YIrUEqs^yGngZv+|tW*x@xs04Jl5pYGzy6?I2}H zAIPQwe^{#IGrmn_GZ}reV@&HdEW7bzGu)HBq3OMf)qMXHV(_V|^Fq)yoy zHd7OZ>&WqJdV;LW!EBlmgc9oDwWMX_IITG=#VN|5(k`A~1{W#lwzD&iVOw%MXH8Mc zVH%1qs$vc3u8CHVj%lUxRC}2=%&|#V>PZBlTPcGyp)kg*si((bmE-U08R?}ii_2ld z@?%Ds-SmH}F*HI08Hh z4}CskdrZSIP!q?sa~z&3ge$F_P4Q&(bPUxq)AQMo89g`7et<-&B5J;<#js+sD+w>m zv8m17IoHivj^9qh%#9SeISUmD3KR1?C5eipjG$NIQH;YHc_nF^V05BroW!v)BP}x+ zE)0Z@DTG&smCGdUD>QHB5sL@b_6am;JQ;(oJ+UcaQ5iN2Ba5i$M&FyRw7aQmdfZ4C z$$k3R#&|T^n~_7tF&BiCoYF0%N2YS#gE#l)F(x^8mRc#n&02CHhn%DOeY!mb3-E;M zgJvU7W1yt4NXTiP{e!6JEcFQ`61ho$ywGQjg((4S8I60_cdW{v(s&j1AL{E) z49M14>$a`2*62PniPlAk$Qn|KF9&oiB?=%e59^aOPQ`VAjfMQ60qo1xlwWBRIXymY zSe(?9F>cZ*mG**+_M?!{n=w6iV99zZqchng)+Dkx&5f3U1e(zx%~%z##H7YN*;Rjg zYg``6_<6uKF^wcTM(#5#J!ei}UAuBNhjOI#9I6+?B6E0KVyxU*jLCIg!+u(PBztkud#XX|-#r#pcg1DybE8}il zB@t1OD&5z_DdbsnJvs;KIg~UJ=8zYHPqX`Pwt4K z%_kPFo#5R?F2-aEGr~0r+TbXbQL9YirMUxp){(&q@EK`&(Gc+Vnx`gSCq&YJx+l9DY^fX*mX2K1OhVW2GvMZ_NQxI*Qi zJ)%$r&}oG#fgV+;3h0~2Lts7%_$`I1fxa6c4VT4EeD^suQ3lkaP(*Zy8@UaB&3tOg3=RVxr>TMaz9ass;Dt6|uLi3%e z;xc_l(J1;m6r$+w3=nl^$DnGH>y;JxIqb$QW^}O76qd65UOT1*c<_( z2uo{E!`?pKK1zC|I* z#jOFVW1aMOBLz{%&iFd>1WDfsm&KDFSrOzuwoG%7w3v(V=)qEH3UIfW{LUR9_H=rx6+K(7;8hxu(||IY`+ zHg+VW5IOROH}~-J{2S`oe6wxHMagU%c4^6Mo0xC54YmTa_}0F_YWo7K?VPwD!5-ze z-4CDMlkJECB z>>qYK6^Ihs-g&p?5YXc!j8xEn8~sku@V!oa+k5SmrW+#o{
')); - $modal.modal('show'); + $modal.modal('show').on('hidden',function() { + $modal.remove(); + }); $("#opencpu_accordion").collapse({toggle:true}); + $modal.find('#opencpu_accordion').on('hidden', function (event) { + event.stopPropagation() + }); },this)) .fail(ajaxErrorHandling); return false; From 230764653102f1d24bf97920f214aadd5f75e406 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Fri, 1 Nov 2013 18:15:19 +0100 Subject: [PATCH 4/8] - switched Email recipient field to R - made Email play nice with embedded knitr figures (using a custom image upload function and PHPmailer), though there is one problem: mailinator which we use for testing, strips away all images and other funny business. should we, by default, send the email to the sender? - made skipifs use R. Caching evaluated skipifs in item_factory (per page) - refactored openCPU and RunUnit models - translated all_widgets example table to english - added two new fields to DB scheme, to allow for the day when we use knitr in survey item and choice labels --- Model/Email.php | 51 +++++++--- Model/EmailAccount.php | 21 +++++ Model/Item.php | 4 +- Model/OpenCPU.php | 92 +++++++++++++------ Model/Pause.php | 2 - Model/RunUnit.php | 76 ++++++++++----- Model/Survey.php | 7 +- README.md | 2 +- documentation/Example files/all_widgets.xls | Bin 50688 -> 53248 bytes formr_scheme.mwb | Bin 0 -> 37840 bytes survey_db_scheme.mwb => formr_scheme.mwb.bak | Bin schema.sql | 4 +- survey_db_scheme.mwb.bak | Bin 37773 -> 0 bytes webroot/admin/mail/edit.php | 7 +- webroot/admin/test_opencpu.php | 45 ++++++++- 15 files changed, 241 insertions(+), 70 deletions(-) create mode 100644 formr_scheme.mwb rename survey_db_scheme.mwb => formr_scheme.mwb.bak (100%) delete mode 100644 survey_db_scheme.mwb.bak diff --git a/Model/Email.php b/Model/Email.php index 48ffa1a0b..b3c166889 100644 --- a/Model/Email.php +++ b/Model/Email.php @@ -13,6 +13,7 @@ class Email extends RunUnit { private $body = null; protected $body_parsed = null; + private $images = array(); private $subject = null; private $html = null; @@ -92,7 +93,7 @@ public function create($options) return true; } - private function getBody() + private function getBody($embed_email = true) { if(isset($this->run_name)) $login_link = WEBROOT."{$this->run_name}?code={$this->session}"; @@ -100,14 +101,26 @@ private function getBody() if($this->html): $login_link = "Login link"; - if($this->session_id) - $this->body_parsed = $this->getParsedBody($this->body); - else - $this->body_parsed = $this->getParsedBodyAdmin($this->body); + if($this->session_id): + $response = $this->getParsedBody($this->body,true); + $this->body_parsed = $response['body']; + $this->images = $response['images']; + else: + $response = $this->getParsedBodyAdmin($this->body,$embed_email); + if($embed_email): + $this->body_parsed = $response['body']; + $this->images = $response['images']; + else: + $this->body_parsed = $response; + endif; + endif; + $this->body_parsed = str_replace("{{login_link}}", $login_link , $this->body_parsed ); + $this->body_parsed = str_replace("{{login_code}}", $this->session, $this->body_parsed); return $this->body_parsed; else: $this->body = str_replace("{{login_link}}", $login_link , $this->body); + $this->body = str_replace("{{login_code}}", $this->session, $this->body); return $this->body; endif; } @@ -144,7 +157,7 @@ public function displayForRun($prepend = '')


- {{login_link}} will be replaced by a personalised link to this run.

+ {{login_link}} will be replaced by a personalised link to this run, {{login_code}} will be replaced with this user\'s session code.

'; $dialog .= '

Save. Test

'; @@ -156,13 +169,13 @@ public function getRecipientField() { $openCPU = $this->makeOpenCPU(); + if($this->recipient_field === null OR trim($this->recipient_field)=='') + $this->recipient_field = 'survey_users$email'; + $openCPU->addUserData($this->getUserDataInRun( $this->dataNeeded($this->dbh,$this->recipient_field) )); - if($this->recipient_field === null OR trim($this->recipient_field)=='') - $this->recipient_field = 'survey_users$email'; - return $openCPU->evaluate($this->recipient_field); } public function sendMail($who = NULL) @@ -183,7 +196,23 @@ public function sendMail($who = NULL) $mail->AddAddress($this->recipient); $mail->Subject = $this->subject; - $mail->Body = $this->getBody(); + $mail->Body = $this->getBody(); + + foreach($this->images AS $image_id => $image): + $local_image = INCLUDE_ROOT . 'tmp/' . uniqid(). $image_id; + copy($image,$local_image); + register_shutdown_function(create_function('', "unlink('{$local_image}');")); + + if (!$mail->AddEmbeddedImage( + $local_image, + $image_id, + $image_id, + 'base64', + 'image/png' + )) { + alert($mail->ErrorInfo,'alert-error'); + } + endforeach; if(!$mail->Send()) { @@ -215,7 +244,7 @@ public function test() echo "

{$this->subject}

"; echo "

$link

"; - echo $this->getBody(); + echo $this->getBody(false); if($this->recipient_field === null OR trim($this->recipient_field)=='') diff --git a/Model/EmailAccount.php b/Model/EmailAccount.php index ac607bd27..757cf637d 100644 --- a/Model/EmailAccount.php +++ b/Model/EmailAccount.php @@ -56,6 +56,27 @@ public function changeSettings($posted) $acc->execute() or die(print_r($acc->errorInfo(), true)); return true; } + public function test() + { + $RandReceiv = bin2hex(openssl_random_pseudo_bytes(5)); + $receiver = $RandReceiv . '@mailinator.com'; + $link = "http://{$RandReceiv}.mailinator.com"; + + $mail = $this->makeMailer(); + + $mail->AddAddress($receiver); + $mail->Subject = 'Test'; + $mail->Body = 'You got mail.'; + + if(!$mail->Send()) + { + alert($mail->ErrorInfo,'alert-error'); + } + else + { + redirect_to($link); + } + } public function makeMailer() { $mail = new PHPMailer(); diff --git a/Model/Item.php b/Model/Item.php index b21119cbc..25845ee49 100644 --- a/Model/Item.php +++ b/Model/Item.php @@ -37,9 +37,9 @@ public function unusedChoiceLists() array_keys($this->used_choice_lists) ); } - public function skip($openCPU, $skipif) + public function skip($results_table, $openCPU, $skipif) { - $this->skipifs[$skipif] = $openCPU->evaluate($skipif); + $this->skipifs[$skipif] = $openCPU->evaluateWith($results_table, $skipif); return $this->skipifs[$skipif]; } } diff --git a/Model/OpenCPU.php b/Model/OpenCPU.php index ea7c597d7..99c0f8962 100644 --- a/Model/OpenCPU.php +++ b/Model/OpenCPU.php @@ -3,13 +3,11 @@ class OpenCPU { private $instance; private $user_data = ''; private $curl_c; - private $http_status = null; + public $http_status = null; public function __construct($instance) { $this->instance = $instance; $this->curl_c = curl_init(); -# curl_setopt($this->curl_c, CURLOPT_HTTPHEADER,array('Content-Type: application/json')); - curl_setopt($this->curl_c, CURLOPT_POST, 1); // Method is "POST" curl_setopt($this->curl_c, CURLOPT_RETURNTRANSFER, 1); // Returns the curl_exec string, rather than just Logical value } @@ -18,6 +16,7 @@ public function r_function($function,$post,$headers = false) curl_setopt($this->curl_c, CURLOPT_URL, $this->instance.'/ocpu/library/'.$function); if($post !== null): + curl_setopt($this->curl_c, CURLOPT_POST, 1); // Method is "POST" curl_setopt($this->curl_c, CURLOPT_POSTFIELDS, http_build_query($post)); endif; if($headers): @@ -35,7 +34,7 @@ public function r_function($function,$post,$headers = false) return $result; } - private function identity($post, $return = '/json',$headers = false) + public function identity($post, $return = '/json',$headers = false) { return $this->r_function('base/R/identity'.$return, $post, $headers); } @@ -60,6 +59,28 @@ public function evaluate($source,$return = '/json',$headers = false) return $parsed[0]; endif; } + public function evaluateWith($results_table, $source,$return = '/json',$headers = false) + { + $post = array('x' => '{ + (function() { + '.$this->user_data.' + with('.$results_table.', { + '.$source.' + }) + })() }'); + + $result = $this->identity($post,$return,$headers); + $parsed = json_decode($result); + if($parsed===null): + alert($result,'alert-error'); + alert("
".$source."
",'alert-error'); + return null; + elseif(empty($parsed)): + return null; + else: + return $parsed[0]; + endif; + } public function evaluateAdmin($source,$return = '',$headers = true) { $post = array('x' => '{ @@ -72,12 +93,12 @@ public function evaluateAdmin($source,$return = '',$headers = true) return $this->debugCall($result); } - public function knit($source,$return = '/json',$headers = false) + public function knit($source,$return = '/json',$headers = false,$options = '"base64_images","smartypants","highlight_code","mathjax"') { $post = array('x' => '{ library(knitr) knit2html(text = "' . addslashes($source) . '", - fragment.only = T, options=c("base64_images","smartypants") + fragment.only = T, options=c('.$options.') ) }'); return $this->identity($post,$return,$headers); @@ -127,30 +148,49 @@ public function knitForAdminDebug($source) } - public function selftest() + + + public function knitEmail($source) { - $source = '{ - options(bitmapType = "Xlib"); - library(knitr); library(markdown); library(ggplot2) - knit2html(text = "__Hello__ World `r 1` - ```{r} - qplot(rnorm(10)) - ``` - ", - fragment.only = T, options=c("base64_images","smartypants") - ) - }'; - $results = $this->identity(array('x' => $source),'', true); - - if($this->http_status > 302) $alert_type = 'alert-error'; - else $alert_type = 'alert-info'; - alert("HTTP status: ".$this->http_status,'alert-success'); + $source = +'```{r settings,message=FALSE,warning=F,echo=F} +email_image = function(x) { + cid = gsub("[^a-zA-Z0-9]", "", substring(x,8)) + structure(paste0("cid:",cid,".png"), link = x) +} +opts_chunk$set(warning=F,message=F,echo=F) +opts_knit$set(upload.fun=email_image) +'. +$this->user_data . +'``` +'. + $source; + $results = $this->knit($source,'',false,'"smartypants","highlight_code","mathjax"'); - return $this->debugCall($results); + $available = explode("\n",$results); + + $response = array(); + $response['images'] = array(); + + foreach($available AS $part): + $upto = strpos($part,'/files/figure/'); + if($upto!==false): + $image_id = preg_replace("/[^a-zA-Z0-9]/",'',substr($part,$upto+14)) . '.png'; + $response['images'][ $image_id ] = $this->instance. $part; + endif; + endforeach; + + $session = explode('/',$available[0]); + $session = '/'.$session[1].'/'.$session[2] .'/'.$session[3] . '/'; + // info/text stdout/text console/text R/.val/text + + if(in_array($session . 'R/.val',$available)) + $response['body'] = current( json_decode(file_get_contents($this->instance. $session . 'R/.val/json')) ); + + return $response; } - - private function debugCall($results) + public function debugCall($results) { list($header, $results) = explode("\r\n\r\n", $results, 2); if($this->http_status > 302): diff --git a/Model/Pause.php b/Model/Pause.php index 19e474729..3978103e9 100644 --- a/Model/Pause.php +++ b/Model/Pause.php @@ -162,8 +162,6 @@ public function test() $q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` -$join - WHERE `survey_run_sessions`.run_id = :run_id diff --git a/Model/RunUnit.php b/Model/RunUnit.php index 3cf920c4e..fa4eacd43 100644 --- a/Model/RunUnit.php +++ b/Model/RunUnit.php @@ -175,13 +175,31 @@ protected function getUserDataInRun($surveys) { $results = array(); foreach($surveys AS $survey_name): - $get_results = $this->dbh->prepare("SELECT `survey_run_sessions`.session, `$survey_name`.* FROM `$survey_name` - left join `survey_unit_sessions` - on `$survey_name`.session_id = `survey_unit_sessions`.id - left join `survey_run_sessions` - on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id + $q1 = "SELECT `survey_run_sessions`.session, `$survey_name`.* FROM `$survey_name` + "; + + $q4 = " + WHERE `survey_run_sessions`.id = :run_session_id;"; + + if(!in_array($survey_name,array('survey_users'))): + $q2 = "left join `survey_unit_sessions` + on `$survey_name`.session_id = `survey_unit_sessions`.id + "; + $q3 = "left join `survey_run_sessions` + on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id + "; + + elseif($survey_name == 'survey_users'): + $q2 = ''; + $q3 = "left join `survey_run_sessions` + on `survey_users`.id = `survey_run_sessions`.user_id + "; + endif; + + $q = $q1 . $q2 . $q3 . $q4; + + $get_results = $this->dbh->prepare($q); - WHERE `survey_run_sessions`.id = :run_session_id;"); $get_results->bindParam(':run_session_id', $this->run_session_id); $get_results->execute(); $results[$survey_name] = array(); @@ -219,19 +237,24 @@ private function knittingNeeded($source) } protected function dataNeeded($fdb,$q) { + $matches = $tables = array(); $result_tables = $fdb->query("SELECT name FROM `survey_studies`"); - $tables = array(); - while($res = $result_tables->fetch(PDO::FETCH_ASSOC)): - $result = $res['name']; + $tables[] = $res['name']; + endwhile; + $tables[] = 'survey_users'; + $tables[] = 'survey_unit_sessions'; + $tables[] = 'survey_email_log'; + + foreach($tables AS $result): if(preg_match("/($result\\\$|$result\\[)/",$q)): - $tables[] = $result; + $matches[] = $result; endif; - endwhile; + endforeach; - return $tables; + return $matches; } - public function getParsedBodyAdmin($source) + public function getParsedBodyAdmin($source,$email_embed = false) { $q = "SELECT id,run_session_id FROM `survey_unit_sessions` @@ -248,7 +271,6 @@ public function getParsedBodyAdmin($source) $temp_user = $g_user->fetch(PDO::FETCH_ASSOC); $this->session_id = $temp_user['id']; $this->run_session_id = $temp_user['run_session_id']; -# pr($temp_user); endif; if($this->knittingNeeded($source)): @@ -258,12 +280,18 @@ public function getParsedBodyAdmin($source) $this->dataNeeded($this->dbh,$source) )); - return $openCPU->knitForAdminDebug($source); + if($email_embed): + return $openCPU->knitEmail($source); # currently not caching email reports + else: + $report = $openCPU->knitForAdminDebug($source); + endif; + return $report; + else: return $this->body_parsed; endif; } - public function getParsedBody($source) + public function getParsedBody($source,$email_embed = false) { if(!$this->knittingNeeded($source)) { // knit if need be @@ -277,7 +305,8 @@ public function getParsedBody($source) $get_report->bindParam(":unit_id",$this->id); $get_report->bindParam(":session_id",$this->session_id); $get_report->execute(); - if($get_report->rowCount() > 0) + + if(!$email_embed AND $get_report->rowCount() > 0) { $report = $get_report->fetch(PDO::FETCH_ASSOC); return $report['body_knit']; @@ -288,9 +317,14 @@ public function getParsedBody($source) $openCPU->addUserData($this->getUserDataInRun( $this->dataNeeded($this->dbh,$source) )); - $report = $openCPU->knitForUserDisplay($source); - if($report) - { + + if($email_embed): + return $openCPU->knitEmail($source); # currently not caching email reports + else: + $report = $openCPU->knitForUserDisplay($source); + endif; + + if($report): $set_report = $this->dbh->prepare("INSERT INTO `survey_reports` (`session_id`, `unit_id`, `body_knit`, `created`, `last_viewed`) VALUES (:session_id, :unit_id, :body_knit, NOW(), NOW() ) "); @@ -299,7 +333,7 @@ public function getParsedBody($source) $set_report->bindParam(":session_id",$this->session_id); $set_report->execute(); return $report; - } + endif; } } } diff --git a/Model/Survey.php b/Model/Survey.php index bc6184813..796b881aa 100644 --- a/Model/Survey.php +++ b/Model/Survey.php @@ -245,11 +245,14 @@ protected function getNextItems() { { $openCPU = $this->makeOpenCPU(); + $dataNeeded = $this->dataNeeded($this->dbh, $skipif ); + $dataNeeded[] = $this->results_table; // currently we stupidly at the current results table to every request, because it would be quite bothersome to parse the statement to understand + $dataNeeded = array_unique($dataNeeded); $openCPU->addUserData($this->getUserDataInRun( - $this->dataNeeded($this->dbh, $skipif ) + $dataNeeded )); - $skip = $item_factory->skip($openCPU, $skipif ); + $skip = $item_factory->skip($this->results_table, $openCPU, $skipif); } if($skip) diff --git a/README.md b/README.md index cc37c3b2e..475b4d5fc 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ These components are the bastard children of a Pause + Branch: If the user acces See the **OpenCPU + R + Knitr + Markdown** section to find out how to customise the text shown while waiting. ### Email -Using an SMTP gateway that you can set up in the admin area, you can send emails to your users. Using the tag `{{login_link}}`, you can send users a personalised link to the run. See the **OpenCPU + R + Knitr + Markdown** section to find out how to personalise email text. +Using an SMTP gateway that you can set up in the admin area, you can send emails to your users. Using the tag `{{login_link}}`, you can send users a personalised link to the run, you can also use `{{login_code}}` to use the session code to create custom links, e.g. for inviting peers to rate this person. See the **OpenCPU + R + Knitr + Markdown** section to find out how to personalise email text. ### External link These are simple external links - you can use them to send users to other, specialised data collection modules, such as a social network generator. If you insert the placeholder `%s`, it will be replaced by the users run_session code, allowing you to link data later. You can choose to "end" this component before the user is redirected to the link or by enabling your external module to call our API to close it, when it's done. diff --git a/documentation/Example files/all_widgets.xls b/documentation/Example files/all_widgets.xls index 45782135a6dc6fdd068a107571eb4ac1a9853d7e..7e4a58f2468f542a7e5220aa484560b4eb4459e0 100644 GIT binary patch delta 13393 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 delta 11026 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 diff --git a/formr_scheme.mwb b/formr_scheme.mwb new file mode 100644 index 0000000000000000000000000000000000000000..2d85668f58fe5d0bb58e0f32f86883aa86375dee GIT binary patch literal 37840 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 literal 0 HcmV?d00001 diff --git a/survey_db_scheme.mwb b/formr_scheme.mwb.bak similarity index 100% rename from survey_db_scheme.mwb rename to formr_scheme.mwb.bak diff --git a/schema.sql b/schema.sql index 6834c2c73..2a0a48eae 100644 --- a/schema.sql +++ b/schema.sql @@ -124,6 +124,7 @@ CREATE TABLE IF NOT EXISTS `survey_items` ( `type_options` VARCHAR(100) NULL DEFAULT NULL , `name` VARCHAR(100) NOT NULL , `label` TEXT NULL DEFAULT NULL , + `label_parsed` TEXT NULL DEFAULT NULL , `optional` TINYINT NULL DEFAULT NULL , `class` VARCHAR(255) NULL DEFAULT NULL , `skipif` TEXT NULL DEFAULT NULL , @@ -497,7 +498,8 @@ CREATE TABLE IF NOT EXISTS `survey_item_choices` ( `study_id` INT UNSIGNED NOT NULL , `list_name` VARCHAR(20) NULL , `name` VARCHAR(20) NULL , - `label` TEXT NULL , + `label` TEXT NULL DEFAULT NULL , + `label_parsed` TEXT NULL DEFAULT NULL , PRIMARY KEY (`id`) , INDEX `fk_survey_item_choices_survey_studies1_idx` (`study_id` ASC) , INDEX `listname` (`list_name` ASC) , diff --git a/survey_db_scheme.mwb.bak b/survey_db_scheme.mwb.bak deleted file mode 100644 index 413f8804ed1f5e2e5284f6058498f700f4c67ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37773 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%0DZWD6-uk6zt#p zy)amOj!eSbQ8eQ)|AKK~ZX8`En5276lU$%~@xGgXPcTwtWRmN&oNAD2Fj~c4k#kTO zwe9Tmr3{wohD6;mgrYpBLEq!?%V!1YaUte@+2OFy(qZV|Lg2qCh&REMdd6JJxqmf6 z8c!tptVRG~B{%Qhm;zgrLxVI`=%?(g^>skLW|t4Fhwv{>1{gbW%0TTKx>BHGR}XR7#l$ES)38fPqy)m)4>RugH+T_rSo5 z#Z1=?UJsjMV$ry_XoenSV;9SiLw#gV)qBhQ5*|e+2#1+DGqnSo^T4G7nQbIT8s%d? zT-KGL<(bXU91pDz#H%osy#GTyyZqDj!%X4iB(*#%-!;`9*<2B}e(_JIsyTkwCv=RT zl35Z4BWxn@&89wMdlZ5eO!m%sx|46ooHbpt+S^*&o=8W-W6%W9Cr)1H8Q6)n#jsg? z2RR<{T6(b(CAcC&BF9QUc7;|NKd@84q%lFJ)M1&&@j*yrWvDO=#*s=c=W1GOSrg~z z{ii@OmM3I^)T{&99nCQ&Tgg+%abmR*NDK62FJ=4u>mVoH6280^x`?wcN+vp1+gfO! z#Vjg`YP`$SK@)%Sa3>_C3`4JcRofa zBV(6^H5Ef2hEb_U{_zJ!Yv?_Oge98e*H-mB;s^>DS_L8;3LP~~S0VCtH&-Q}`1by) zA_EP183RlUl7JH6w1*h_+t6=c?~c_)(dz5tUp`iz9EzFHIcQpvXwbHqXO?>$+3}98 z;onkqSZj1Y?=R(bcfJh!ZJGY8JFMQ9@H#y3R@rpYriGDpYEmsCH(77?YBfAm;qUAI zwU-K;FMNkuFU)gWzUH!Qf+W6~pY_@-!euhIw$Fc>`)8js`pjSWrRYX?mUXsnhIRQW z!FzhR$jF1_M#SK8fo;>?%I2k^TQ_B}pM-f&#&xqM4YU!l|Gc4>Jk2#{4F3ydQfW8) zY{djXWh_rj4xNT9;`Sly3OZUp9gryDU+-<`2(a%9SgZ2_?d1b-Y|?>vucXplSf_Of zbsL_yF6cYyf{%Tc)icI7Q!vXbtw9Ujv)X5!M@`^U7A_g$h4r_yMzT_ue`$vfLC9N) z)ZtTHPi?h1vpeVPJ-FUh-g@hvVL9wO=a!kxj;TI49o-K~|Mp_ZbWc`VaUa659mck+L%@@}W=a@N{j6PzfN}?8H80{ZIM!ZCFn+O&5=6^a>dH)!PiNgE;WnO;a7ga@kg;&G0eEc3B_z0@H>kTJth&s z+QAt~R}77Ad)`(8p24{G39^O{cLr{|$uG~9(HdP|%oS#yL79(vU$fdzn8tzS*CUa~ zy}r2$+}m*0%?amP*e{QR%JNWg(Ojp_L5Mm_qR%d&n)(>K;w?vT4M$wh6?E8W$?(DA zxY>ESY5}r8q^2b~SiRtkVrR-?R@CEW%c@8JJY~qGvo1<)S*MZy$Ri|3Y}^CKy^zJN zract>Tq=I8WWy;725BjqXlr_G>O|QP0EVO^Zh#*1LanAI?ahw4OW~WE1%M=@ zXuZ(teleNV+o=7ovYBf4uZ{F8!0~a*@8aguwVR*9X>VUh5{##pv-c0G){_NeCpXFc zN(kH){f!e{I7x=g9}I3 ze9rhPpd6Wtu{3KY^DHiO?*-Nf;g3?gNaELtdnTVz_$yK*C?&yP4)@z*2eV;X!q$pDyEVy8|54=kW1hxy^4;pey%Nv8^PXOM zW_yPCZ=kr}+6kFlGgD`l2yk;pd_q{y|y7Ng;RDtBuNvzh*{@41->b#XjliT=bumUsq=Gjf8#~GkCum4D+ zmxWObQ~ne^jli^X}L&72e&ZqaAK^q56s@T*n2} zof6KhPpQ<+I#PD&P0%y0FhBXu5iehwsbW4+oA^-|p;EPMHK+Ndct_po`M#qQcV^<^Ee~nBk9`&h?@lMpJ;9kyvjX zjKsZC+iWE)q_i_;G$J0)Wm3@tkitNtW}VR$@8zYzB`JRJ_`i6{qNv$71#aA&_D>Bu zaO~48L=Ty16n8<-f@Vg6hviZ+(a(J(;U7$1Z&`PO6T7UpbQfg|cVg-m{3(+4G;a_z zM)FP=I`BD{jz+OKrfkDVhE5u-4_{@CH7rI_`khBI`s3dwc)J&kwsz`B=QU`@YUl~J z#D*Q0CE!&tNYKq^CWJ?{&wZSi z&Bn^bZQUg3g6ex!moi%xnxdCNMRnH?H*Y1(V}#cEtS%Sa`))j*()k=GD8OzwV5hh2w2Za__tSM(-3h zbb`Q3x|7MQ3Ppi&5&8SDRf|ych1*&Q1LEBRx(y z@;OPY&YMq;9W%4GV5>4aR-Vfvp8%hh$qxoWSNl-;7xAO`yQuZf(tYlI)Gxm-91lfe z&-S}&pT}Q`6sUMf+l%6Gmrqz(47guh_v&soDbe- zd$uvknNV97YpjNhCty!#(XuV$gS{BALlgHxkedWnCCXZgc_ODe*Q1d)gHdSqLW)Bj zMpE~k)9*V|M7BzMSYUj-?dv73MvYca)cqa*Hg^LngNPZJPq})Dv3k9qyNQRayzS~^ zTDP5V_CG7tf;&?DX;knt+JpAWVkK7B`}=)@C6+VKj^RFVGfUF>ym7jKnZWcR3ND71 zUHzooFX!E>N0d|LlVXXzAaB1eG@=)b*MFSLcp-uedf#JEAN-xKEyPFwbYopNR~6&| zr*})I*#aA4&^WJl=0RCdSVvA0KAYPBQkoCY9WYi35<{dkvfa@$u?yea~Sn2Rb&r9ZqiP zWRvoyS9^UExFT2Y95V?tm+Evh&+8M~>V7w47cdEeXKynJ;_ed+3V08EGqI^}V>JwV zd$RAo(YR}f?+_7jwwOUxFnyUW&p)bbb39)a)a~ob09kkfIt3j_oyaxHX2F8z&b-qG z`M5i4lS_?*gfS#M#T#7pLH3*PPrY4n??z>Szldet=gS>qp69yR@o^&wu0DMimRX4= zI}$(TZeI63C+)t#@bjnpY#EtIUeq)B0CT1D@8c);XTW`?wGx4h=CFYdIF$sHt3&sj zh;9-q)iew?px%t}C)|QKL^LG|3bp+T5R?4dUaiR6LDOL?8M4!wjP#2|leb9gzXpWi zz_#?5>ZbeYt+n-|?jnDl^X&VR7%+U&g!E9E`OA{kz3fZN)!lHXk<)YQ_3mr>eK&rQ z2)MS=CmvLe^WLLpltRJp$8)n`b^gQt4YaQY_E35<;OTN%3s`%8_wVQkuSpd0VWFVdjCxP!?KZ)L)(bfk?>3s1YPLwyi^eZT@B3+U?tIREQx8F0E^DMN6Gt0+R~+)X zmMGzcy{CYe*D^X$`xIrm-SgxdQ);68Ki(?8>UHOk3!KZTqC8Ir>3>Y8T$q;(Ix`Mb4&42prFyw8?(>7oxigW9qk;@|DlvW;k8?-nPk_sd^hgq1T; zx3*T}9|P`vUwrLOJa2$zO93htLM{`%1wK6sa9y0o{IBx??FpoPuZOHn8&18?YamqB z|MLZf^WG8vD#yMH5B39v1s~Ah!_mdUfs^Mu8?Oxn#Q%D3fE`3P^?droNWfi&ARs=1 z-$X6VSuM>x%vdbV&jOSh%49q@y$|I%rO7PWWXI%B31w)a=5}sDcG~9)BD#>c;AWs~ z7#>jm2rdB@Ax-=Tm1eY3m3k_&0*^5jVLBtwGC7VHSi*qK+ISTquQj2iM`i4jeCY2T z-rKukD=hFydTPz{Fk8UAYirHr;mAF&{3U0>xh#U^wEmkfcWCpxB zGkeRfL? zf`%7_L3@~eTHoDBg78T5AK`_C-_eBMe}+9i{(-x^LKO~AK<&dNO$fvzC4C_i4%~?Q=yHuFKo3|M+ysDr z;bPqVK2b}^YtnJ`BhJPpH{kWOBb&9)=YHa%4?^kb_9@|ftsVsG8C=nBZA|SdT=#yy z9DlkN;cEk_T>N{kasy*fYVyN5$yoi?3qQ^()cpZ(ukUW@39kuY`&psys*BY)=>5wm z8363amuClewsFr^NjQnbZO@Kc5x1*v1c^sAdIO4Eo|(9edD^X3En#;0PcAg zUjrWYom5WCJ7^=Gzqfzd!5dL)q>19vuqGH$APi||PZp_3U}^oM7E~fmqv=2Tx#4q* zq{?$S^Xy?#0I?*E7Yj`a5wh`oHa;6qOQe~E;WK5W!B(a&bv>DNv30&U}W9hpyN!SS5vdDhhn$SLXehG5BF5VbVP=0@$ zY1wM`oqfvu)$t~Bpm_$GG$TG$iSRsFulXFBW`+ajH)bE$HHLNmb9p$A_LyG9CM&-o ze?F_S)Ms#GMA$v&%eq+rLC1_;?pH5mK@n69>Q5RrZq%RhO6%|W)Uxq|&8Hv*=dF3? z`S2Ts(h@1+Qg8&5PHcrf9Q)KYv{4p<>IewjIgCYU6qoAQ*8dWnX{E$Nxs2Yy>BQ!|0$Xq-AgcZ*BLEu@Q zJOj19w}JnE_@E$f@9Pc5`m?|{+Laefsf7CcVkLpqv1Mtpl3z-y4I@y&OjB&dNM8M> zqlY{KVrI{j(c9>-)?4!BM&W7ERGEg{yw=BD5pg4+z}z1 zEPk7r3^#DSa;|X96WP*y6t0JOUabDc;bDPIrb%(xBmk8cdV*C+nN*$M38F*hLWXY7C!5uY zSa*|$1VWp$wh>DxKVFJN#f$N}!34?IviO^s_g`a0c@U!emq?PmSSlsuP#w(F&h9@g z@<9tI9_GyjAxby0RPcY#kyi<^9RwKwC$wkIK-ivlpn=q&mlZqjeFL}yM24&+T@K1< z(J$T((Tlc3$Muxfrym9tf3Ikz=X|!H zLD@{&Yh7fmrMa$16rXdV5XzT)pxOV~q!dth=*fe^BB}bKX%>MeggKC{iSdz0+;hTQ zo5>hBJ4N#(_DALBk4Oz(T#m0}Pkf7r*K-sKT5R_4jo)QIXD}~9ar&@K#s)YrIxvj* zJR(aa1j>P3PE;g#&KkLsrY+v~=xds6v#`fqT+tNwfl#AxH^S$Rb5y+MR9^ z-L*8PhW`F=bjCXIa@gZt@5EYW4E_cp(Ju6!bDSBZF|-3D2){b~0xS}~PBFYW)Ltvl z1&!FX#RluN`i*S{oF}wuAJp=h$q5zQ&jrs>g*Pk<`cTO2vFLg>;mq6L0iDL5QnAtw zn-qFzYi?H=FAsx@`bCq(Y>2F-3`rf{_<-or0m|xvdeQWCen>9UUI&ONy{D15`E;_# z5w(Ml4@iHGoJL~(veVdc<(j?ATfJ zrk~)jN=UymN7t#Txxn!(hen5^4{%{T!YsBvtZHmc9%q<_L{#%GSf~y{a9Hyu*#Qwl zq&hmUzt9k2TGg<4mcti(g7q(kba@!B^%APry+5>Y;IiRt@f|C-BvxU{7i0FbQLuI2 z0I_FGbQCxRB~a{gW6QRQT%s#Y}@l zc`aHea8pQ27m=62Vn+P83Z1c_w!7}yLnooWla;3Bg!m8dYe>~zecHbhBgC@sc2Vpa ztcE<_wl+a8x97Xw5N~ssIwZoMq-lvVc$}-zI&TrlhXiID16#`Q)e%d!J{&WH6R75A!IF!3-jfSrIUdm`mh*M*ny( zNLBSqj--=`oUB-MQq&@f)azQetdQ@b2^Bg;BvRRcr_>_r(3YugSrtHX4%+Z;2el!e zsyLW>3JnG$ErRi_7Es5uWanRD$aQn3?0%LT5v4;b+h7~Pm4+{g6XPE1I;jGz0=CS; z4q=tyHb$a%3ojsEr}xy|iRSP+3>$b!UNo{2^(ay3gq&PGr)>;5-JIixjDSR+SyO)UmCO&U^EGqdXunL;abGi3#I=oQ! zt9wIO)RhTn6b^!2jGVK0w!bm<{lX#QLA7>vz+p@t1@p#Q#?6g^7DP$HD1m6){LEpv z>-i?&X+*ma!9Q|Xc7r@W=SbTcrt#6tXckH(B2ey_9;YCzurKCW1PIy1!I9U-U$mB& zqwEpBeH&r!Zy;Hf@v_#gYlM`$X>89@nKlOsCV53~&K!;Ki$2`EyvY*$>%L zwQ479?KbA!d`5-yq@QN8o~BE$1Vw1<0mFO^Y{ri|X>yOpBM0G6*K>VESz#EbW|4tI zMFzL%u?R>+_;^x$D;J&zCE0@E!?}RxQV`5N(LII&Tw}o->F+RSykorlb4Ywg!`Z{o z$hg*#r_Rxj4R9pV8!E^{uE-;f-y-Gl#W!fN(5&g9KML+hCM^7@Y0$<4Sp{hS{sQf4 z3d_Z^hgnrh=SD~VAYTSJPLvf zIu0+yN;Q8}DyYA5eq6B_wW* zH_OP`s|zD|;Wz-brPi+By$9)#tZtuNSsdrTqHdHuhpC*mRhBV+qb-oG&z)%_h$b;x z)-?a101H)MaqMrqQN~|3Ug}h(Y-+|Q!&$A<)&RYlB*TXFD>4rvQ(G5>3ok3YCQ!dZ zB^ZqGMkbVJ3K6x_#&g_&UStJQX){eh6Ks`Xko;y#G<9q4??ya5jPcDu4hTF)Z&p?F zO<}_C3j+Xpvx}{*Dk?hxBnRXLiPmKtP*P-b94k%@X!ns*!}gc5P79hJe~tUF+K9as zF*T^#HYcfKrx5EVWjSMV^)Jqgoeq52fIRa(jXT`*J2Ne^Iu^$H#1B@;<^01iTZRtI zYf>s$hZvAqd@A)U0*4}ebAB`p!cqfXv#g@>Lt%Ak(zOP!&2|28m?mLRTiX0^c8!SB zejI|)w|pEUKkE-q_2@j+yx$fx1cj zH7%I%0av)tFuA_XJpC0{{)z|=&Aux=Kk&jXEb8KE$k@K)pe4q>|CvEvIVIb0rfO}9 z@3;hN!$`7Q?Gj5<$A(;l_F^bU0-VlS&Z+gCee4pPr-+TYK=iGB%=l*f;eZAlB*X!OVO4)+X z{Rw`pHCHb%yz|c1JCm+EaLerP7_e3KCq9g!J-m%Ed$BR5KIM?!+rJ?uHCdf4eJIA9 z$N`Ro?J@?XWSQESY>2Z{eM4$Hb9>*sQzJ=d>nLbl?| z?mHcF9?U$GG9m`HscOHc`-q@k9^JkZFPdgfep-X=bB<%#b zY3WP5wL%hYw?3e&P!@OCMyk(>sr@Ro%@5v|PWUUjxu9@VxOmA&@;;jnh^iU5 zoLo<@t3%7X*`zJCnCiWtE-Rl>ejS~B^OXLY;hDcOp75?@$o$oB4Z0xmE@|YS-SGKd z^_wKWY1$rQa+^U~H-F{bpG8;Y0P`xVF*CHS>P zYojWOUBOLtnZB_IVQ}9_VX0|0*U+uD?*Tmg)bF7NB9>L{iQE(+%smh5@RXtrI)UAq z-%(GnR+7uAFM3Z0dss@L;rM>LJ8~prcJk zgF?2OS_wdwhlF5r@h9I+C#6KTHMWdT*p>5k?6f3)s|&Zs1(j%HeNvUG${m3n7gExlZpNkr2#hT|PRsWJCaj6v6cS8c3bjehgub zNGjfN<6f$xFOF^OCBi+(Th2W8+;845^BFHxEnF60P@;W*3VYC<8HkUx3UB|WBzMO0 zok&;pOJb-4#dXC&(L;tQh+H*OXhN35e(q{ZZBZDta4fg4TXFeKohV6dQ>&AAXZS_w z5Id;e0_Ki_Rm10p3iln!!!5}q)?2pCe$vvgs4%d?SU<~@+vVbB3zZYvP4@Y&0+5b- z{Py|Ersu&xp*jY!o@h3oWEx*NzkyEEmUao}_QPAg~LY1SZrw`Gy?^_FYe8``{VWD$?6 zwVgT&C+rs|L%?_IUF%n@t7;3b4YH*0S1x1GL{+SnxD@}uwHeeM9k3=RQi+;zhZNS6 z?&j=wZ%|u%*rl+fP}!0WgcE$mG(tx`)7qPA@d~XFx}N+im9haEzll;J_FB!C?q6ry zf-PLsY$DJe`Klj?1e0ytJzt~Y*3REa5SYK7hc+00QHrNr zt@qgmncZ^@w{e@N@-^CoVUDRp1q!EpWWgRr_R+_R9ReY%BfzDlsoAZ`i5rzFy#t6} zfqT#o(sw`gO&rt*InzSaL2DiJ$H_R)W**#d-K8Q9OtQdojk>!=@*th0#i4@h#PQGC z7+&x5kLcNrv8BqIs)Lz_<<2?KU9JX}Bdzm7s@DmhrQKG#rn{rK^%6>%1Xtg^TAscw zFckk%#e3!9*H-6%DfIS;QhQ7AT(Sw*FC)6xPL2KO>f*Z(>{VM^YI+UM&__n5zE)6| zK5IC?0T4dXl&7x%?fkxT0{Z%Z_Jf6}*b|@t)NEk_YA(h4qO;zLdi7=-zZ-Y=p1l?n zb{v_v|A#Mp&3A5X4*UL0!(3%doATWf%}vmZdy}a=H0$39<^z*BqJv90m_}=02>87r z^a-ox{soFn#WrjLI>aQE*^S`T4!lZaoyC2;%kuH5<^Ht#s{M6mxT@4w35RjTW~qf}r!`)+fxj;1{RjW9V<&8n+%gHGa+eW!`Z%(j#Zg_;i!9q8fwiFFX04 z!%^JmnF-JSAH_zGjXvrjwR*4o0!!T6l=7?vMa;s}VD(&;rox0&xEe9gg0I8b!8gj~58(eJsl@oI$^X!*l5ebjIgX}vvs@c2Xc8Z}VtxW}70i7Cfu-^TLmMXVmC8 zb(8K%T()ouqP&Clu-A#<`Z%)+WPjS+0ND>8jqfivU$3j&%;Q!-D!o|?h0_;-Q+k9J zjMuhR5;=CHwD$InNe0Wn!9MeBtEC9sn5`F#gOepuZ?aV-#_ zb||uQy`w}=|7Wn-gbem<=El!+E@#KC=*lew=TEuSv{%CLyytMiS!@4js_0eAkSMPH_*2 z2Pdwq%RF-I=S(iwsB(u=_2R=Fh z$0qsVt#3cN<~mrUgYJtyOC7ACiqFIxc5KBk*p)YaA?GgNQDg{ao=}H?afwCKrT(f- zw8gad?Xr9)k9*|1(AKr(LXh9V3m)GX-qg!2HDjVBB;}n4R->Eq6(=5vp!eO$8RINH zJAyO{SuaHihFBb&I>hG|i7`B$c|~9CCHlqX{d84)c`Z;1PG(V4(`RuwRSi3mI0;|n z1d!e9jyhlVo``nkJoN6a&@#K&8Yer>xlH^nIa;-E|B~>!0?j*?yKK-Q->J5GL3AoY z$iHk=mHJOYpa2Y~?g6sQCv|awNgA~|*XgVpU{%+dtO_f}Gw&b>C=-#u&J$Yh_Flk{ z-s`>R-Hgx~MJQepW$<2qOE;?b{UQErShPE|-azn?iV~?n-`?FRm-T0Nl?U^qQ=u>B z^e7ZIhsp?S6i-0i-px@;^Ad2-4?ihnmu@pgr?poTWO9F;R|=|(>D04zHVmz`Dk-~z zcR}{u2Fbz6*ytNZYRJaB3(?}O`*PB)KUan^1~Q7dgh@?rO&!xQw)<<8>pCnI;hkuH zHA(M1Q&9F2#sDZi(AmjW@rq)UXVXBXxd^L0)jY9K{=nJ9RTUr6n+g0=kS4DKVw+o( z-}#$B=ptEO{-6%^Q<3Z3o|SdAVeDJ)(O)^rYYA6xalic1^qJIB14Zej8+!~zAQ{VT z7Sos0SWyY3(+Z7CkdB8L_VV5Mk?f(ESx*>+z{@Z}z9tXxV9p=#p1~EoDDiN<_CnNB zm))R{JsTm5i?pfo%(EE%>*))oLm1w)Qt?Z1hHu0qlVDscEYG04tBtHt5hS)pn)Ho_ zBBRHJ({37_83x2O)d3QkU`FR6sO73n43hnlHWS_kX=IBH-iAQrARosHGZpjiZwpcN zd{E&r<5XlU#u_x8?0q8LmegHQQPhF*<}GKT3bzSx!uzY|GgfV>Vz11y?P)K!(;s@b zGvK>20}R^_SP#NM2I{;zq^PsJ;t}7(Z%@Hr`WiPSDFbKEOWO~Xac;L87VAVk?|T*M zn!q)JSNjgk>;(HBwBkZwn`0p`nKL#GN+lTH$&fN=4qjX#haviFMSMU?wRUb(eSeLARyPS|{#&|2nv?F}_d*X^HgiY--ab`)J z2Nl;iujL!W<9reSa0-6es(+j-NHh3rSgKU6!y|l$%O`U&^et`I;S$*Hml~g6?TC<) z7RZ3oO?i~{MP0mp`$VgWaOQ4t6JLQ7#Cm&U5{{QBNbPe)#_j@Sk``AV9iLcMU(f`ZS z{x6#U;eQE`Yu4i9iecs_C$zb2;u`ahusC#wJe diff --git a/webroot/admin/mail/edit.php b/webroot/admin/mail/edit.php index 60ebad0d4..f7177b21b 100644 --- a/webroot/admin/mail/edit.php +++ b/webroot/admin/mail/edit.php @@ -10,7 +10,11 @@ redirect_to("/admin/mail/index"); endif; -if(!empty($_POST)) +if(!empty($_POST) AND isset($_POST['test_account'])) +{ + $acc->test(); +} +elseif(!empty($_POST)) { $acc->changeSettings($_POST); alert('Success! Your email account settings were changed!','alert-success'); @@ -88,6 +92,7 @@
"> +
diff --git a/webroot/admin/test_opencpu.php b/webroot/admin/test_opencpu.php index 8fac34ae8..12deed611 100644 --- a/webroot/admin/test_opencpu.php +++ b/webroot/admin/test_opencpu.php @@ -5,13 +5,47 @@ require_once INCLUDE_ROOT . "Model/OpenCPU.php"; -$openCPU = new OpenCPU($settings['opencpu_instance']); +$openCPU = new OpenCPU($settings['alternative_opencpu_instance']); require_once INCLUDE_ROOT . "View/header.php"; require_once INCLUDE_ROOT . "View/acp_nav.php"; echo "

OpenCPU test

"; -$accordion = $openCPU->selftest(); +echo '
testing '.$settings['alternative_opencpu_instance'].'
'; + +$source = '{ +library(knitr) +knit2html(text = "' . addslashes("__Hello__ World `r 1` +```{r} +library(ggplot2) +qplot(rnorm(100)) +``` +") . '", +fragment.only = T, options=c("base64_images","smartypants") +) +}'; +$results = $openCPU->identity(array('x' => $source),'', true); + +if($openCPU->http_status > 302) $alert_type = 'alert-error'; +else $alert_type = 'alert-success'; + +alert("HTTP status: ".$openCPU->http_status,$alert_type); + + +$accordion = $openCPU->debugCall($results); + + +$openCPU = new OpenCPU($settings['alternative_opencpu_instance']); +$source = '{ +rnorm(10) +}'; +$results = $openCPU->identity(array('x' => $source),'', true); +if($openCPU->http_status > 302) $alert_type = 'alert-error'; +else $alert_type = 'alert-success'; +alert("HTTP status: ".$openCPU->http_status,$alert_type); +$accordion2 = $openCPU->debugCall($results); + + $alerts = $site->renderAlerts(); if(!empty($alerts)): echo '
'; @@ -19,5 +53,10 @@ echo '
'; endif; +echo "

test knitr with plot

"; + +echo $accordion; + +echo "

test simple function

"; -echo $accordion; \ No newline at end of file +echo $accordion2; \ No newline at end of file From d9a44763a11aed3d180d77f0e2e58bf3cf07f2f8 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Mon, 4 Nov 2013 10:57:32 +0100 Subject: [PATCH 5/8] annoying duplicated git repo stuff --- documentation/Example files/all_widgets.xls | Bin 49664 -> 49664 bytes webroot/assets/main.css | 65 +++++++++++++++++++- webroot/assets/main.js | 24 +++++++- 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/documentation/Example files/all_widgets.xls b/documentation/Example files/all_widgets.xls index 9135c4eeb9c4d652a23bf2499290da40729ea05c..9e0b210dba927a68d5928ee83014c0b996e3666e 100644 GIT binary patch delta 21 ccmZo@VQy$)-jKt>)>!&MP3y?!B9^|r09b7ZqW}N^ delta 21 ccmZo@VQy$)-jKt>CjWVkv~}<1B9^|r096DCIsgCw diff --git a/webroot/assets/main.css b/webroot/assets/main.css index 3b612df1a..1a6096a59 100755 --- a/webroot/assets/main.css +++ b/webroot/assets/main.css @@ -520,4 +520,67 @@ div.pos_changed input { .all-alerts { clear:both; -} \ No newline at end of file +} + +.btn { + background-color: transparent; + background-image: none; + border: #000 solid 1px; + color: #000; + text-shadow: none; +} +.btn:hover,.btn:active,.btn:focus { + background-color: #F0F0F0; + color: #000; +} +.btn-info { + background-color: transparent; + background-image: none; + border: #5BC0DE solid 1px; + color: #5BC0DE; + text-shadow: none; +} +.btn-info:hover,.btn-info:active,.btn-info:focus { + background-color: #DCF7FB; + color: #5BC0DE; +} +.btn-success { + background-color: transparent; + background-image: none; + border: #62c462 solid 1px; + color: #62c462; + text-shadow: none; +} +.btn-success:hover,.btn-success:active,.btn-success:focus { + background-color: #CFEACC; + color: #62c462; +} +.btn-danger { + background-color: transparent; + background-image: none; + border: #ee5f5b solid 1px; + color: #ee5f5b; + text-shadow: none; +} +.btn-danger:hover,.btn-danger:active,.btn-danger:focus { + background-color: #FFBBB6; + color: #ee5f5b; +} +.btn-warning { + background-color: transparent; + background-image: none; + border: #fbb450 solid 1px; + color: #fbb450; + text-shadow: none; +} +.btn-warning:hover,.btn-warning:active,.btn-warning:focus { + background-color: #FDEFD9; + color: #fbb450; +} +.form-horizontal .item-submit .controls +{ + padding-top:10px; + padding-bottom:10px; +} +.bigdrop.select2-container .select2-results {max-height: 300px;} +.bigdrop .select2-results {max-height: 300px;} \ No newline at end of file diff --git a/webroot/assets/main.js b/webroot/assets/main.js index 37e76a415..66958027a 100644 --- a/webroot/assets/main.js +++ b/webroot/assets/main.js @@ -220,7 +220,29 @@ $(document).ready(function() { maximumInputLength: slct.attr('data-select2maximumInputLength'), data: slctdata, multiple: !!slct.prop('multiple'), - allowClear: true + allowClear: true, + escapeMarkup: function (m) { return m; } + }); + }); + $(".select2pills select").each(function(i,elm) + { + var slct = $(elm); + slct.select2({ + width:400, + dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller + maximumSelectionSize: slct.attr('data-select2maximumSelectionSize'), + maximumInputLength: slct.attr('data-select2maximumInputLength'), + formatResult: function(pill) { + var markup = ""; + markup += ""; + markup += "
"+pill.text+"
" + pill.text + "
"; + markup += "
" + return markup; + }, + formatSelection: function (pill) { + return pill.text; + }, + escapeMarkup: function (m) { return m; } }); }); From a461b99cb9b041f8b7c6683e794e15f5c6a65407 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Mon, 4 Nov 2013 19:05:29 +0100 Subject: [PATCH 6/8] substitutions as a separate option for surveys are gone, closes #24, because it is now possible to dynamically evaluate knitr mixed with markdown for survey item and choice labels also switched pause and time branch to R, am not happy with how they deal with missing values yet, should probably switch the entire time logic to R when we have time, closes #2 also changed the schema to pave the way to fixing these issues #3, #1 I am closing #15 for now, because it was fairly easy to support figure attachments in emails using a custom image upload function in knitr (closes #25) some other cleanup as well --- Model/Branch.php | 2 +- Model/Email.php | 4 +- Model/Item.php | 23 ++- Model/OpenCPU.php | 12 +- Model/Pause.php | 162 ++++++++++------ Model/Run.php | 25 ++- Model/RunUnit.php | 6 +- Model/Site.php | 45 +++++ Model/SpreadsheetReader.php | 14 -- Model/Study.php | 132 ++++--------- Model/Survey.php | 121 +++++------- Model/TimeBranch.php | 183 +++++++++++------- README.md | 13 +- View/acp_nav.php | 16 +- documentation/Example files/all_widgets.xls | Bin 53248 -> 51712 bytes formr_scheme.mwb | Bin 37840 -> 37053 bytes formr_scheme.mwb.bak | Bin 37644 -> 37056 bytes schema.sql | 112 ++++------- webroot/admin/add_study.php | 4 +- webroot/admin/index.php | 2 +- webroot/admin/run/user_detail.php | 10 +- webroot/admin/run/user_overview.php | 2 +- .../survey/brainstorm_email_reminder.mdown | 46 ----- webroot/admin/survey/delete_study.php | 2 +- webroot/admin/survey/edit_substitutions.php | 62 ------ webroot/admin/survey/show_item_table.php | 3 +- webroot/admin/survey/study_added.php | 3 +- 27 files changed, 452 insertions(+), 552 deletions(-) delete mode 100644 webroot/admin/survey/brainstorm_email_reminder.mdown delete mode 100755 webroot/admin/survey/edit_substitutions.php diff --git a/Model/Branch.php b/Model/Branch.php index fd73ccd13..d717719b2 100644 --- a/Model/Branch.php +++ b/Model/Branch.php @@ -131,7 +131,7 @@ public function test() )); echo " - {$row['session']} ({$row['position']}) + ".$row['session']." ({$row['position']}) ".stringBool($openCPU->evaluate($this->condition) )." "; endforeach; diff --git a/Model/Email.php b/Model/Email.php index b3c166889..a533f0345 100644 --- a/Model/Email.php +++ b/Model/Email.php @@ -285,9 +285,9 @@ public function test() $this->dataNeeded($this->dbh,$this->recipient_field) )); $email = stringBool($openCPU->evaluate($this->recipient_field) ); - $good = filter_var( $email, FILTER_VALIDATE_EMAIL) ? '' : 'warning'; + $good = filter_var( $email, FILTER_VALIDATE_EMAIL) ? '' : 'text-warning'; echo " - {$row['session']} ({$row['position']}) + ".$row['session']." ({$row['position']}) ".$email." "; endforeach; diff --git a/Model/Item.php b/Model/Item.php index 25845ee49..674cb23c8 100644 --- a/Model/Item.php +++ b/Model/Item.php @@ -12,10 +12,10 @@ function __construct($choice_lists) public function make($item) { $type = $item['type']; - if(isset($item['choice_list']) AND $item['choice_list']): - if(isset($this->choice_lists[ $item['choice_list'] ])): - $item['choices'] = $this->choice_lists[ $item['choice_list'] ]; - $this->used_choice_lists[ $item['choice_list'] ] = true; + if(isset($item['choice_list']) AND $item['choice_list']): // if it has choices + if(isset($this->choice_lists[ $item['choice_list'] ])): // if this choice_list exists + $item['choices'] = $this->choice_lists[ $item['choice_list'] ]; // take it + $this->used_choice_lists[ $item['choice_list'] ] = true; // check it as used else: $item['val_errors'] = array(__("Choice list %s does not exist, but is specified for item %s", $item['choice_list'], $item['name'])); endif; @@ -56,6 +56,7 @@ class Item extends HTML_element public $type_options = null; public $choice_list = null; public $label = null; + public $label_parsed = null; public $optional = 0; public $class = null; public $skipif = null; @@ -91,6 +92,7 @@ public function __construct($options = array()) $this->name = $options['name']; $this->label = isset($options['label'])?$options['label']:''; + $this->label_parsed = isset($options['label_parsed'])?$options['label_parsed']:null; if(isset($options['type_options'])): $this->type_options = $options['type_options']; @@ -299,9 +301,6 @@ public function viewedBy($view_update) { $view_update->execute() or die(print_r($view_update->errorInfo(), true)); } - public function substituteText($substitutions) { - $this->label = str_replace($substitutions['search'], $substitutions['replace'], $this->label); - } public function validateInput($reply) { $this->reply = $reply; @@ -325,7 +324,7 @@ protected function render_label() return ' + $this->label_parsed . ' '; } protected function render_prepended () @@ -766,7 +765,7 @@ protected function render_inner() { return '
classes_label) .'">'. - $this->label. + $this->label_parsed. '
'; } @@ -794,7 +793,7 @@ public function validateInput($reply) protected function render_input() { return - ''; + ''; } protected function render_label() { @@ -835,7 +834,7 @@ protected function render_label() return '
classes_label) .'">' . ($this->error ? ' ' : ''). - $this->label . '
+ $this->label_parsed . '
'; } protected function render_input() @@ -940,7 +939,7 @@ protected function render_label() return ' + $this->label_parsed . ' '; } public function validateInput($reply) diff --git a/Model/OpenCPU.php b/Model/OpenCPU.php index 99c0f8962..e1a5fc307 100644 --- a/Model/OpenCPU.php +++ b/Model/OpenCPU.php @@ -192,17 +192,21 @@ public function knitEmail($source) } public function debugCall($results) { - list($header, $results) = explode("\r\n\r\n", $results, 2); + $header = substr($results, 0, $this->header_size); + $results = substr($results, $this->header_size); +## list($header, $results) = explode("\r\n\r\n", $results, 2); # does not work with 100 Continue if($this->http_status > 302): $response = array( 'Response' => '
'. htmlspecialchars($results). '
', 'HTTP headers' => '
'. htmlspecialchars($header). '
', ); else: + $header_parsed = http_parse_headers($header); $available = explode("\n",$results); - - $session = explode('/',$available[0]); - $session = '/'.$session[1].'/'.$session[2] .'/'.$session[3] . '/'; + + $session = '/ocpu/tmp/'. $header_parsed['X-ocpu-session'] . '/'; +# $session = explode('/',$available[0]); +# $session = '/'.$session[1].'/'.$session[2] .'/'.$session[3] . '/'; // info/text stdout/text console/text R/.val/text $response = array(); diff --git a/Model/Pause.php b/Model/Pause.php index 3978103e9..0ebec0287 100644 --- a/Model/Pause.php +++ b/Model/Pause.php @@ -127,96 +127,136 @@ public function removeFromRun($run_id) { return $this->delete(); } - public function test() { + echo "

Pause message

"; + + echo $this->getParsedBodyAdmin($this->body); + + echo "

Pause relative to

"; + if($this->relative_to=== null OR trim($this->relative_to)=='') { $this->relative_to = 'survey_unit_sessions$created'; } + + $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id,`survey_run_sessions`.position FROM `survey_run_sessions` + + WHERE + `survey_run_sessions`.run_id = :run_id + + ORDER BY `survey_run_sessions`.position DESC,RAND() + + LIMIT 20"; + $get_sessions = $this->dbh->prepare($q); // should use readonly + $get_sessions->bindParam(':run_id',$this->run_id); + + $get_sessions->execute() or die(print_r($get_sessions->errorInfo(), true)); + if($get_sessions->rowCount()>=1): + $results = array(); + while($temp = $get_sessions->fetch()) + $results[] = $temp; + else: + echo 'No data to compare to yet.'; + return false; + endif; + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = current($results)['id']; $openCPU->addUserData($this->getUserDataInRun( $this->dataNeeded($this->dbh,$this->relative_to) )); + + echo $openCPU->evaluateAdmin($this->relative_to); - $relative_to = $openCPU->evaluate($this->relative_to); + echo ' + + + + + + "'; + + foreach($results AS $row): + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = $row['id']; + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + + $relative_to = $openCPU->evaluate($this->relative_to); + if($relative_to !== null): - $conditions = array(); - if($this->wait_minutes AND $this->wait_minutes!='') - $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; - if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') - $conditions['date'] = "CURDATE() >= :wait_date"; - if($this->wait_until_time AND $this->wait_until_time != '00:00:00') - $conditions['time'] = "CURTIME() >= :wait_time"; + $conditions = array(); + if($this->wait_minutes AND $this->wait_minutes!='') + $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; + if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') + $conditions['date'] = "CURDATE() >= :wait_date"; + if($this->wait_until_time AND $this->wait_until_time != '00:00:00') + $conditions['time'] = "CURTIME() >= :wait_time"; - if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) - $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; + if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) + $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; - if(!empty($conditions)): - $condition = implode($conditions," AND "); + if(!empty($conditions)): + $condition = implode($conditions," AND "); - $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); + $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); -$q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` + $q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` + + left join `survey_unit_sessions` + on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id -WHERE - `survey_run_sessions`.run_id = :run_id + WHERE + `survey_run_sessions`.id = :run_session_id AND + :relative_to3 IS NOT NULL -ORDER BY IF(ISNULL($order),1,0), RAND() + ORDER BY IF(ISNULL($order),1,0), RAND() -LIMIT 1"; + LIMIT 1"; - echo "
$q
"; - $evaluate = $this->dbh->prepare($q); // should use readonly - if(isset($conditions['minute'])): - $evaluate->bindParam(':wait_minutes',$this->wait_minutes); - $evaluate->bindParam(':wait_minutes2',$this->wait_minutes); - endif; - if(isset($conditions['date'])): - $evaluate->bindParam(':wait_date',$this->wait_until_date); - $evaluate->bindParam(':wait_date2',$this->wait_until_date); - endif; - if(isset($conditions['time'])): - $evaluate->bindParam(':wait_time',$this->wait_until_time); - $evaluate->bindParam(':wait_time2',$this->wait_until_time); - endif; - $evaluate->bindParam(':relative_to',$relative_to); - $evaluate->bindParam(':relative_to2',$relative_to); - $evaluate->bindParam(':run_id',$this->run_id); + $evaluate = $this->dbh->prepare($q); // should use readonly + if(isset($conditions['minute'])): + $evaluate->bindParam(':wait_minutes',$this->wait_minutes); + $evaluate->bindParam(':wait_minutes2',$this->wait_minutes); + endif; + if(isset($conditions['date'])): + $evaluate->bindParam(':wait_date',$this->wait_until_date); + $evaluate->bindParam(':wait_date2',$this->wait_until_date); + endif; + if(isset($conditions['time'])): + $evaluate->bindParam(':wait_time',$this->wait_until_time); + $evaluate->bindParam(':wait_time2',$this->wait_until_time); + endif; + $evaluate->bindParam(':relative_to',$relative_to); + $evaluate->bindParam(':relative_to2',$relative_to); + $evaluate->bindParam(':relative_to3',$relative_to); + $evaluate->bindParam(':run_session_id',$this->run_session_id); - $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); - if($evaluate->rowCount()>=1): - $results = array(); - while($temp = $evaluate->fetch()) - $results[] = $temp; + $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); + if($evaluate->rowCount()===1): + $temp = $evaluate->fetch(); + $result = $temp['test']; + endif; else: - echo 'Nothing found'; - return false; + $result = true; endif; - else: - $result = true; - endif; - - echo '
CodeRelative toTest
- - - - - "'; - foreach($results AS $row): + else: + $result = null; + endif; + echo " - - + + + "; + endforeach; echo '
CodeTest
{$row['session']}".h((int)$row['test'])."".$row['session']." ({$row['position']})".stringBool($relative_to )."".stringBool($result )."
'; - - echo "

Pause message

"; - - echo $this->getParsedBodyAdmin($this->body); } public function exec() { @@ -249,6 +289,8 @@ public function exec() $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); $q = "SELECT ( {$condition} ) AS test FROM `survey_run_sessions` + left join `survey_unit_sessions` + on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id WHERE `survey_run_sessions`.`id` = :run_session_id diff --git a/Model/Run.php b/Model/Run.php index 8b791ad81..b3f9fdb77 100644 --- a/Model/Run.php +++ b/Model/Run.php @@ -27,7 +27,7 @@ class Run public $valid = false; public $public = false; public $cron_active = false; - private $api_secret = null; + private $api_secret_hash = null; public $settings = array(); public $errors = array(); public $messages = array(); @@ -39,7 +39,7 @@ public function __construct($fdb, $name, $options = null) if($name !== null OR ($name = $this->create($options))): $this->name = $name; - $run_data = $this->dbh->prepare("SELECT id,user_id,name,api_secret,public,cron_active FROM `survey_runs` WHERE name = :run_name LIMIT 1"); + $run_data = $this->dbh->prepare("SELECT id,user_id,name,api_secret_hash,public,cron_active FROM `survey_runs` WHERE name = :run_name LIMIT 1"); $run_data->bindParam(":run_name",$this->name); $run_data->execute() or die(print_r($run_data->errorInfo(), true)); $vars = $run_data->fetch(PDO::FETCH_ASSOC); @@ -47,7 +47,7 @@ public function __construct($fdb, $name, $options = null) if($vars): $this->id = $vars['id']; $this->user_id = $vars['user_id']; - $this->api_secret = $vars['api_secret']; + $this->api_secret_hash = $vars['api_secret_hash']; $this->public = $vars['public']; $this->cron_active = $vars['cron_active']; @@ -80,12 +80,12 @@ public function getCronDues() public function getApiSecret($user) { if($user->isAdmin()) - return $this->api_secret; + return $this->api_secret_hash; return false; } public function hasApiAccess($secret) { - return $this->api_secret === $secret; + return $this->api_secret_hash === $secret; } public function delete() @@ -130,11 +130,11 @@ public function create($options) endif; $this->dbh->beginTransaction(); - $create = $this->dbh->prepare("INSERT INTO `survey_runs` (user_id, name, api_secret) VALUES (:user_id, :name, :api_secret);"); + $create = $this->dbh->prepare("INSERT INTO `survey_runs` (user_id, name, api_secret_hash) VALUES (:user_id, :name, :api_secret_hash);"); $create->bindParam(':user_id',$options['user_id']); $create->bindParam(':name',$name); $new_secret = bin2hex(openssl_random_pseudo_bytes(32)); - $create->bindParam(':api_secret',$new_secret); + $create->bindParam(':api_secret_hash',$new_secret); $create->execute() or die(print_r($create->errorInfo(), true)); $this->dbh->commit(); @@ -190,8 +190,15 @@ public function getUnitAdmin($id) { $g_unit = $this->dbh->prepare( "SELECT - `survey_run_units`.*, - `survey_units`.* + `survey_run_units`.id, + `survey_run_units`.run_id, + `survey_run_units`.unit_id, + `survey_run_units`.position, + + `survey_units`.id, + `survey_units`.type, + `survey_units`.created, + `survey_units`.modified FROM `survey_run_units` diff --git a/Model/RunUnit.php b/Model/RunUnit.php index fa4eacd43..598ef36d5 100644 --- a/Model/RunUnit.php +++ b/Model/RunUnit.php @@ -102,7 +102,7 @@ public function delete() $d_unit->execute() or $this->errors = $d_unit->errorInfo(); $affected = $d_unit->rowCount(); - if($affected): + if($affected): // remove from all runs $d_run_unit = $this->dbh->prepare("DELETE FROM `survey_run_units` WHERE unit_id = :id;"); $d_run_unit->bindParam(':id', $this->id); $d_run_unit->execute() or $this->errors = $d_run_unit->errorInfo(); @@ -174,7 +174,7 @@ public function displayForRun($prepend = '') protected function getUserDataInRun($surveys) { $results = array(); - foreach($surveys AS $survey_name): + foreach($surveys AS $survey_name): // fixme: shouldnt be using wildcard operator here. $q1 = "SELECT `survey_run_sessions`.session, `$survey_name`.* FROM `$survey_name` "; @@ -228,7 +228,7 @@ protected function makeOpenCPU() $openCPU = new OpenCPU($settings['opencpu_instance']); return $openCPU; } - private function knittingNeeded($source) + protected function knittingNeeded($source) { if(strpos($source,'`r ')!==false OR strpos($source,'```{r')!==false) return true; diff --git a/Model/Site.php b/Model/Site.php index 727d4d330..8f10551cd 100644 --- a/Model/Site.php +++ b/Model/Site.php @@ -340,4 +340,49 @@ function stringBool($x) elseif($x===null) return 'null'; elseif($x===0) return '0'; else return $x; +} + + + +if (!function_exists('http_parse_headers')) +{ + function http_parse_headers($raw_headers) + { + $headers = array(); + $key = ''; // [+] + + foreach(explode("\n", $raw_headers) as $i => $h) + { + $h = explode(':', $h, 2); + + if (isset($h[1])) + { + if (!isset($headers[$h[0]])) + $headers[$h[0]] = trim($h[1]); + elseif (is_array($headers[$h[0]])) + { + // $tmp = array_merge($headers[$h[0]], array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1]))); // [+] + } + else + { + // $tmp = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [+] + } + + $key = $h[0]; // [+] + } + else // [+] + { // [+] + if (substr($h[0], 0, 1) == "\t") // [+] + $headers[$key] .= "\r\n\t".trim($h[0]); // [+] + elseif (!$key) // [+] + $headers[0] = trim($h[0]); // [+] + } // [+] + } + + return $headers; + } } \ No newline at end of file diff --git a/Model/SpreadsheetReader.php b/Model/SpreadsheetReader.php index a00ae4758..8f85ec870 100644 --- a/Model/SpreadsheetReader.php +++ b/Model/SpreadsheetReader.php @@ -1,8 +1,4 @@ $val

"): -# $val = $markdown; -# endif; - - if(substr_count($markdown,"

")===1 AND preg_match("@^

(.+)

$@",trim($markdown),$matches)): - $val = $matches[1]; - else: - $val = $markdown; - endif; elseif($col == 'optional'): if($val==='*') $val = 1; elseif($val==='!') $val = 0; diff --git a/Model/Study.php b/Model/Study.php index 04339290d..23d3d49b9 100644 --- a/Model/Study.php +++ b/Model/Study.php @@ -2,6 +2,7 @@ require_once INCLUDE_ROOT . "Model/DB.php"; require_once INCLUDE_ROOT . "Model/RunUnit.php"; require_once INCLUDE_ROOT."Model/Item.php"; +use \Michelf\Markdown AS Markdown; // this is actually just the admin side of the survey thing, but because they have different DB layers, it may make sense to keep thems separated class Study extends RunUnit @@ -136,10 +137,10 @@ public function create($type = null) return true; } protected $user_defined_columns = array( - 'name', 'label', 'type', 'type_options', 'choice_list', 'optional', 'class' ,'skipif' // study_id is not among the user_defined columns + 'name', 'label', 'label_parsed', 'type', 'type_options', 'choice_list', 'optional', 'class' ,'skipif' // study_id is not among the user_defined columns ); protected $choices_user_defined_columns = array( - 'list_name', 'name', 'label' // study_id is not among the user_defined columns + 'list_name', 'name', 'label', 'label_parsed' // study_id is not among the user_defined columns ); protected function getChoices() { @@ -175,6 +176,7 @@ public function createSurvey($SPR) { study_id, name, label, + label_parsed, type, type_options, choice_list, @@ -185,6 +187,7 @@ class, :study_id, :name, :label, + :label_parsed, :type, :type_options, :choice_list, @@ -216,6 +219,16 @@ class, $this->errors = $this->errors + $val_errors; unset($this->SPR->survey[$row_number]); continue; + else: + if(!$this->knittingNeeded($item->label)): // if the parsed label is constant + $markdown = Markdown::defaultTransform($item->label); // transform upon insertion into db instead of at runtime + + if(substr_count($markdown,"

")===1 AND preg_match("@^

(.+)

$@",trim($markdown),$matches)): + $item->label_parsed = $matches[1]; + else: + $item->label_parsed = $markdown; + endif; + endif; endif; endif; @@ -286,17 +299,29 @@ private function addChoices() study_id, list_name, name, - label + label, + label_parsed ) VALUES ( :study_id, :list_name, :name, - :label + :label, + :label_parsed )'); $add_choices->bindParam(":study_id", $this->id); foreach($this->SPR->choices AS $choice) { + if(!$this->knittingNeeded( $choice['label'] )): // if the parsed label is constant + $markdown = Markdown::defaultTransform($choice['label']); // transform upon insertion into db instead of at runtime + + if(substr_count($markdown,"

")===1 AND preg_match("@^

(.+)

$@",trim($markdown),$matches)): + $choice['label_parsed'] = $matches[1]; + else: + $choice['label_parsed'] = $markdown; + endif; + endif; + foreach ($this->choices_user_defined_columns as $param) { $add_choices->bindParam(":$param", $choice[ $param ]); @@ -400,7 +425,7 @@ public function countResults() return $row['count']; } public function getResults() - { + { // fixme: shouldnt be using wildcard operator here. $get = "SELECT `survey_run_sessions`.session, `{$this->name}`.* FROM `{$this->name}` LEFT JOIN `survey_unit_sessions` ON `{$this->name}`.session_id = `survey_unit_sessions`.id @@ -415,7 +440,17 @@ public function getResults() } public function getItemDisplayResults() { - $get = "SELECT `survey_run_sessions`.session,`survey_items`.name, `survey_items_display`.* FROM `survey_items_display` + $get = "SELECT `survey_run_sessions`.session,`survey_items`.name, + `survey_items_display`.id, + `survey_items_display`.item_id, + `survey_items_display`.session_id, + `survey_items_display`.created, + `survey_items_display`.modified, + `survey_items_display`.answered_time, + `survey_items_display`.answered, + `survey_items_display`.displaycount + + FROM `survey_items_display` LEFT JOIN `survey_unit_sessions` ON `survey_unit_sessions`.id = `survey_items_display`.session_id @@ -482,84 +517,6 @@ public function getResultCount() return array('finished' => 0, 'begun' => 0); endif; } - - public function getSubstitutions() - { - $subs_query = $this->dbh->prepare ( "SELECT * FROM `survey_substitutions` WHERE `study_id` = :study_id ORDER BY id ASC" ) or die(print_r($this->dbh->errorInfo(), true)); // get all substitutions - - $subs_query->bindParam(':study_id',$this->id); - $subs_query->execute() or die(print_r($subs_query->errorInfo(), true)); // get all substitutions - - - $substitutions = array(); - while( $substitution = $subs_query->fetch() ) - $substitutions[] = $substitution; - - return $substitutions; - - } - public function editSubstitutions($posted) - { - $posted = array_unique($posted, SORT_REGULAR); -/* function addPrefix(&$arr,$key,$study_name) - { - if(isset($arr['replace']) AND !preg_match( - "/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/" - ,$arr['replace']) AND - preg_match( - "/^[a-zA-Z0-9_]+$/" - ,$arr['replace'])) - $arr['replace'] = $study_name . '.' . $arr['replace']; - if(isset($arr['replace']) AND !preg_match( - "/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/" - ,$arr['replace'])) - $arr['replace'] = 'invalid'; - } - array_walk($posted,"addPrefix",$this->name);*/ - if(isset($posted['new']) AND $posted['new']['search'] != '' AND $posted['new']['replace'] != ''): - - $sub_add = $this->dbh->prepare ( "INSERT INTO `survey_substitutions` - SET - `study_id` = :study_id, - `search` = :search, - `replace` = :replace, - `mode` = :mode - " ) or die(print_r($this->dbh->errorInfo(), true)); - - $sub_add->bindParam(':study_id',$this->id); - $sub_add->bindParam(':mode',$posted['new']['mode']); - $sub_add->bindParam(':search',$posted['new']['search']); - $sub_add->bindParam(':replace',$posted['new']['replace']); - $sub_add->execute() or die(print_r($sub_add->errorInfo(), true)); - - unset($posted['new']); - endif; - - $sub_update = $this->dbh->prepare ( "UPDATE `survey_substitutions` - SET - `search` = :search, - `replace` = :replace, - `mode` = :mode - WHERE `study_id` = :study_id AND id = :id" ) or die(print_r($this->dbh->errorInfo(), true)); - $sub_update->bindParam(':study_id',$this->id); - - $sub_delete = $this->dbh->prepare ( "DELETE FROM `survey_substitutions` - WHERE `study_id` = :study_id AND id = :id" ) or die(print_r($this->dbh->errorInfo(), true)); - $sub_delete->bindParam(':study_id',$this->id); - - foreach($posted AS $id => $val): - if(isset($val['delete'])): - $sub_delete->bindParam(':id',$id); - $sub_delete->execute() or die(print_r($sub_delete->errorInfo(), true)); - elseif(is_array($val) AND isset($val['search']) AND $val['search']!= '' AND $val['replace']!=''): - $sub_update->bindParam(':id',$id); - $sub_update->bindParam(':search',$val['search']); - $sub_update->bindParam(':replace',$val['replace']); - $sub_update->bindParam(':mode',$val['mode']); - $sub_update->execute() or die(print_r($sub_update->errorInfo(), true)); - endif; - endforeach; - } public function getAverageTimeItTakes() { $get = "SELECT AVG( ended - created) FROM `{$this->name}`"; @@ -571,14 +528,9 @@ public function getAverageTimeItTakes() } public function delete() { - $this->dbh->beginTransaction() or die(print_r($this->dbh->errorInfo(), true)); $delete_results = $this->dbh->query("DROP TABLE IF EXISTS `{$this->name}`") or die(print_r($this->dbh->errorInfo(), true)); - $delete_study = $this->dbh->prepare("DELETE FROM `survey_studies` WHERE id = :study_id") or die(print_r($this->dbh->errorInfo(), true)); // Cascades - $delete_study->bindParam(':study_id',$this->id); - $delete_study->execute() or die(print_r($delete_study->errorInfo(), true)); - - $this->dbh->commit(); + return parent::delete(); } public function displayForRun($prepend = '') { diff --git a/Model/Survey.php b/Model/Survey.php index 796b881aa..127302deb 100644 --- a/Model/Survey.php +++ b/Model/Survey.php @@ -2,6 +2,7 @@ require_once INCLUDE_ROOT."Model/DB.php"; require_once INCLUDE_ROOT."Model/Item.php"; require_once INCLUDE_ROOT."Model/RunUnit.php"; +use \Michelf\Markdown AS Markdown; class Survey extends RunUnit { public $id = null; @@ -189,16 +190,32 @@ protected function getProgress() { } protected function getChoices() { - $get_item_choices = $this->dbh->prepare("SELECT list_name, name, label FROM `survey_item_choices` WHERE `survey_item_choices`.study_id = :study_id + $get_item_choices = $this->dbh->prepare("SELECT list_name, name, label, label_parsed FROM `survey_item_choices` WHERE `survey_item_choices`.study_id = :study_id ORDER BY `survey_item_choices`.id ASC;"); $get_item_choices->bindParam(":study_id", $this->id); // delete cascades to item display $get_item_choices->execute() or die(print_r($get_item_choices->errorInfo(), true)); $choice_lists = array(); while($row = $get_item_choices->fetch(PDO::FETCH_ASSOC)): - if(!isset($choice_lists[ $row['list_name'] ])) + if(!isset($choice_lists[ $row['list_name'] ])): $choice_lists[ $row['list_name'] ] = array(); + endif; - $choice_lists[ $row['list_name'] ][$row['name']] = $row['label']; + if($row['label_parsed'] === null): + $openCPU = $this->makeOpenCPU(); + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh, $row['label']) + )); + + $markdown = $openCPU->knitForUserDisplay($row['label']); + + if(substr_count($markdown,"

")===1 AND preg_match("@^

(.+)

$@",trim($markdown),$matches)): // simple wraps are eliminated + $row['label_parsed'] = $matches[1]; + else: + $row['label_parsed'] = $markdown; + endif; + endif; + $choice_lists[ $row['list_name'] ][$row['name']] = $row['label_parsed']; endwhile; return $choice_lists; } @@ -206,9 +223,21 @@ protected function getNextItems() { $this->unanswered_batch = array(); $item_query = "SELECT - `survey_items`.*, + `survey_items`.id, + `survey_items`.study_id, + `survey_items`.type, + `survey_items`.choice_list, + `survey_items`.type_options, + `survey_items`.name, + `survey_items`.label, + `survey_items`.label_parsed, + `survey_items`.optional, + `survey_items`.class, + `survey_items`.skipif, + `survey_items_display`.displaycount, `survey_items_display`.session_id + FROM `survey_items` LEFT JOIN `survey_items_display` ON `survey_items_display`.session_id = :session_id @@ -291,7 +320,6 @@ protected function render_form_header() { protected function render_items() { $ret = ''; - $substitutions = $this->getSubstitutions(); $items = $this->unanswered_batch; $view_query = "INSERT INTO `survey_items_display` (item_id, session_id, displaycount, created, modified) @@ -341,19 +369,26 @@ protected function render_items() } } - // Gibt es Bedingungen, unter denen das Item alternativ formuliert wird? $item->viewedBy($view_update); $itemsDisplayed++; - if(!empty($substitutions['search'])) - { - $item->substituteText($substitutions); - } + if($item->label_parsed === null): // item label has to be dynamically generated with user data + $openCPU = $this->makeOpenCPU(); + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$item->label) + )); + $markdown = $openCPU->knitForUserDisplay($item->label); + + if(substr_count($markdown,"

")===1 AND preg_match("@^

(.+)

$@",trim($markdown),$matches)): // simple wraps are eliminated + $item->label_parsed = $matches[1]; + else: + $item->label_parsed = $markdown; + endif; + endif; - $ret .= $item->render(); -# $ret .= ''.key($items); // when the maximum number of items to display is reached, stop if ( @@ -371,10 +406,10 @@ protected function render_items() { if(isset($this->settings["submit_button_text"])): $sub_sets = array( - 'label' => $this->settings["submit_button_text"] + 'label_parsed' => $this->settings["submit_button_text"] ); else: - $sub_sets = array('label' => 'Weiter', 'class_input' => 'btn-info'); + $sub_sets = array('label_parsed' => 'Weiter', 'class_input' => 'btn-info'); endif; $item = new Item_submit($sub_sets); $ret .= $item->render(); @@ -387,65 +422,7 @@ protected function render_form_footer() { return ""; /* close form */ } - protected function getSubstitutions() - { - $subs_query = $this->dbh->prepare ( "SELECT `search`,`replace`,`mode` FROM `survey_substitutions` WHERE `study_id` = :study_id ORDER BY id DESC" ); // get all substitutions - - $subs_query->bindParam(':study_id',$this->id); - $subs_query->execute(); // get all substitutions - - - $search = $replace = array(); - - while( $substitution = $subs_query->fetch() ) - { - if(!$this->run_session_id): - alert('Information: You can only test substitutions within runs.','alert-info'); - else: - - if($substitution['mode']=='ASC'): - $mode = 'ASC'; - else: - $mode = 'DESC'; - endif; - - if(strpos($substitution['replace'], ".")===-1) - $substitution['replace'] = $this->results_table . "." . $substitution['replace']; - - $join = join_builder($this->dbh, $substitution['replace']); - $q = "SELECT ( {$substitution['replace']} ) AS `replace` FROM `survey_run_sessions` - - $join - - WHERE - `survey_run_sessions`.`id` = :run_session_id - - ORDER BY IF(ISNULL( ( {$substitution['replace']} ) ),1,0), `survey_unit_sessions`.id $mode - - LIMIT 1"; - $get_entered = $this->dbh->prepare($q); - - $get_entered->bindParam(":run_session_id",$this->run_session_id); - try - { - $get_entered->execute(); - } - catch(Exception $e) - { - echo __("Column %s not found.", $substitution['replace']); - print_r($e); - } - if( $data = $get_entered->fetch(PDO::FETCH_NUM)) - { - $search[] = $substitution['search']; - $replace[] = h($data[0]); - } - endif; - } - return array('search' => $search,'replace' => $replace); - } - public function end() { $post_form = $this->dbh->prepare("UPDATE diff --git a/Model/TimeBranch.php b/Model/TimeBranch.php index 275e5fc61..82b1ea52c 100644 --- a/Model/TimeBranch.php +++ b/Model/TimeBranch.php @@ -134,114 +134,160 @@ public function test() { if($this->relative_to=== null OR trim($this->relative_to)=='') { - $this->relative_to = '`survey_unit_sessions`.created'; + $this->relative_to = 'survey_unit_sessions$created'; } - $join = join_builder($this->dbh, $this->relative_to); - - - $conditions = array(); - if($this->wait_minutes AND $this->wait_minutes!='') - $conditions['minute'] = "DATE_ADD({$this->relative_to}, INTERVAL :wait_minutes MINUTE) <= NOW()"; - if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') - $conditions['date'] = "CURDATE() >= :wait_date"; - if($this->wait_until_time AND $this->wait_until_time != '00:00:00') - $conditions['time'] = "CURTIME() >= :wait_time"; + $q = "SELECT `survey_run_sessions`.session,`survey_run_sessions`.id,`survey_run_sessions`.position FROM `survey_run_sessions` - if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) - $conditions['date'] = "DATE_ADD({$this->relative_to}, INTERVAL 1 DAY) >= CURDATE()"; - - if(!empty($conditions)): - $condition = implode($conditions," AND "); - - - $order = str_replace(array(':wait_minutes',':wait_date','wait_time'),array(':wait_minutes2',':wait_date2','wait_time2'),$condition); - -$q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` + WHERE + `survey_run_sessions`.run_id = :run_id -$join + ORDER BY `survey_run_sessions`.position DESC,RAND() -WHERE - `survey_run_sessions`.run_id = :run_id + LIMIT 20"; + $get_sessions = $this->dbh->prepare($q); // should use readonly + $get_sessions->bindParam(':run_id',$this->run_id); -ORDER BY IF(ISNULL($order),1,0), RAND() - -LIMIT 20"; - - echo "
$q
"; - $evaluate = $this->dbh->prepare($q); // should use readonly - if(isset($conditions['minute'])): - $evaluate->bindParam(':wait_minutes',$this->wait_minutes); - $evaluate->bindParam(':wait_minutes2',$this->wait_minutes); - endif; - if(isset($conditions['date'])): - $evaluate->bindParam(':wait_date',$this->wait_until_date); - $evaluate->bindParam(':wait_date2',$this->wait_until_date); - endif; - if(isset($conditions['time'])): - $evaluate->bindParam(':wait_time',$this->wait_until_time); - $evaluate->bindParam(':wait_time2',$this->wait_until_time); - endif; - $evaluate->bindParam(':run_id',$this->run_id); - - $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); - if($evaluate->rowCount()>=1): - $results = array(); - while($temp = $evaluate->fetch()) - $results[] = $temp; - else: - echo 'Nothing found'; - return false; - endif; + $get_sessions->execute() or die(print_r($get_sessions->errorInfo(), true)); + if($get_sessions->rowCount()>=1): + $results = array(); + while($temp = $get_sessions->fetch()) + $results[] = $temp; else: - $result = true; + echo 'No data to compare to yet.'; + return false; endif; + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = current($results)['id']; + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + + echo $openCPU->evaluateAdmin($this->relative_to); + echo ' + "'; + foreach($results AS $row): + $openCPU = $this->makeOpenCPU(); + $this->run_session_id = $row['id']; + + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + + $relative_to = $openCPU->evaluate($this->relative_to); + if($relative_to !== null): + + $conditions = array(); + if($this->wait_minutes AND $this->wait_minutes!='') + $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; + if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') + $conditions['date'] = "CURDATE() >= :wait_date"; + if($this->wait_until_time AND $this->wait_until_time != '00:00:00') + $conditions['time'] = "CURTIME() >= :wait_time"; + + if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) + $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; + + if(!empty($conditions)): + $condition = implode($conditions," AND "); + + $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); + + $q = "SELECT DISTINCT ( {$condition} ) AS test,`survey_run_sessions`.session FROM `survey_run_sessions` + + left join `survey_unit_sessions` + on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id + + WHERE + `survey_run_sessions`.id = :run_session_id AND + :relative_to3 IS NOT NULL + + ORDER BY IF(ISNULL($order),1,0), RAND() + + LIMIT 1"; + + $evaluate = $this->dbh->prepare($q); // should use readonly + if(isset($conditions['minute'])): + $evaluate->bindParam(':wait_minutes',$this->wait_minutes); + $evaluate->bindParam(':wait_minutes2',$this->wait_minutes); + endif; + if(isset($conditions['date'])): + $evaluate->bindParam(':wait_date',$this->wait_until_date); + $evaluate->bindParam(':wait_date2',$this->wait_until_date); + endif; + if(isset($conditions['time'])): + $evaluate->bindParam(':wait_time',$this->wait_until_time); + $evaluate->bindParam(':wait_time2',$this->wait_until_time); + endif; + $evaluate->bindParam(':relative_to',$relative_to); + $evaluate->bindParam(':relative_to2',$relative_to); + $evaluate->bindParam(':relative_to3',$relative_to); + $evaluate->bindParam(':run_session_id',$this->run_session_id); + + $evaluate->execute() or die(print_r($evaluate->errorInfo(), true)); + if($evaluate->rowCount()===1): + $temp = $evaluate->fetch(); + $result = $temp['test']; + endif; + else: + $result = true; + endif; + else: + $result = null; + endif; + echo " - - + + + "; + endforeach; echo '
CodeRelative to Test
{$row['session']}".h((int)$row['test'])."".$row['session']." ({$row['position']})".stringBool($relative_to )."".stringBool($result )."
'; - } public function exec() { if($this->relative_to=== null OR trim($this->relative_to)=='') { - $this->relative_to = '`survey_unit_sessions`.created'; + $this->relative_to = 'survey_unit_sessions$created'; } - $join = join_builder($this->dbh, $this->relative_to); - + $openCPU = $this->makeOpenCPU(); + $openCPU->addUserData($this->getUserDataInRun( + $this->dataNeeded($this->dbh,$this->relative_to) + )); + $relative_to = $openCPU->evaluate($this->relative_to); + $conditions = array(); if($this->wait_minutes AND $this->wait_minutes!='') - $conditions['minute'] = "DATE_ADD({$this->relative_to}, INTERVAL :wait_minutes MINUTE) <= NOW()"; + $conditions['minute'] = "DATE_ADD(:relative_to, INTERVAL :wait_minutes MINUTE) <= NOW()"; if($this->wait_until_date AND $this->wait_until_date != '0000-00-00') $conditions['date'] = "CURDATE() >= :wait_date"; if($this->wait_until_time AND $this->wait_until_time != '00:00:00') $conditions['time'] = "CURTIME() >= :wait_time"; if(isset($conditions['time']) AND !isset($conditions['date']) AND !isset($conditions['minute'])) - $conditions['date'] = "DATE_ADD({$this->relative_to}, INTERVAL 1 DAY) >= CURDATE()"; + $conditions['date'] = "DATE_ADD(:relative_to, INTERVAL 1 DAY) >= CURDATE()"; if(!empty($conditions)): $condition = implode($conditions," AND "); - - $order = str_replace(array(':wait_minutes',':wait_date','wait_time'),array(':wait_minutes2',':wait_date2','wait_time2'),$condition); + + $order = str_replace(array(':wait_minutes',':wait_date',':wait_time',':relative_to'),array(':wait_minutes2',':wait_date2',':wait_time2',':relative_to2'),$condition); $q = "SELECT ( {$condition} ) AS test FROM `survey_run_sessions` - - $join + left join `survey_unit_sessions` + on `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id WHERE `survey_run_sessions`.`id` = :run_session_id @@ -249,7 +295,6 @@ public function exec() ORDER BY IF(ISNULL( ( {$order} ) ),1,0), `survey_unit_sessions`.id DESC LIMIT 1"; -# pr($q); $evaluate = $this->dbh->prepare($q); // should use readonly if(isset($conditions['minute'])): $evaluate->bindParam(':wait_minutes',$this->wait_minutes); @@ -263,6 +308,8 @@ public function exec() $evaluate->bindParam(':wait_time',$this->wait_until_time); $evaluate->bindParam(':wait_time2',$this->wait_until_time); endif; + $evaluate->bindParam(':relative_to',$relative_to); + $evaluate->bindParam(':relative_to2',$relative_to); $evaluate->bindParam(":run_session_id", $this->run_session_id); @@ -276,7 +323,7 @@ public function exec() else: $result = true; endif; - + $position = $result ? $this->if_true : $this->if_false; diff --git a/README.md b/README.md index 475b4d5fc..5b77178c8 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Survey names may only contain the characters `a-zA-Z0-9_` and need to start with Surveys support the following item types. HTML5 form elements and validation are used and polyfilled where necessary using the [Webshims lib](http://afarkas.github.io/webshim/demos/index.html). * `instruction` display text. instructions are displayed at least once and disappear only when there are no unanswered items left behind them (so putting an instruction directly before another ensures it will be displayed only once) -* `submit` display a submit button. No items are displayed after the submit button, until all of the ones preceding it have been answered. This is useful for pagination and to ensure that answers required for `skipif` or substitutions have been given. +* `submit` display a submit button. No items are displayed after the submit button, until all of the ones preceding it have been answered. This is useful for pagination and to ensure that answers required for `skipif` or for dynamically generating item text have been given. * multiple choice family * `mc` multipe choice (radio buttons), you can choose only one. Choices are (currently) defined using the choice1-12 columns * `mmc` multiple multiple choice (check boxes), you can choose several. Choices defined as above @@ -155,22 +155,11 @@ If you get internal server errors, these most likely stem from .htaccess files o ## Problems and plans ### Security -#### Database -End user input should be safe, we use prepared queries etc. - -However, study creators can wreak havoc, because they can write SQL expressions for skipIfs, substitutions, branches, etc. -A future version will rely on OpenCPU's R API to sandbox these problems. #### API * you can create run access tokens using the API * you can end "External" units using the API -### Plans -* Todo: Should allow a "service message" to be displayed in runs, to make run completely inactive. -* Todo: Switch user-supplied run logic to R instead of SQL. -* Todo: Should be storing an API key hash, not the API key itself. - - ## Credit ### Author: diff --git a/View/acp_nav.php b/View/acp_nav.php index 69e9f2f52..5cf2539f4 100644 --- a/View/acp_nav.php +++ b/View/acp_nav.php @@ -24,11 +24,11 @@
  • >
  • -
  • - getStudies(); if($studies) { + echo '
  • '; + foreach($studies as $menu_study) { echo "
  • ".$menu_study['name']." @@ -48,11 +48,12 @@
  • - - -
  • > - Edit substitutions -
  • -
  • > diff --git a/documentation/Example files/all_widgets.xls b/documentation/Example files/all_widgets.xls index 7e4a58f2468f542a7e5220aa484560b4eb4459e0..9cf4ff031ddfbf0d953b35934640cafa8254e03b 100644 GIT binary patch delta 8410 zcmd^EYjjlA72bDd@|qA5-V-A*A%qYfdGN?M7{r8tB*g$@7S{ZEtky1TmBm_WKo?B+-uKK&LRZ^g zCO;e&_uTKC{eAm!&bjvnVAT4e&7%3^S(YQ3h+2Cd?wIn3ttb1pC2v2|`>yD- z9o3TJg3Yk>PmkY|wNukT{3*L$ON)-2(*JUGh}UxRc+3$`<#brYXLfQQ^*Pap&xgreXllzzL9xH}tdo-1%pi33H$p`xgUTX?9cpf!vvJAY;ef zEl_&JIZyo4**-h<&%wV%;-=Dv6o`LV`i5l`y|!?UrjYo3`541Ji>fR_RL&CjIi_nH z#KVpnZKHUgavot(QQ0G&aLkH7SNZt#nYFi)?`+Wb_U#MoAAmy0dQfby@3LI)h`(O{ z3oU-)nsWv5XE(oN6~(hb=ppA`G!ERor!S!EWb5qd4hEe4cLbcF-hi|7 z_Ru~=A?MEhy`8(e{hd8M`;pck=yTq+H=vWcvp;Zmf0c7%s1Id2ckk&5EOUlU{r*5t zk8^)$FUocH(@mcf{p_j^^z{XHI(LWmbq92`?F%?N`kdkJon3)`ec|pMyE^yn=-;

    =3`%JkOW{;1Big>h9ZJ>s;%sNyDo+ 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 diff --git a/formr_scheme.mwb b/formr_scheme.mwb index 2d85668f58fe5d0bb58e0f32f86883aa86375dee..128d5499f9b8d1588de9095267a823c3fde74588 100644 GIT binary patch delta 35884 zcmYhi1xy^@+Xjkzaar6Kch@3|ySuwsr^)xLjqvXldQN_N6-;!$h zNK`=&Qc#iLm+SWz*MPg@d+SzXX12FI;-_rC>(4#U72tdo-V~h+?VOZ_y<@-T#|#(U zx1pLx_pe_z4IPzv$=Sd;;K%)u1ef>Q2%YzzhOfL%tkxGMuita|Z2qh}qnYgR{drxe z(RqJ)-aW1M{_<)waRlaVnc{0$&RJS=ge6G1e%U84(Dx>F7TwL!iFxet+fhTXVt_8G zL+~^VdPIFIy-8X)>3<=(UY3u&As}{u8(^v70{1Irz;oY8{`^VEf;C10Cr$=NFcFFI& z&reO%;kmt~=GGeQO?GwT_0Z7ztLOc|%G3CrU+;Cf)>-tQj zrQvri9a`KbuBPEr%4tD(0GQBrU201#r6+J>9Gu_?vNdM^KR%}y4r`rMj ztj5Lw{Y!WE8Z+xpFF=ifi~lYA`Pq1PPrcu2%vVxVaOf=ub@qGb_{6IQ#xmdMwlfLx zgq^dyjT$X3HX3H|V-;5c_);OD#VO;-i`nJ#M|q0|NW45fRiu*^`U|I<02f+R1{xU} zR=|2>LUoHdclCK<+hvPQ-whajO>zURy;~XW^EerviQb%vmFZ-^i+jtckX^w7dwQO| zA4f32Q$t--&pi*Y_qEitjFe>aRf_BF(LdMbqO;}3W3TVCGG+w9wt`o7%+ znfX7=O>e4br>vIi{cz%SId{L;7pAS2t*F=qPXs=krZ{V-G|)|%5IDwMK!k;IaOu8f zuzAV|T@xGNe>Ti#v5uMg4E#-BBpEVww0rD$?Xq{@#dCeoxbD33e4A6#(h{Mwt-?e)6GVEHnzi@p!b)us2^5uN# zY|Ej2?`wcl*qt%Kirc>V&u_33Esr_rPN$?lMB~>Z5dQT!pUIJyL!#9XR7DY8D?4B` zj0q)kJvWP#ZWyX0(G^I;(*z|;&`VSl!KC-E#Lw670`B{=wUc9$4BA_>vmN?;H7Tp^ zo1Qi*C*{(i6i&G9Ntl@8#9}3Ix-0@Tli~@V01VNWRFRWkq-M{Ns1U6%vto=0Z`xnw z#O*zk>7E)^xdVox%vs2bL65IC>WUc?Es`nboS#h$Ju5&p*3zKJL8r)hDt3DqFa<44 ztSeF!HmPNJSc%zS=xmF8WDq<9DCaL!FtVCOlw#x`x*7{4y6o$*?OGukeI70<*+P^k znqn@z?@+P8AZ=EtTSbrY{iwn|@SzzO%WA^G{sk_kaYRG(YiNPIMr;#k!M9)IYuC=;}t zVT*cy*6X=o_`3SzFBYXd09ZU~Y7SBtI}pyKp>{o>#y)EW`VB^AFG?mAkw))EXk$nn z7s>KPb6*Gio$D@bl;$U-$H4Bs2j0t}x-OzL%35CKd(n-MEJyk%a(-`=24@m2FE;Lv z_GfFgIP=ow?72)0jlCb!=C8I6VTq4XXXqcnWn&`JD^LuSMvRs~!ZGbiNjXw&MbZgL zQb)UoIbf+}0_Gg?52iSZN*-N1bp1~W$j;V;Mg1UC_bW#!anlIlZ8v8CBYB%>wHINh)!r}x5rwbcU2jy4_t3=YQlM;KFmlG}R z=8z)IPgA6q2S48KDNFjCghmfvF8S$Hr1;$PQOt z?KXa+`^lq%(ZXK=mxwxhKFfxa26v_KzkYfJ)a*m_@QlJ9r+)uwm3s=vwDYaJxEYJ( zJvnY-o3-$K8_F!yis;8pbFR+YPif}Z!Lq5W}x)_P)|)Js%dPJYYtgPs!D+fnuG4gCmhM+ z;8}R!3*6*o&F8Lki`LjQfA2!bc{G35)}So8N!+gR{dqrW05@@I$e9RC(HRNeAlE}i zCJ)m|iN?rAA9n|4CO$9wI&0_h)qI<}C-6SxHPU~$HSbdUZUP$9uy4%#vPjr>Z(d^_2PT*pi+oLYU6~$*VC*%4{f#@fJQv3hb0fNcJGU9#l3zi41} z{?)dE>E~>*Q51xpVA}dZ?Q~mpug88;b42E_A8)+wTzNg&y`dYCw2H!>P95E-`^ApR zxSL78;EzAptqINf{cBrGmzBxS^~ODaS&e%9i%tLKWbmfp`{MA+`d6Jz=lXIX#U!@3 zn;oBp+>6JN9`1vTiKUYGd031s4OkbOiHRR~?=HeK)^7_-n>Chg_P`uYS`Q3B5eX8k zv@ypOONCHAo$Q)+R=3g0H1NcI+x_x9<{a7d3J>p(ddqX56W%1almGW~mXT1~NzKy5 z)JV#J$mk?X!Dz|;B(11g`?ot??I-twXJgJPhOYZ0xUJ6AC)50(OT~~Yka|Ul zmE)kEn}?5n6&LsMtX`RN*))fmjc@WiqK`f=H`QC=R4HX&Fjo^277$U{7MT_EsA^@A zNWl1Qa=-h^#`Gm?N^U8$+S}DPE^c z@yBychJ1@%z)!}R!zq=9+V{QZg3TMT%mz-z>yr!6)}(4(Uzsq*tSgE%&8JPy8e}bR z^i0x7_Y>#gU8)qj4iC;50v6AQov%8QYw_!6R*N{o=X%2BJwxE@FGPdq6O|6Y?SPr{ znSl522Q*LSJVr+N41uIN3n^W46+L)CoP_4_f_{_|Hv>I#3VB%l34Y!k+V(%9-0$9n^6@Eb0LvXo0sNIo=8x-_oq zkAcsfr;p&^&1s^No*0I{#wYq8@JhmAqamn-8MqfoigkQPtEAj2od~Ch$}{I=(knNo zMddc&ci`YVzt`8hfy>P?^S8fS=JXp~{Qo5X{@%7=p^AGGV}3}%|D*%X=e7^Tj1Ncr zs|S-GJOyYZ>=)35oe&U|!sY`ohBAfr=pH*QYlXRLLDiuYT6Fbkw~isyC`lh^Xta*S ztL4-ZE7$PqEdhxedG&Y|DztJOPuDE{Mg-iL(gOsYIOT&(=YS3iKPr}hU8_}9$Cl6E zw^&9RZTvZR%3S-r*crk4ViuMGdw8~JsXmhQ!`vwT%~6@?5(UijxTTB8^a_tbaLF5$ zvaqfdRUDCPqE19W5nG~ifx6p;i1ctfWht%bDtQjAg4#W2UE*EQ9#OQuP`O}y254!# zB10tDWVo_9hHX25%T-U-BFbq<$@HM+@yF)htoD!2bp9}H46NoK8@R6P$_Px9e~zWF zNx`SyPpBPQMjRpMC^SFOZMCTuUTs7!vZ7LBM8LI*SIre~6jr6+R>zAPDZGtD7H`5f zw+$`4iK526f6c+q_}V#4r}f~d_%F+lRe4#7*C8k6KIQiLoMf%3PYs@B9*a;O-B}>P zGdYlVP@KXT2V57t9TZ0(=cAoqeh(>2mI5xf9aAJLn$2*QNBRNao^NtpO zri98!;9U2=ldyW70n${ZjvLpreAR?StW(1JGTda9u40f z8>}Q69NFJ#8LXqZB4{-;BFb6!W>doX}}$noajh)32M*-dBAvBepaXt#r7loHbhY zsV%rGbD(xmEiBa>!Y_e6zIs$7_iI1!dvYTv$QWtZlHROf999ZeR~cLPsFg=fn!$qh zZ%dNuv~^l2TVCj?oZM)BMg9S37JBg-GDoc9Lo2gaEs!Zpl?XN4DG9h|8t-*42rs_+|ZrprWmq_;!kT0xD$={ z&VfGd@Zu$yM*NEBc@3 zQ^C(bT0C*4VFO`eDGj{fuZipY2w@a{rOf^;7Eij&hIl8&>X)ayqyElDonTq@L3ay9 z+cYQ+U)^|)Y$M}s)iqFx`_59Cc2I@!1@dGT=#ao~jo@B5s%(*d+zqtv`&2p%gmC6L3S3hA;j+u;>e#!NCQn?&EE zZpzwYX>+r>UW%Gqzosvy^a`|5UW@}X=Ob-c%$cRx+J2#Kbb^xL3&x*$@zPxBba>Z1 zJCk9(G`an<`gTlFUHo&>e;ULKp|L>6gP*7hrudP-+#!}mnpJIUT=96Uc}SzGiHvwFGJyamRoRp zn6cyhv(j#Qc#^)#|C~K~9x8FVKOlKL^5%whtGVU_)n>tua^cpfrouXWOr!)#S~IJD z!J6m1rH%H~;mE>^)yOs!aP-y;fJIraMw$2vaMNUr&7}~(_VT@*qEzzH7?|AKW^#on19KXBt)x2b3~~+58>SlbI{|RgvMk?S%$Oy(%~K1x5o_jSEi$M zilrze2%J=NeENR=Hz~$Y zh~``^%;zdcMJUnwO0mZg<0iQvlbK2K+Lox{6n!E?tl?c-tE5qTNA-l z=?7Vl6cePKid;&>=CDFt4Kxc1+0~vaWiD>qp;f((Jp4jCdpRUBMZJ9`Lz@jkuF4$E zeDDW1GoIYeR?_zz#z*ni#Uf$FGdAcR#Ve7`;^^07>x#+g4Z}^m%2P`Zg0w)V@sWHz zZ~r90nT5~7?PFZ#!J3M(NH{I`6GOEE3=8E#EMILML9>mT@+>T4-HBzvmX=$I2C9pD zfDn1CSTYW7W$&RVyZDdJngRa(JLYu|;AB9I#arB@HZMzI3+l~8;@87v zl_<=HX9$a=9!97d`4{p#o@$|!R4b{8fOEX3tE5g6p6sS0FASe(n~hV z$3}SJ>txbU?ldD60zhx_=*X2S#;5H^*%W1smNAIH$#kUlR4hZh>!!Q{wJcao z9#;3H*9T8*cXO;aax4Es4q5QA=8%)x*L{P$6Qu-D-dE zz^=xmey^M4!$i*29lc0Hc|UzH%kHChWfeW%Kv|f_5zA<%G#IjcVmasrKF5>TYR1Kl z!>Z*a$y``=i=ZEzmO_NbxthHd{9Vbg=#xk8PS6tM!Hki5KMyUvcP(az-rq5ZT){aL zqu+2{?~`XV=e9E6r%{wpVO&A8cgzxp=~=a6hirZFCGRDprwSQ+g0x>h!H4bsP(|&q z4(g_YJo>!1SZ_g8tK!=`I52?G7vGl86Dm!FR;gb)#o}tzt6U0V>Lg2{X}K2V2nT;w zBMq02E!azhl?B)DU?oPw1XWgOYTk$`;ywgX8+EM1YNFO6tHPR-j{H~Y0QzqQmj=}Z z={iuvTXj9-Ylf@U88Rb%$q3UIAQ|14yTq=AJAwNLpszd<~ezXKVPJP)+v*Y4m_B&bhzG?K;03nKH-555k9#4UYC9#JbsnCp)6tVJ*}Vb z(YPnjZY{Tbl}pVs6V*G&RQ;3IXGDM_PgKTR87B8<@s&Y8x>3HziO%wTuCG%>D`8*$ zggZ6?l>$eC1>^h>hZ{Q?t*&HBQL5C$5n$Y%bM=&PMWx29W z=o-$?7D~zaZ!Ue$(%s(vZt;9oBVrMDYQ~Y5L}WHwKuf`UF@C{8|E|KM-EAjZecoSDxeQ^|_} zp9}7^P7j3KA3t|$zsm~wYdM*!H$!VWZ2=q$MX%F6VCn6K8>|rEu=nB0SP2($ObfBx z1A~L|RcBJ~D7u;U@@9kOAd3a+YC>n3I<58t^|4+c_C}@rCpA=rHa#6J_C{@|N-g5y zW|aWcYNzecw?aV+NzK1Jhb#xHazO4B9%31=i&$Qxb)Z<8IDEOQNdfs|eeHC?((H77W$Y4ha^ zPJyqs4qsEcxIOKls;6Io2{*VF!vx*#fHiJ6Tefb9{g*zP;<$I+kZWu!pfk^9Q6CN5 zia!wOz+u@^YR?j`wqic}N4<3?cdNywa!3r0{Wbc^MSx6-B|Ig^ccc|KU@ZE`O1fHFK;mZgih1gNG1lQ8se-59t;ZQ`~ zGmfY@@dgW*-(5tEr5w2J2&Wjf`?{^a{+{@1#L!GR1tHh)l`gODI{tF~}`Z zF0wkqHl77_{T%yFH@1c8V5Xa%LneAGpjC8WOT38P-rO8YNfsfj7%LYKtyEha;GlMd zwPKT5z%87PhWD>D zvQ;(6R1)dYBorGf7H=QiOXZ&KW9J=j3~v>fG$H)12Uim2u_n)=_)8Djfj5UlA5=dj zV2+pc{BP=;tz0ZCrRqhC4$&1;1&EAOQXPra?c544sY?M=&m?%RCwRSsm9(%f(_j~D z8N!T`;w>Om90Zj2R~0NS)B-uH930-Xr{p}R^ZhPAQTd#q(f$PmgF!n_w5S2;!6BuP zk`kp3G70f4>z3oD0>~%B1G*%}ud<>k zNtc3`Z7#9Ev*=Al*SDpjNznpY%4`Y)0~V-^_A0F;)@o}Qanxz`Yd|Nu=n*cGONdEu z2(I~bVg;*aS;&Q$d1)N-GEQLCyenu49-&Q6z5Sr;%pDy&*vwvfRmNtG_+ZRwFq7tU zn0-!{)5xbK{FCFtXm>RVHQxIvSBvp--zwu#xWr6;{VEC7C9P9$?QegOYg(SL@<74d z2w6@%d)zqq{%uPr3Q@|0*b0lCj1?Q#wdVob0&jXou!SE-62Qyj9&|G3){Akk;6h#< zEFaWhB9TD~*~m~~PI#)+>j)Y!yd^m>Xm%MjRgRySNta2t2eS=;HTag{qLV}l zFGf^QfDF*y0Y66`o3jAj{|mFE1Q)tng>ZPz5(rl#PQPcwE|B^6%SHM5hF`~G*B{nu z_Imb!dIw$^g#7?P;bhGseOc4*VQ}T4D-tjxy0V48S#tGd3-Pf5?vz2`v7_#fJr_#o z$LM*Nq%(fH{nIQID=W<|`2udSE>g}(Ji~k9^2uu=L+j?OmU?h zc-;3NB9TiiX=l&j1RZ!ip6?K zQco(4Er^KnkP69Zj5me-e{R8`47_L!g=Y>;#}x4W?)uYxvv;TMQ+nv;4wp|#r|^qzsSKWg=6Rb|x{ri5i60*-Ax8vR6C z+MXaJ>Q(%UAn4ULib}eed$zDSh))1v<~^o&j&S5hYi6TFt4Zb8Kji%En&1!m91;yf zbi-i#H%O5A$$1rxFu7TLJRj=QCIV4S&9CcPXAi`^vYF#!MzX4!hm)L(_uCaOxaz>) zdCAWCRA-Xdjar|FcNp4Mqt2%^EG5upH8i86Y@2f=sxGstDx2*p&~fdhL!wR3qTq0TL8;!?E`j72dM#($@9vTn;aVL<7OBL?U$NEq!mHP3 z6ZgWEZ)?Xt#c4XrLj7&1d`LegJqRtGq2WvIviV7SJnJr5U^r3D4OuDIoe)3Ovy9X~ zF54q39c2}eX6*yu_u2l}ZZY89))w^S8o&U{pp&)M^RsE2)zumEx%&(48>+X3x)N2LMmcaj2 zlOlqnB^k;2G4ZKtk&x&M8oBa5Yt1pbOzF95z+4`NlRhC9B?)!5{a&98HPk1`#x*JW z*Ri5#g`gNL9COi{P=FW_<$i_MZ!^`kf96gJ*E`I(H2zL$ZKnb2T!S* zp3`XstAHiD-brE&r}8UuX*=-*6F2><)5Ue{_G& z0O=eDr=(W!AgDq!;PF15hTeSbA;TlydiAl1JeZR&49c*tGY*Lv4pLv%r?#545~|y5 zxVR4R&na0i`Dya!qt2dhwKfaKiDRdPYQF6v`pV?DXc%3LlJAf{I`h|k+dUzDg#ME> zV;u!v61v*?LCt2uaaG4IG#!=YQ!aG1jkoj%ML0aU`!?7w1N90c!E~m5hj3{V`$TLs zP<0qHRttsOiiTd<^PeYf`wl#1$am726fQ+Z-(lX6KRzDUF8 z$kI7RixbpP|4+PAT>LK@Va)ii?c>qD$gS(rks?N~OTL+$r`W(n>KN1SDi3p;zvX6+ z7ZhC{c=8sWGE*|r#M6nKc(w{(h+ox9F;Po^G?N+0U_yJnq~VkbMOrZ39s5ZWWOC=Q zBIvQDqy~F2Db;j9nxNCT$ds$*52McB9@K~_tS40pFJ1;$Di>%C3c&|Or@|q8-ZnJ0 zJ7yT)GBs=LFYY&I)9p4%nPwmdTg21t-;P?iM%v0wZIc2hmk&}}TB!MRz8lv2h=Fpn zr9&g#+d1j+0zJl{I(Q4!2)CxI0_P0GrAegdwN+@t!;yxp@vvYe2d&*MFOiU%1Ptye z2=Be9El?=g<*Q1929XhQ;rckp#H4`o9m<|_@tGLaWO8Wn81`Z^*r}RewK?iFE5`QZ zCxIl}kIt@&RZ0yP6;a9z4G9g}Qx;1dmKqAh;D`m_wfInQ@M}&U2Z5x9^1GDy++jsd z`CA>29#qwMcAl1EaX`YY)`m9Qf1Le^DUvf``$mIM?d3Tu5C+tsqn6=r@YA{uVxtsq z>^ORjV#f%^ewr|N8TEjl^JZA(kj*B_1mPn;B1pnP#mfvS5DMdVPGEaMDv-2n@EdO2 z^NFh83b5cP>EerOR&}>#w$k3O4-@fNnivLdP`Vr|PF(Lw1IDqt&UAG$lsgD`u zk7C`kGyAa}D5!#Zk`hW%%T695G5(JMf3D#5&22{RW=OxYlUcoU#o_4x^-_f!;x{(F zEaiMeUQSEl27WAlc3Cx~%h*$(P(dinT^sJbEzhlX;}qM|G|Qdi7NXZ2>zPD3G(BelknN%7!Fo3^U@6LGV75W{9~BSk$B_@k zL!(MUN%TSwpFraF5wG-Q9R*|29VmIF1+T&4?iQA2nl1(VIIF&NI%}Jl6&vpQAYt#_ z7l?BhvCg0?M@bi;@9QBi@68p@sVgpy)$xx*Utf(j?eBe&8WB;j@e%g+&VD}RQA%_i{iAA&3dH`z zt#%wTj;c7Dov}j6b}>+XxRC3_#BraJz0x_f*?f)03p+aPV6pF`fRZ^Go{5{t9c>y0 zjcv|Mu*d+I{zOBgt%gG+=LrGA-{j!VZYT-3s*8QQF9O0Zo^}T`U%S)X|2~*(Us@WH zi|3q4U=?qWWJCOk6M#BGRTx8~C!0zmWhpzvd= zvzotNz=uc1#SszlWBe}QBb}LD@-0@tXTw$Bm?jZ1 zN6#<$=25J^a4lGNAR-toVzcjU;Z0#I5#2^&#E76>0~MM@QQ`q(MF>@Pj29V&m%tSF{q9b2IW(qEO=ih2rYOm*g`RdFJtq7!FeQhL5xkSH zhgN?jxvHx^(QR_Hf4 zuHm7cRuPU6CoqRc^aaD7%{rHjwVrpXlgE9OszJ;&g;^6YB`;EB9rVwR29p&1G#$8{eF}D}Z_)AZ!}#M@As3PqC)tH0kH zo`}deW0>Nvv7=S{6#VT7_3M8XEu-b%mr=~-mEy-^#FNrR6Y-?Uvv$Jevp|tM4TPPg zaI`@2#SyVz#FR=1CP)G&X7(0NyrIo3&pgtI3$oUI!xH$Ubz>{jCQRkCxRGXO5udMm zQ`r@xCY6w%sKh28@=p|VnDJ%Z7s=_o@u3uJ4qgbDSb>RyYIl;iD zgCq;sW{`QHxs)R2CBqbXrHV5|!O0YT_F}XNnI$h3WVc8~V9^brcw`WZ&qMNJP=9-e z{o*&sXQ^TX<_R*l{n$AuJ;qr6-L3_0+%x{KnthGKCC&Y*3Tvl}eDA7zzb8UXWJSvv z%c#gGkkUZ*tYMv-ENU|M7Znf!3x%6*-_U?t$Uuk&AIT)T?Qc!f);P6~zRK0D5tIOcXx$`{l*N9#*1kVh)G+BLOmrgZoAAiBOSOUj)VdE%GJ$Y82>n$(p55LS|T5tJaBJ zE8ih*N0CrOin!tXe}#zb31TEE5n?a|^Q6k*z$)F7;Amp@7-F{T>EI3Wcy|F^63)IC z0$nipyq`4}vb+6b$9{kG#gul3tGmRMc9kW_#~pm$20g{621Q?Uae}+SwYz60KeDrb zZZP;i&xxN31QDlUh`OULOY7I`?(^q&B1J!6fkCRp!->6dwI!Kv9<;7Z2WmN(l+s;s z>D&NZGF9I=kUVu>z_?JuP2o4=tg10A$*$}1*m~skTTv&aEoWc2b(oHsJi8#{>{A)6 z!ah5(a_Y=P_YoxNb4?2HBY0;DVyZL+0g!wlB0>IQk3S+?+46H!UFax8^z1hgRv3wb zJ{Bv*P9=S?2gbAlbgKgBCh>3T}+EHV6m-?V@P~# z0@DdKQtR93Qz7UhHL}J$ofC4R>x3cX zOCdE8K8#!KI;9H0SY$#3a3jX4TR8)4{F=oTNI2-NZ!@i33o}2-4n!lX$+-y!M_8${ z5ll&8Ftpd@2!1p)w`AiXxkNWEez#;20%;ZGkV!V<2FyYo>0JHJ;PKwvF^a9g zB?QZx$`r}sL$jvLOe{ex_`dL13`%Z53BRsgsA5M?k!P>WfV93NhYj2WT0TUB1HS$O6XkeVM4OEw=DP%1g@ zIb{B>%M1=CqvO*t%Fm1!^3ya?HxcM{LZGUpD897M^r< zzpNI3a02?$>2(r6$MseGb`cG;n$nJipK?n*^$}bZl~}}x40j+)MnNXP^}hrR>(fU9 z#^0ms{}M2~uanPTO%oI)TNL<4V0U?cgMUEldDdQj15g;?71NBtG7;|qnBj>*;|;U_ z0y*Ka7!#l2-S1zYVPQL-+kD{N;jdaw*~o=5zFnNjo{wrtP4_XnQ%P#z2_&c`wSa%$ zd1&p{M(4t6?@n4r=}1khF}Yv4RBgH`tG?z&=b~ZMjXtgp)F$UXe?P91X|hq8=GA$K zXc!Z~<6m&Z%+7UkR!ZPrZ4oXDU$LB_r1fJmI?v>}$Hj&<2H*+D zQ8-DfbbyhRWe~D~Q?0ne`dr4xli*dmvgzJRu7ld@BCTT*oG-u@z189qDU3RQ1L|VT znDwqe1YDT{ivkc=Sa$?&cMJ!T173Wl1S#sXCJJewM0J$}pQPka64FL(L))JQ#Mk|= zpW={l!zsoG#fM(lAdEp~68rI0AV+uk4UZjvlETa?l<1-$bKa`L%EDi$xG)7)DP#P! zVALIW8Of8Q@!8%vRRI#$#UGU{e7sW;AuiHN8P^FLa&zTrSbu|>$c(d(+~&fOK4_f$!m`?zs+WxfWXh}x*|Xi`@(@QyP$Lq39R6Ss&tjUw1)1YM z6kwW$au{A{4aI!upW?CI(3UBO9pguMj1a%4K4(d%^82`p2we2l^GstVYlclk_|Wsz zquw`ph~3`9Kh>}YU)=3Kn*-V*INJo_4*8tBUucloBZ3l-SjDOfk@Q`JM?x6UHU5`1 zO@;nH<%sf`ZrYBimEDYQX;C6Z!`pV~ucTb$=dkU@c9$QYE~DTgB-Q17!7#uXX)!ta zUjQD}8lyt8;%uE6-rPQZFPmp+l zl51wXitB@*O$`#`P4TbU=8g*W6&nuxTx85m>(o>qE@=kjNe+BMi(p@O)n$(AAGFIs ziO@xsZ&oE0xR$tyh5U1U;DtPbQwD+vYoi>d2T3!dliLpRGg)?djkJwCOC^TL$`*q} zC*J!t&XbVTVQueMo01KNl@Upy{9H3mVrF?uD9v^8HgqXY`Nz}^3rXsaJL(}hlhz{r z=S|B`SYv+>3R<8eciY|epOY|{V{|UXqjxJv)_kCsQ?-nxM`WeJfwL4;O@O=*?y32p$ z)S)$7zs@>T)d}3{25RT0jpX6XiP>HPNv zVz~Xi(k03g(T1p$=d*W8JAF2ZcV?H2iHy5V9m)=dCZH$R0iYFjnV<&fF(@?%yR2b< zGYz|Jw~o>_dr3mw;rh9gn|LJVN~e;Z;~O< z;C+p4Oiaa2%?+^{hAA(ljKF{{zFD?E(Td(-X`r?7GdAO3*PTq%{P9#Yw=H{f%oj7I zw?K+lmraO8Q>z%C!B2%*EMLHH8-+AX4c=ocEgg;I%eC$#^Eib@_R*C;)ceGcPl#=S znd->ugG8&(?e6DU>7FbyF6Vr~9@#f0=X1p17A~0_4nwtIYFjK;iNh&4h8wSks_k?s+!zDvVK zcai#+Yn{`vO z_27B`g%P6P#!ZznB#H$_&!9rt!@J(0on@#RSNFv{oND;|GD{wIC^}PDt?(%hcQ5+c z+HI4Bh~R(0hKK;!-|5n!s5O-kc?1e7w_cLkz`q=UG^|CMr7KF_u zL03%iOAIP(6sz|CbJ%UvLKmdT4OL2q!qThht|&1ycO`tz`*tfn$?C%F&<3Z@6YoV9 zFN4W6RYJ*X@?~{A*IPWxM@s0hBd;VFpvSIWK4ryjX@V#!1rUxBIgM^Xf(Mcf*} zp1zh}j!nHL@SJf~c)w#DGm*W;Y^EpW+Svs?(QuKs^er#DBSlBNBvgP7L#~qk=V2*e zL~;Z#g&*)V)a{^iactDb7+S%QW+#B1>en9sBuFln6RINV)D~>P(xy+?TmUcVp@f(ISi}&=_p%*R)#d&gx|E#EM>sW!a#(1 zfms)e*nD-gQV%HOA+h{KMK<}YlRl`+QMk^JZ;Q8NCfaA$fzn49Qyzk1+$~#x9bllu z85D!H?*tBFRajc^$Z1nd^nSqHx_`poUfXlBXB}=G?$36Ze(S26Wf?ntZoCeu#ACg- ztk8MVu6=}whayd(a@ZO!{N-R$rUz1l5dm$k>_RvP$dv7>ZCb>TEwRKlHip}{>a68FBei>KUBG4_Y7uje=t$Pkeks-t^ zw2k5UEJ{`s;Yd-+#u{@zYg1o&VrVJz2ZPwnqn>Wg%J-CLqVnz`Iy{z=2*nf4*eQGc zgLAvQ2wawlnbR9W4Z)hmU$UV?Pl>p`oE%NOx_;-ODXbC%;I&ZjP-?v;fQWDrGOnln zAKuf}c|~Gucd${saa$BTBQ0c;IjuIdkQasKOV#a@gV@R_77%JbohlbdPE73{luJt# zGFowA!x+`&Xt5#Lf6OL8svm`M`tfMdIuwvQIDI-qI~BE#RvdqLfByK&6tgI3l!+Sw;lsZEFGw9f$(C{AlyCOU9O7gL z`i?Y*B$EeSP6&@18qz`)2xLYXhf6+`iA6P1VF~|gAM^w?=x(gn^qH{Po4 z>4dV=dEbTWv9yETbvn}iZqwK;82!VU!<2rtKB|E7|8VtJQE_}<7cPujAb61A z7ThHeJh;0{aF^g-xVyW%OK=Mi+&#Fv)425^zyCYN_nmW5H`RTyM~|-BYtQw}xnv3< zTW05QMQpy8@2R!XjqB-peNyVa)tiJ>zk7-;q5V!3rO*?~nk1F?tq<{Q2%~%rb?5F- zLM;4VzW6q1E(Q&1bO6l}o?{0Qt5Ghk5cbOBpr4_X_bZMzMVTsNGOO`)xUmEPAyf(@ z!|Asd3ALpnCT252q_nr)@Ke!A1@$B;VnEVqc=?p3%wb%!<%L!fjsJhWk);+1JuDn) zsm0lVy8aSgY&;Zk18=ds1J;`C-FiP4cYhXJ7)&0f94u5RvHw%UO`XKE$;JAvuO~)H zLVmq>YF+f#g$X)*0p|#1-@Mo>o0mP+4A9u?ROoV;L_UmI)Q|zBmVG)!EV~q*A?LLe z5mwZ$NuJ{2j!?lqzlSU)g*L6z{za0v$A2hJT%DK@9exg66i&oATkh4B{85EmNxmb$ zFHaUHo`F=IB`HflK#CWaCXxo73M(v8X;h~w@o*0N?_+>mF&K>+)t5b;zW}DAXvM^`#MCN4?8#PwfGYnP(~ zx7gKvK%|n3LYkY9Bz~F|v&=EKXoMvNL=Y(jrxM*vu_HW{OBe4c=5T;{22I}jEa@of zAbPD#-1^aX`0N`G5jDK!$Q}h;B& zvO#Oo^q1d-&_^ma6!>^qq7-2suxg_Q-^({W=jU7$z=_5jY#9rewzux6 z7o&1~J_&k90xaK=fXDws0_^o0zS{OHp6pA{_#7wvIvR5G5-m_fvVxM3m*vz?8%)>u z$PIxamRjgv(D@iH6$befPNpqRP7TTQeXOo!vMb*etJF!)5#6aishm%_QFh#4q@dU` z!`WFuf7%{D6%oIKNwbtf-lo6_hAx0|!jjZzExEF5yWxEqbZYunEc!oVERp5+8M`9= zKQ{9YaB{tRf^azq6991%$nu0-@lU{$!a)M6025f_f@argy>gvnLw}dD@o1*E21k4E z*DJn;j?)7a&Ui>vr<(j~L(u5(X|q*T$=YoNF4z{c^RLF||k1uz% z;P=DS|M_yOaaPu$y=P|{msT30{+Za14X_#~t-63LL>G4(N$GXxL79Z-_U?50{kPZo zeiWp8eE&(C%5UsbTj-U^K;gfvktMU9%9>)&%Cv7DKil&r*g!5ugkq-3*PaokMjDlE z?C4DE42iC@)bM1!BkGYpbPv&v zhSz3dV_sKFH0iokT%#b?1J^w%8j;NndB*j%bD|=_%YQcA#%JHgu?67Q@_~NVC}ZWY zt?`xifvcGJw7XbPutX35lgR7$J^c3^Cw#J|+$n!5O~M65O%Gp`LIzryY~w5;-1VFO zuZ^(QIQ74#!WKm$vH0;38u40Khq#DnrkEVlu@V;(f%%vetGO?x%@@3nuex^z0yf>J zbqjWFwGHrPvczGQ-%g{?%1Y01Ir{CO3Iic9D2lM)19n^EWj<2^7u*&^LHTX(s(pF0 z<)s_eJPJCwqDqOXqBlYKv3F>xK$fk?hj;n>_9q^>RE=-qwW(7;r#!9F%Vbby#*0xy}lj%$gy`7aB5k*V0>UB)m7vSo-;6j-ak zz@c~)378L@k+}F#l~cI*?D)!giubv9h69h=+m^GHo={@%HUNKy;sR+RdfbOp((o<15MG2oBUTPy&`epgv%&$8@xrm5Z9p)w7Sl1C- zeGekQd=Da6`xiuDzHXH|K}8vL@?Q$UbJQ{7oqfTR3;Lwh=+lC5H6`OyVmno;Zjy9d5IDn$^s{1gcuo-GHEXOuAe^bmPpde;Ua#b7LbkGxsrE+*k-J_ zv|mwQX$<5`N&@CMkljNwA@LF*WDtcythH&F6gz%l*!Y_l4aixJ7HxRpN35UFq{Tz3e`n!ks zy$D^%sCXPq;Qu?@RD_Nm`iBICoT#+1Res%r*`MxG&*OX5$H0gy4D)E!I!kky^c`QU z3f!{9uSAIPth#a|qvxgOYjdF*0BMw|A_n9zJPdN8-^U3E4kb%0F>@YMwbXKTj<0IC zikga=b*OYtJ%2us!wf4-^=QSi!($vOL-Yj(Z$>54@X%aHn&ZQh?%!gWpbB?9-i8oA z6~L_Rv~s8xTAC;R!v?#qoH)}s&G-T_Z2qYjXkikiFeFUcax~ob7?ePZgvu1FDRN{B zfpXt*-XI$3bSK(n~)c(;{Lp_ zf|eteKcbaULKOpSDkNKL%S8a?5ahwT+&ewNw2ICtBC7u#C!;0urQ&nZEdp~RM3N{G zFB1xhpvr=tfa1>m z1>IqlF_d{_#VVh9yIQQcpppr_L zn)7k2|M$5^-MwV(N)tIbcV7){Y@e!MrlgW8NsJJ>SRCo7GrZ@$>JsyEyOcY^TW!+ zXrM>!CMPS)f6fP{>?rNDeRO!5-mzR;$bL4qL3>#}ibKSFiu|k~vR|wB1R$i7LQj&* z(#PYnzbo_&yBWB{xgu~M-sr&q&@aRiZKZ~O7`Gdb%w3m zbLk~9$y%sB;{WjQ@v+S>K0uAcq=c_h(dTBTujb12^nGuQiNQqVvO5ZWv(HTCr$kKd zhnNwyiHe&pAZDQ#!F~boDd>%{U&?F$f{>PsJGmddr(dRHGNn%j#9&Yi!=X~;eq*3h z_EGpsN|3mbA}BAnel<0hIp!Xna%nj%3=&21zfR(!C&kgISgLmw z>Pt+rht~G>`mAC^X-1ny*+#gX@R+TTOi378uyj!ZrKjqKVuyeT7R+aaTr~W5bA!WR zpiKJoWoi8+;p$humQ(c%X$IB1lRmBuNy5bOWJUoO3>@{zdi{4VM17vWF*md^tG_b3U+(^Y9jm0*<4lH5%Z0S+oQ9ZYGdnI9XLPQZp8_qS{z&LnHipDwVQ9cPF5ZTb{NO8O< zv)0#=s=404tQ7a+sXWA`{a#s0V=Ck9Pzqx%1Q>Ldb_^ZAXj*Nr9dCPc^U!LH>m`KY z79JvD%YQup6X8z=GI=(47h!Pe)VD%Mq5f*ZcY;H}dqE~`ds`9O`V49?U$vtV`7s-h>Z5*9`1m%0q|p5H!9>?ZGh#MdUhkOHgF~m?;xy zccs4rTyfd8@wuh_pl0evv%n~6I3HDlVSWbVQMBc^=08Rht()qqva2T@mn-oJmo_ck zoS>8we0g`Hvj-lb!NMG4Z*po5WaQfqW#-2jSH>gF`@A>dX5W4*oOPw?i5sv(VQFd@Z*o6O%@9^ohtu0MWm z6ek*<-&YZM5!E_~ODvXK=Wt(_nUFJ$;H)~g6kASQ`4c7~xm_KcV1(FlC468a!* z4^~*a+Sj#vb+$$PL-gr&g({r+2T>r~$_JgkLw+le-7kyP_#`ww6_F9%nh>M-Y`k0dd!#HCj$t(NqTYU-t zYm?5Qs(>uExy}^Pis9?8#GLFh03v!w`BN~nQ zWbgJZ?^epYk9_9kl`o1TXS0hB+f`>@7E*?^D?zfT7 zU+mfq>t9Jt&@uq=-BOda%%@StUrKqQVv`Nn@s-HYQLuVsE~UoM3_^CuzGG}%6C~m?sxKWrJWP} zw!OFW(R)kdPuFiktd#*uP`v~x_GdGm#lHel!}N^&>*SUl;#Mc1;U!IAJc|p|Kkp8l z-7YFcBR^Z6-dJ-VRa8A*)533hb1aN~dJMap)2a*P#H^<44=ir`}|?+GqD+8^|U(G2U&5Cw1&N z>IdFc38oFMkpR70N$AOv_t>#!JrobuDlR?mP%< zem*K8<{@yqcVFdKf7?X4c+8(CHV(g^&YE7-%f_gz3miVU!s)2i!rd|N}JT(kHedCgN|S7$z`6? z$Nzd$@l5KHCi`SEQG8l7bu6%UCa~32I10$eHY!o z-W|I4igKI)1foZJ^|CH8Uf zoTw)D@c`YcgG~XKjqX-`t#cEZdIy6u4WQ)jD=ch|MffWQcqb)Vc?`_->|dpkr76$W zptm2%qd#_FHqN=#aZYp7RdTs=Px^x9h{@#WpsSO`RncFWO?VHuyu1@1JChsFDcm*J zI~9)QVD6+9w=~dEL-L=i@$%<*{cHm%Y%WhQo$_8y6?iZ8{`2xW$9&dB`g)rY(B?zp z4eI*&(EMVioj1ms)966PD(icK2Em6^8w#gDIw;bjbZwhw%aJBin+Bu@c5kph{U&=> z4l(y={F>3-%9E2U4smmJ>)u|z1u&}Tys4btq(nsUfgR>EITD;3^g|Zik94apFm*hv z*Ee`8vWi!tEyZG-x2Wn|O1fWwO23=m#20iJM3K#hQjG@bB{Z_`y;4y>5>eMJb`T$> zG4A#G-}2(xT3X~x+!|J8s%00g8()mP+jMNttqwp?Ig^Jnu5;oZu3heD0{7cYYfpy# z8@G=Qk8e5PL5JIwU#+Q~fcN9ujt5IdX6MI<;r9967v<#JTX}sw3t$yE=AE;x6NY2Z z5@**qrvD*@M88N>SSW>`2Mco5CLLIcG?AX4I3JrxJ~4e8(&}JAo58> zHLN|8Sbqy-O~tK>l>BKwW0GKt2m2jkQ~>FW23u~leez}8X-38@cumoB%MX^VwL^~* zIF7I3QU{5GN*LX@=3W8e&}MBtj)VrLmDiXYIr)fNueBF}z|)l>@KR?SVG-%YiJ&9P zy|-7Kz{=5+ZaQkl{2#!>yxnzoA;a9b2JSlxf3#tg*g9;}KwDZ`b^5FtSzk*ns14 z=WK6jTZnL7oOrB}Mkc~ly<&e7&l?1C4O==)borrF=9uO!$Gm_STF0AALXmebkj%&L z@$G94KSA0;^l~iWCI%#oogh3W2{Wx54Yf_{$-|aD*^M$w(5E3Q4jizTS~t@|#7X^) z=ieasiuPY&%Xh>Bs$}7D1dfuE!gvTD(?#IvCBM7PvEx0nw`l3=dLbrc>SzE-2F^-% zKkZ(1+*RG3VLGl41JoF6kUrH%h4N~D*up?F#9&JfN7LM!2Z4@{;(iL$xNW9?Mi=_3 zCDo6YZ~!Be8z^0XLR#v!H;;KOC6cb5J%TD|4oyu4i4ztS*rSw;?6@ibS@S7_ifJvp zD7>gIL{SO;hQbehsDWmvMkn3?&KS8~C2h}dD!j;S5W_6ngO(a*E)Dr3^j9ffdpmy> zEsUMs1cTuz-=!z_(B;w7a${iKL)6zI+dp!_;S*hQHftoS3dNRFFglJej5OksaYIch zgOQ?#!CXV8Y?6KX?}PShhX1kekz`&Y?40_R+Mep({Fb|@k{-&0nIrD#dCV7rOjZge6eA72 z&kG`z9Ud-veBU!c5H;C8-|DZAN%bTLv*whb`cvISuLaHRqzd~BNB|MB!SUI11kMcE zH&ohs+WKfzO|s%mXQy2D@gaw$A~u;?>udxL{||jd6+<4HLsD|Bp^tq*Q;5v0hyzwg z6!KV;p`$&nYdBs~#z%rv$rU+cr5J|81UpK4whIa-2{O~yC2KfipSGKw*RU%8@CX~S zkRdu2p9)M_Qzp_kLjp;|YQ4p~HiErglnWnLu#5*Pa0w*DkV(i{+V5o`=Cc(GtevWD zk@$~_NfI~}s)VG8ZCy+fzC27!IYxq7+;Jg;9lg$Uv)p52LT) zQ)?fu9lui^h)c>=xJnTPrQ(z0DH>|3@$)wEQH{vRXaDi%=*t+32CUW;&E1@C-?&%iAjZqiLr>S z1G3)x(p&P=6sFApA@1y)u38f=PT1H)o*F{gRlWn$&AXC>Ve6)jw$jz|Ri1EWx&ePG z$lilZB+0}d^(pZGLx`GxVJB&OJDlKg?$b6$Cu?WN)(`jiI`m7qqeH^#W@R#Lcq7(_SB6)T4-H=9@=+q^hie!7>A|v<#3NH4`Ft%{ZJzMQfKL*Y+a~?d ziS@ba97XL1Va8_ASc}6yup@c20Uucw3&B}f>`Pj28`nec9UPu)rWAd?E+uwkLn6Z$ zb+oM6YzlGbavazkl_JRmDMNffI;zVfRn^bgsop5N$#{-BZyO=c-!o02Z{6FO4{#&;&osoV0+1R_)S0o)iy@n*_Dl%INF)m)B^ z%Jj;G@5pjom21&X*am1@XQZ-UVzNe-n2T~A$ zZEg})hHgs4mHQu4V0kr=z+%JzW$2gi!-xpr`M*~F+zdIBjA1Rt$?rc7WC>DrFr11flAcaBONoWtc*DwH$#i?+Ks#RCJS-YoTA4KnsY@XFq3+^nna}9<<=bWqc z)BI?lJAy`+ul(zT(@<`!9JCN8NcR~UJ93Dqb7zSMU+y=zlY6Vk5v6!`;3=%uFJUX@ zHd$;fct!zXvUCYY^HJP=Kfw>dAu^1;YyP?Q%qEqr>^<&T-4@X;97(eBhgB1?jY$@YS4vifM;~MB3s==p)gUBL zo0bZTBh~1o%#A0~*+s+<$F6t8VF1+LKUCFd^q*g|TYrWGneu5f5Y>O<0z4gBHM6kr zWrNh%k|dqimX{2(x{s{g>xSu2x(IINFZk~c<(ma6yN_VoyJfD;0n0A?X4(9$tkpf` z@NsL-*W%lTY=+6|38saszP(+;^)YP$kbw5XEc3dhiP>{)OKOT$GNING@ZFwYli{r$ zG2(V_i6X-yHw&%So1QDmuBoOQB+-$`Ba9%kCpv*>o{ZA{f2O;OmcQ3?KKIp{XK&-( z*Yp#~OSmukV(nO`)!!FSpKk2Xx4nHHE*ezLYTWmsPApe|RIf3$v$ms#vy+P{OU6i{ zAFC-=Hlhr^EiitFK=xvYx?Z`ih37)%KL3stBk}po+KzKm=4;a;0bh=ej_kxb<6Ap# z>xIkUm8tvVxT}LeBDgNqZaw8dM3(s7pvc_DaCwQWIHy16p7ESJpGo{XlWkkdLN)Mr z!-tsv#8&2#cQ8f~;a+&0n=qGqu_nZ9?9pm``TnV9KNINs^kk9_%8<$Yj(fvdr^j&! z&wMx_z2$%PLuCweAysL4m2L```Zic0@@Vhrz{&p8Yr61_AXV16)r{z~+=j`tekq{G z`HX5X?*6Z`i4dVMwX#Ll5JIEgnlb;5K&w~v2wBPfFQ%@+GuxgH6IXC>Ov?hhB-8X{ zyTX$npfIvML?d+S{l;_1w2-Nvvqbc#m`$D!8|$4LcyE8%i;ntvViwNC&0DV7dpc&{rLbn8^b>f}a+afni=ljuv;uC!a}EqF)J=$ib%y z^ZZ6uy3%q5&0YoV6L1i7jvpI3xS%Bvc{!A}z@bk=S|$yKDnJH5`Hp-{?f<;*)p!J7d&DjB zo&fW1IzbX0q7#>6^xy7!Ax2LuP4Uc8M7iAlK$y)5;Vp}G;&K7(iQ1LrFl-S1Dg7KG zQ-{Eh?y1`_HIoRTN|ZE&LaRr3`yJQ$b81TbgRnNVd4s!aHcM^vbF6W_Qd!$AD~b3T z!Bp`@CrDUiQ2O{3cI76(?I@B;&Lr$iHO_dK-j7X3$VtvKo?yQ0yogu?6lAQfgM>Jf zB3w8f&+GUP$OZl*a%(ijp_ioxxA2_a(p`Cp_n4f&ysjB=>KZ4m&axs88`rGjp@@mV zk%=%OMup8-PN2q%NKI*y*P9I6a_8c}AlJeDa!p6VOpLBf2SKJe^8cn#dQDG@zIzF> zE!T$EI)6^fzQOW{K?N>}$g)!?X}iwA8!gOR1q5{b`TO%=FGx>jexA5X{F77fc5GC1Mygu7bMU zKtQC5T(rzMG`EP!L>f29fgkDr+9p+i_DKNCscB99a>%+y387t={i_n!0#i!G8s`Er zQ-Zf^Q!tfStN>WZ4+$Gb#3~GfW?qb1D2f`^`CRlSi?Y#7SK1P6;#bxEsJ+6vx!8xd zGg)Js?epxD<8$uX1j@-ibI?|NsUbAyf(GcpZw_x)KRQHldT7#nB>&C+NCy0!dcN84 zlDbkoT?CzF#I34j*cjxW!*FIPXUf`pfH>4f_x9VC;0YtzWq{8i#)IkSfOn#s2d(`R zz3SRUCfr72*^Ez(Uu!`pr-{F-MU8CIi0-nL@)w(uJFU6HrJ_zw4l)Ms%aq_uE=O+W9sH0ZMZhi<+pnp7;C1U27IyzlL6x%Q`bFfy7DBQO}1^qt=j?>P1FHWEw9r?(8dT{NnE%@k&pl6W$kHFylu>=1S`}x*u zfLXf7z4urMy!wDQaQm~S`{`ouy2Go$^X-z!?)5gx^I*qW<;t`*O=r?~a%*K{|G$YF zj{4d;X1iWuW&r48-oH^V%^B~rGY;gu!krnfN10AlGHixGt_K;50+S^NC-Oqucekz$ zdyglem=iFMXQ%hh)9s@2O|{*8>}$8``Q(bt+=E4&4e)UNZS6MhrTP+hy)wLunZI`W zxxl;be{@6LRg0W4{4ED(yM51cdOM)~cgK>99+=e~xIZ{Jzq`3$ef!7s0aGPh_xZnd zHylmRJw*PEvvDV)${04lZ#24?IgGFbM`r*Y~Z@0V}P7!i{_IQWpK4awqSl?#^tij+jX?m~Q zV5cpR#l*SzU72cBPqyRL=4aa5y-U;S8W3gk86XloUm9u8xZ+E*`EohD?E&X%W!1Hu z-Ro*;RF~DO>si0fUy||B+4}hPIwnD&O}1|`N|&#Vq>H&uzp1{ZrDHi0Yh!Eq=FR3? zGq|a3#CCl{xZ#aK+#SfsmesTC%wO|th?|y;Ox-ou0Nse!-#p7q+2yfg;RC#$J)Vh{o2Ko;_-Od zzv&Hx!T)rh5aCMcWgO^`i-pjYzpXvtYGq<|$loZ8%X}RkXXpNW^g4Al{R%j@YUvHG za6#Lrd;cwlF{{#k;F~NsGn-jFlO4Q`AFUfO;Vg;h);V@(WU`5Qe2WDEN%5GC)p0>m?D4Ksh6NiiQ zZ;qINqYsm7Z9aFW5nTE$E+=Cb!1;1k=Bdx#sde+pD=x5lUb44~MXc@u53ch(x!%co zoQ>Itvg3Dqf`78}d;;Xa_eVL|ZmvlY+d7nL{ub#Zs`kG^Qzh*VIl+gXUDsA>m zWj49m;d8cdYnSQ$+HMxp?esdJp6z+G(8vTx!!Dukd7rtoj{sbkk4tPwFd{0`W}G5mos@&F8Rjt3es zcoWjgYy0)#0ca=g9SqqBh>7vWCC+();P-j-@#1~q_j;M>d~l1g+!Wu4K=t6_KW~R8 zzG(YEe4n}Aym$)k=v!24s!!4ny&g`eKt03na^G5(Zm!<&I(h;v=CnHBl{J{zbv^Vh zNq2*I>GzZm1ln9{z+kJ8nks7(I#=P=`-Y%M!Z3LtHQSzOPI5(VyJx~|7Rci;X6O?tmY zbhEt;M;&x~o((uZ4aTg$jA4>?vg;SWtuA)mywGpd2j!%7-~BxRZdW$kPt|AN{J^Nh zYPSI3y2z=hy)=@gp#qk7jXAG=c^GNFTGUQl+<#2}i>kl6@MnF3gJmw}Jso(EIXa$0 zs4$InmRWBZAyIo`7xkndg27{sxGWYCdt>iw{m(`b`KJ&3b_C%8MQYIW%iyu16QJs~IaWm2Ro@@fR>)ehF1BhC|nglNfYWFLm#k)i{x-ahe*={_uFM;611sR6^j8&V{gdO_b zk0-O6JSEOl%iLF9M8#6}#S^-`-a9|qLPkZ6oEUdZGIwe9gx${k zKw-~YuPc9EW#tHtV>EObA(}*)Wg)*#No1uq%DKB7EwsUgI!`WP#%@~kL2L9I($*HF z`S$QKuO`&F;{ja0$NS*s`lN5GV7sS(zryeXIHWy+Snu)fd`F;tJ%`%EYmdNYc^Xdp zvtO(smr#!u5rnZpFrJAqJhF>S)_wKiRVr1=6nQ_tSJhG?)EG9stMXU(omNNl9;p-f zJhPg0$4OFvhC%eGC~sJBM+u|L%Gv<}$tuVi7nI5aTjOK}fmso%l50anvA%DWL?U zOXjRco04G#5(de$hzF1qY=+PaN#og!rjQw$w{`S!JTd}>)*g_th;^W6Y#0NW6zb!} zoo#!7J~mnPjw-lo-vf1t#D|YhzFp!Yq)}b;$Xvvr%8!P)5Lt>F1pS=DQCB-jtbp%N3l3v!vwx%=^IaPnnwSGkA^o z!Ugc!Lj|**ReRn4*6k5d#*j7@K~KH3m5sxX8Z|~Vt;u2NVy5y0ecyJTU=;Z^sPfzIj0`7lS$6E#Yte74%;+9w=MtklTt7Yavu*V}uZmYwY&oDa|RHZWrRwQ zucuSZ{*NTopZBM3>lSj@zV(()N``;=AcB1zu@zJ)SE>^l(S@BuErCJ>XqQ~0jE@pM z5f`Vh>+IR$xF-qvb&42y`}%w;m8&DVY(YL$Whhe9yfqjo+=68hk_y1wbo`5rS(1g@ zuHZ3N;ZB@TO}dsW-TJ?AO6A`<7pVD-9hO`rQIOcNR&?lgh|H|i)@ngmWE8a79H z+C0R%5*8bgyqBNq@`D>3aM4)eGfx~VNUeEm>Va&DD>$$eWsI*)T1&02-Zcf|5{j!; zxrGIZHRx-{zIn#)SfP7Q_vsl!yMQ~RY`)^vkWju9Rff>hOxoO07tG`=xG+pDGYI;^ z4w*{GwrDUwLc_v%&1~!t@COeYc@u#5Tx0I26(wzj!WrtghV=^v`shTPMsN~|i{?Rh*t;PesBM3_xW$L)eqI2EkU^B zlJeI&$XiU+zcnl{BWaFWrxrLV(hl>#(R(+jPbxp{wo2w zU29$O_MP{YxIbzjGvd6Ul!jY+{~B2=XY7r(6;$RqENZaO1xvFAeBTf%bL=K`JN_+h zT_pL5%3*>-fn&UvzsHIDCEgb&5FBd=Q&`?J@8|NsbqmfA*m!x|pWH}$(|N`$H6grB zyM1KK)3xl*o>gy;_ema4J@--pjvQ^+)K)5oLs3^h*|>`qxS zpYd@gWe+|V<}JxBMQ3UuRPdwn;@weN6l(aQ1iv!kgN@-|Mt<<6j8ra({z^lEGTOzJLt8^ND&j+Pt$4&;A&4u=~TJ%ldnG?O8FA>IAP z@q%KO zcyTy6MPTC0Gb__6E+ls~vqb+%e{*t+DUT->_6!U`?9`_)_~2ACs{C^;=K~S{GXB8{ z5z}vCx3A6uwdghsv8pNEc7tMFjoV1SPyr=lM-9$*DAiaqg z|Eg&PVO?8xlL%s0FI_CI6!wA&VM?G&RULgbX(IqzN#iFK89T|v#UI8Z5cvMtxPE3+ zse}DKMHb{+Wd`Br`p0jEwU=gf%rfMUT}0MLV-x{@f0b#$TKm1BR>*y_@9{V=T)hJ~ z)dTNE?G^C8>k)Q?fxRBWE+W3-w_#w>q@38xv|ENlH_RQ%@@DzSt1J)8_b^>b=Er+b zn3GHvYSpO9AbaaCnR!I|NbYpa&fuV;yp{bPg(3bMn4w?24!J#36tx2udHj%SXE8Q^ z6$}w!q#AmEoKWTZ7$npiZpq|c+0br50w19fsl-2wRs8npGXJwQb>JA28x%fMP|NHi zuGieNMv#=0SA4wx$bt$P#Lkw4M-And+{zdLi={2}@#a#(W>)3H-?S^e3I8X^B*xlg zF*-z5p(Q`cvLjX@Xc-2=KSVlz38$*X^}O%+)KRIlimQ$M3ZPjFe!}UFHynjo=KxDo z3bwwRN0xKiUs)NGP|3)TIj+7<{zUy8^;$di?C@vI5vOgZBB- zc*AeFad%oSVOKP$omi@HF2`9#c0e6H9Y;t;QB@3HdFqnNIJ+Y9dx3g*e2&)il7tJ( zh=E;yKKT2~t!aJ!G3WNSD$XBz)CQ>G8eMviar9!tP%S_~^}cV2wDEM`B$_|dtY{AE zJXlvi<){923sFQg`r!o^@+ytR?5pXpd0+Iq;Ml_b0 zBEYWXXZGK{X)ld?P??+^$B#TJCrXLSVkZPR@up017u!81Htug99-z!9CA&^U3R~>- z0u;!#9uNY5{K|F;P!2Qu3Fwvi2k5{m%xoPa*!-{j(h~qb&#w)u$8du^NzcZb-tHR~ zz+K?5`}5Z=ft62EKpu|NJUApyGKR-Y$*afySgD}zWJgu1$`9nR?mkB#4etO$@EwSU zGZ16PiAvs~wZ9vEj^-)$@c#Vem`kR4to({Zs1FtwRQo5u4JcC~+vh@pq&JzKR2wMPreV*1n-?Zf%R`Qh_iM8Wc>=2{y%emnx1oo-v#CHkKhC) zTe&=CvO*XMlm+sKDeFECLnkC`Q(L4rNrJTDSkdG+3)Ax*Uv4VyS6$uS^wWdP5B)7| zpC9rqj5W+kfw@ecFMgZ^$_IWQMwi9eTM6DdXcITt#xet8ZdjCdEC~b0zJ9%*{v37L8MF*6hV2Zc8LWC8I}BEsZU^%(JDmBkzMl@tvQlr@#B{I$SHsIU7cBV zWLmfo5a3a97b4k5$)VB0<$yz_RsJD~!;>+%TYe3HDTM7=NlZ{5bvq91|FFT3?HX~g zw(Y)=ch&I>^2{qOKJoY8=J<;PLC&Wc$Dt`zTAdj6?}^ZM=K~Msych639=EcW;9>Ic z1-;j?vsnukt6$%8ji)es-v>=3Swg%*bnO8!F|IOM4G|@?>utmRzcfLwquww@{?w3- zzGSpc0k0K541x(-R?xyAvF!B^;O|$v?H&qnHqzd`AzjU#mTGhwt~DWDz5-=td^P(Y zrpgH`1Zs|>oMQ~seE&eyd<38hQ>9>8{Tm1hs&FW=HleS?8uam^&eVA&;m(^xKOzAh zpTGpKl`@DBe~(GoeLp<_n~elC{fG#&i*FLdm9Frqa5DwNM#a}uohb&s_fSlJ%nWWB zl_Bg9KRoz0w%B-`Hw`-w?sLtU&As_aU4J&AA?V<~=2v<<9$5b}Y{ z)!2!k6$-`bGMF;1ji{>m%;lKO53K_Y0d9I1%-|i1CMZ?JKKvb;QDmQ1lL%o zoYd_kv{RhL%YR_Q8j~He;x<}HEu>b)mNU8W+CLb)Oon{i0ifQKhii%#3>sPV#N-7U z?4CrYG2ZpKiz;YOnS{~zP-8v>^)JOoN*afZ_>j)b-eb%mMXf611KATE=tJIDaKZa_%B>%aodS``gXjqpRIrH%12iMoRc2x$F4{{qK$28aN&8fH5C2A2I@xSa|Pc zt^`HL8o2I#M>hHIO-NYt{x=4DpZURmtce4`OeGmYO;O6)6qJQIE3=6)>XaB+t*|)r z`;d-3hf<~VaZ*3#-ybxc#uqcd#xIy$5~WA-(?~N|r8jT+Lo-5k5h8&kppo;3J@SHV zk|1Akyw0VMs{pl~PV>}s6fyd+>F+S(jmAv$D^ylA6c@5<`k-9TVc(#&$iR@@Ww+@1 zV#WTI_*vh~Ls+shMPsTT3zIS$Xuq5ax$@GXXERw`P|PgM2vTD!@#Nj--YCKn8omm%&VSY;f-J z`9y?xc6UZ(l2Ha%8~QXF=OUMyTX`WO7+OMI+C8eZxrDSNgLaLE60`Faw_yrC(7H3GupbJ>Hbl~6UaXeq=MQnJm3KrJAF4&> z*Fosg4FHSH&TnVgQEWPa|NjJ4399xS#*8)wX%`Nvq>>{ft%B?5{VUB>25BhXB_eRX zy5fHapdZrohBd!qs0`xfpiBah)8yUEb36aLm91>$r|W;ex7+>RG57!ewXe^8;+L)- z1R5}v?yaW6t3|Ien!1&lhoRUi`RN@?KBmt5SGRLalS^)YN1DweXqv;!`!GaJ%O`sN zkF0aaxt!Pd+$eVHDZac<+c0f}*#;7bVFXF8jzMc0Iry}wapQy3>yxHk_h}g2zSrPi z>FHqE=C2(1@aA>?_Bv3JaWaIx4BgXxI4MT#DcYG{9c(|02=+#lQ>JT9-j|>Gksu_^LPyn^oAT3y@-qo z)jrGmzMO!0qbXhQ3mX6pfGpksUs{j1X>^bu`H?s7|2{JR&%Zrb=A9Y{TVgN{unkie z(JQ?)Bsa-c&o}@F9aHC#3&&cHXma@?z;5H{+3Dd3y|x*e4VVYGp1Z{)q*;bs!1Fq- z$w0q`Q?H^ zDy-ME)Si9EU>&4++=$y9LfrP}yUIvxjpv|$r{}>mN?^6&dK!U!ZO; z>GrNCz4lJ?Wuu<4GYr6;MzWrd@C|M$R(MaZ_^2n{?;LOpK$m)k1m-1g{C_K3*~;sG z=l}nT_&=pwCSZo~q*tGm4AP;Xti%jbO<@As9aHBYu4eL>CYQ`4z?lbOBs1*(5N$(! zV0c3UEL0q~x~6&53_;!jHP4&?+eXl9QgS!kM$S@#uCXr5s{4yyBm-8(qG9CV=OH%} zCn&9Tf$N$UhKRg?Eu$A2cAjCj>j1n~FH^6aRw%~nF}Ut)C$-bylgdZXpR5V`L2##K z4tX{6;1)A`UAl;R_Mh~?qr%RPkpdUOs~3NW{~tWW{~K|8hY+_to`-NIT^jKk&%=Z_ zab+69JUf#Nj~RbK?iBsz|F^Q0tsLh6Inw`s?I3DH@N#(?Q_b=oot z4O@??V=nmrBbr=xBWb`)HchLtPkW|mSY(1V=?Q*V&{)=ZSi-NcSySzi9y=SFZ%|C4FD9RW#E{ zXc|}zhl#Ghllo$*Mo*)L#ovyR09?Yg4ty)Xv>Kl@mt4?oB)x{gC7%OaSDE#~c^DeA*>F3}t8UwZ zfLh(=C6}{<&CP4tww{WkX5cZ3Zd1byN6!XKv=x6_L95oZO{wTPdx{43UXPtvXL5&C zwgp}rXe8$K+B`y)+^gQRTKC8PyM}FL(_6`D4oM)Thx`8z9q#{cK-i#y*aoHhk5awTrQks=}%*(^DKU2pNLKG&v1JG?a;Ie;QDdRAEnokcnuX4cyG-D zRpEc1qc;O04Efc&68-A`gYyY9ODXI4Bwd;>!DPvnxFp~Fh5SE&BOZ#-_n;&TkU((| zB=kJM7(cOsL&wdk=eJ5F#>vcv;1FMKCdmG*Ot%g9h%Qe<-zKb zX4KT8n(wqJa~K3BlVC7>by3E=nE&&}Zg+p<${+sq>+|oXckSKQ@1O4<*wF@CjKa`c z)&nFEUDcrL878`!U7Y2ZI`6%Z_VI`&m)(}ecGs#Ibe(41hnazE@L;i>ArDqsU)@&f z&@$GHjGBwSXnY^k%{bWo9K0prW!aZXs|k(*fJDVM)Tq}IcQc7cXPf$5!^AAKrx1Vi zpz8{H$mp5q1@M(%{dj03_ZsGcSM~r%uyaF?t!n%r0}g>HC#YDjW9`p7@0xc=s{7G= z_g;Yh#X0UN&Jo-OW7k8_``rFyN%MF@myfCQz6%#n9MR;m09oJ+O3kQ$H~Wmk zS?}F#)&iO|0*+hkB*Ccz=aOD5P|ttQC09+}4EsVrCX{)-*B74NPFn{iSkDbug;WFe z@jD2RF=|lc0*FEPy=F(AtafQm%`*z)M^f_O=!OpH2hR2XH+Q?=yz=1N&n{j~A3Z!4 zzVU^>A-=G`)}7)E9Q6c==I5QF5vs}PRna}C0SJD0p8wg056}M;nA7B7xAcEDcfAPQ zD!hP;4AWT$j8WmJkErvR3wm}$lgsfiKq(Ad2E!6G2|(2QwqcT*UfhjubXjd#|AT|_ ziqeMAKH3}jzj^p4=P@Qp#HKa>7lU*3EV^N)ozh4{r~7~K96)yoC~w`*1G~WR>s92U z7p1fYLkepRcZfNdQ*)%Pi4}i_2Qt?=h>E|OUa^v(%m9uJ7_#_v{|`u=!yD@gQew;5pzOW;##fCTZ4nr|Xv>J-xx&JI*49>wl`H8$RFg`G(JbF7dhA zFAE2dG!;op_58ep1eIqi&>ahVx60cP0L`lB5%>8ctHujAC}o5IrS2mr`u4_rJ@S76 zP)h*<000yK000O8HGE`4@(YmFsBZuOz|E5hlQ2>acw|FXjb76R000040000400000 z00000000000M>5+0Bmn#Yfwu80ssIM0000801kL$L%@PvbG07;0077U01E&B00000 X000000002~ZlTuwU=DIg-~8hIVXYiz=8a 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 diff --git a/formr_scheme.mwb.bak b/formr_scheme.mwb.bak index a9d81c85c4c5002f36fa69ca337a42126adb1805..57cf9dda1b9d17e657d0b7d70a1c276e3ba53ce9 100644 GIT binary patch delta 36588 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 V_@6UVVCKgR5%AZv%!Lf8e*n2p^#=d| delta 37197 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

    vjR)heKwZi|nc@q>4IhRU$*>7h zg^lj>Vk1HqF%Ab)p8S%b0#B2ksx(Z!Urmt8Zq|aNye&K66tx7WEa}X3n9S+~6yEhcjlLV$D@WqG_G%guT#qrbzKU zFmSOCl$jfuTpb>|T%_98h1vAmLVlLL^`(7ix5D3v;jeb<%Go-HqdaQ(0Ag>sOwKWU zoZx(^hMQ(wH%!WWPswHI@ON1Rzt`zUOk75UJQXdq?&Q4!r!?dSPbK?-_Gw|YOJiSU zT^E{1Tf%ttV)9sp7C*k3AH5;i6a7lnYvJMdI!3cA+*%*Jp*CPD&X{M@5Ej{_xgB2e z_SOSCwYu8UHvQvFp`i)ylmHFc69&^O;Mf-i`ScxRyyB0JV0$~*usahLNe8naHRi^U znmmFxF6D!mXIrY#$3Zu*$&3EMhoKqUe{jRwZ2cOw*ZX%O{sK$li1(^kdW=@o`(%}# z$@@*vQ&94;@PNEyto@}Z4ElBtj?SUAeTHUTxP}@+_OMDPw*VM!9lr|(cMme2pCjPnO86XUZ-~ zK(Bk^R|i6A)nPtG_r4>TeZtrjiYc%1E_hLfV+8QoQVQbDGiq7;tLOut^0iBR{n0i&bUD$452E}OQBzk9=YaT7xx9lzchJ~r&s^U-cQzX_GRO_la2gM>_? z6HygBMJ6I+3260kKl4+KZtsF#rXn59bPhN0dtRRNML+^6wZBbbSvSY|yce>SAUV}0e#0zX*$2Xfl?0Wx{H0q8#b z3@q*Yi66FlvAtwXGu*be_&)s3Mi8m_WezP%Gz`Y3gvSv!LWX}csF=j@1or@Dq+dq> zH3BH`*wvc_J1(cZaX}sW<&F_<2G*HQD$yF^I8SqvjwITPhK;~|OFeELwy_b0WstQi zgG$)IlCPf!2AhaIgFY}Lh^{I~TbWf(Su5S0IKQzXQx4j?a zHxqJohxY?B=6mIH(_;EFN}ramJNrnh0reCqM(vTd_OVuubUn2QrK!@34$RKMCu1u2 zdau(yZlzPW=PzGAM`**?fc6U4R$&yUl5HRXLwBBG@hYB0DH+M5xQ|=9(Jo|6S7tb< zocS;)*EcrD|9m9+)~CIeWDzbm7R|;ZS71+~Qbpo11&vql#X2%y8e~&NY>%4h13n$- z{^$-yKhW|bY6h>85B&X75Sl3m8s92BW3;rU8hdPAT6=5jkgPus?ryV9)>(+6jX2w& zL^MST`#vS&J}*&d79#S{II~^hS%pad+&WEus;z(ARJN+GQ_d#_&R)Q;r=*Wdw_nS&7iWS(>i@8ED_nhhRFqQ%io)P=!VhYVo=<8u6vn(NUPE9uHBztlKh2--o9xg8EQK9cK?H)) zGL%6-`&K58Iv&oTw1fA*l|mGS%HicRW^XT(NAgzx7ss_p*`5R|~)ge_2>jb0w*_foSg z?Gnrqs6-WCVztaJ98A868N(Wj`ZduR@!Tgt118T;9=BcxO(-KtQds>@*H^EGwSC$n zod^zhLssYuJyL~}v##5@Ii_>`ZYg$Wdvqk|#grb6#%W&^LI~sYE#JD*Ppg>&cRSGZ zY%bY)BV1xb$=JE{U#H>zMG;MUHckdXWtO=>{!NmzPx}ps0-8byzig=PQ*~=5T%vAU zLALJqLN8wboO1fuu$GsWuE_xBoh8~OUG_qt2`8W~<+Wu3Nu9&%gL%8U>#3@qVJwQA zn%G2V5%s59baR!@+|@kA(IIWg;NNUDZW$D(uF`fgsbJ77MNx6L9Q#|D=j0Y(X;oqn z`N6AyGfibF=E61JSKq3?l50zmSiK}8_nr_RmICY9r1?Y+Y)sy$Qq>%y@!@Mb#THUu zYEQ(Z2Z}bv&pbrAsEBZ9%k1)+AZESDb$7b>Ld@bSmwq-^Dn_0dYF+G+Vc!3*r!QFd zP$ZKgGqFEjm}@p#BtYjTzYd+8{bOrZZ=>7b88V@@GFW~tFu=zR9DWiagCvO z8XAuk_+U}NaIr;3%# zJpCAgblO_dZk&?&f0L>i#{V-?{r)3d|NmY7toT388Uo??U*o@XlV8%)cu|;qVp4ki G*?$9a-)z?a diff --git a/schema.sql b/schema.sql index 2a0a48eae..ed8e6c3f3 100644 --- a/schema.sql +++ b/schema.sql @@ -53,12 +53,12 @@ CREATE TABLE IF NOT EXISTS `survey_studies` ( CONSTRAINT `fk_survey_studies_survey_users` FOREIGN KEY (`user_id` ) REFERENCES `survey_users` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT `fk_study_unit` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE CASCADE + ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -72,15 +72,30 @@ CREATE TABLE IF NOT EXISTS `survey_runs` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `user_id` INT UNSIGNED NOT NULL , `name` VARCHAR(45) NULL , - `api_secret` CHAR(64) BINARY NULL , + `api_secret_hash` VARCHAR(255) BINARY NULL , `cron_active` TINYINT(1) NULL DEFAULT 0 , `public` TINYINT(1) NULL DEFAULT 0 , + `reminder_email` INT UNSIGNED NULL , + `service_message` INT UNSIGNED NULL , + `display_service_message` TINYINT(1) NULL , PRIMARY KEY (`id`) , INDEX `fk_runs_survey_users1_idx` (`user_id` ASC) , + INDEX `fk_survey_runs_survey_units1_idx` (`reminder_email` ASC) , + INDEX `fk_survey_runs_survey_units2_idx` (`service_message` ASC) , CONSTRAINT `fk_runs_survey_users1` FOREIGN KEY (`user_id` ) REFERENCES `survey_users` (`id` ) ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_survey_runs_survey_units1` + FOREIGN KEY (`reminder_email` ) + REFERENCES `survey_units` (`id` ) + ON DELETE CASCADE + ON UPDATE NO ACTION, + CONSTRAINT `fk_survey_runs_survey_units2` + FOREIGN KEY (`service_message` ) + REFERENCES `survey_units` (`id` ) + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -93,9 +108,9 @@ DROP TABLE IF EXISTS `survey_run_units` ; CREATE TABLE IF NOT EXISTS `survey_run_units` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `run_id` INT UNSIGNED NOT NULL , - `unit_id` INT UNSIGNED NOT NULL , + `unit_id` INT UNSIGNED NULL , `position` SMALLINT NOT NULL , - PRIMARY KEY (`id`) , + PRIMARY KEY (`id`, `run_id`) , INDEX `fk_survey_run_data_survey_runs1_idx` (`run_id` ASC) , INDEX `fk_survey_run_data_survey_run_items1_idx` (`unit_id` ASC) , CONSTRAINT `fk_suru` @@ -106,7 +121,7 @@ CREATE TABLE IF NOT EXISTS `survey_run_units` ( CONSTRAINT `fk_suru_it` FOREIGN KEY (`unit_id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -164,28 +179,6 @@ CREATE TABLE IF NOT EXISTS `survey_items_display` ( ENGINE = InnoDB; --- ----------------------------------------------------- --- Table `survey_substitutions` --- ----------------------------------------------------- -DROP TABLE IF EXISTS `survey_substitutions` ; - -CREATE TABLE IF NOT EXISTS `survey_substitutions` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , - `study_id` INT UNSIGNED NOT NULL , - `search` VARCHAR(50) NOT NULL , - `replace` VARCHAR(100) NOT NULL , - `mode` VARCHAR(255) NULL , - PRIMARY KEY (`id`) , - UNIQUE INDEX `uniq` (`study_id` ASC, `search` ASC, `replace` ASC, `mode` ASC) , - INDEX `fk_survey_substitutions_survey_studies1_idx` (`study_id` ASC) , - CONSTRAINT `fk_survey_substitutions_survey_studies1` - FOREIGN KEY (`study_id` ) - REFERENCES `survey_studies` (`id` ) - ON DELETE CASCADE - ON UPDATE NO ACTION) -ENGINE = InnoDB; - - -- ----------------------------------------------------- -- Table `survey_run_sessions` -- ----------------------------------------------------- @@ -210,17 +203,17 @@ CREATE TABLE IF NOT EXISTS `survey_run_sessions` ( CONSTRAINT `fk_survey_run_sessions_survey_runs1` FOREIGN KEY (`run_id` ) REFERENCES `survey_runs` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT `fk_survey_run_sessions_survey_users1` FOREIGN KEY (`user_id` ) REFERENCES `survey_users` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT `fk_survey_run_sessions_survey_units1` FOREIGN KEY (`current_unit_id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE SET NULL ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -294,7 +287,7 @@ CREATE TABLE IF NOT EXISTS `survey_email_accounts` ( CONSTRAINT `fk_email_user` FOREIGN KEY (`user_id` ) REFERENCES `survey_users` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -313,7 +306,7 @@ CREATE TABLE IF NOT EXISTS `survey_externals` ( CONSTRAINT `fk_external_unit` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -336,7 +329,7 @@ CREATE TABLE IF NOT EXISTS `survey_pauses` ( CONSTRAINT `fk_survey_breaks_survey_run_items1` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -356,7 +349,7 @@ CREATE TABLE IF NOT EXISTS `survey_branches` ( CONSTRAINT `fk_branch_unit` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -380,7 +373,7 @@ CREATE TABLE IF NOT EXISTS `survey_emails` ( CONSTRAINT `fk_email_unit` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT `fk_email_acc` FOREIGN KEY (`account_id` ) @@ -398,7 +391,7 @@ DROP TABLE IF EXISTS `survey_email_log` ; CREATE TABLE IF NOT EXISTS `survey_email_log` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `session_id` INT UNSIGNED NULL , - `email_id` INT UNSIGNED NOT NULL , + `email_id` INT UNSIGNED NULL , `created` DATETIME NOT NULL , `recipient` VARCHAR(255) NULL , PRIMARY KEY (`id`) , @@ -407,12 +400,12 @@ CREATE TABLE IF NOT EXISTS `survey_email_log` ( CONSTRAINT `fk_survey_email_log_survey_emails1` FOREIGN KEY (`email_id` ) REFERENCES `survey_emails` (`id` ) - ON DELETE CASCADE + ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT `fk_survey_email_log_survey_unit_sessions1` FOREIGN KEY (`session_id` ) REFERENCES `survey_unit_sessions` (`id` ) - ON DELETE NO ACTION + ON DELETE SET NULL ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -433,7 +426,7 @@ CREATE TABLE IF NOT EXISTS `survey_pages` ( CONSTRAINT `fk_page_unit` FOREIGN KEY (`id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -460,7 +453,7 @@ CREATE TABLE IF NOT EXISTS `survey_results` ( CONSTRAINT `fk_survey_results_survey_studies1` FOREIGN KEY (`study_id` ) REFERENCES `survey_studies` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; @@ -533,46 +526,11 @@ CREATE TABLE IF NOT EXISTS `survey_reports` ( CONSTRAINT `fk_survey_reports_survey_units1` FOREIGN KEY (`unit_id` ) REFERENCES `survey_units` (`id` ) - ON DELETE NO ACTION + ON DELETE CASCADE ON UPDATE NO ACTION) ENGINE = InnoDB; --- ----------------------------------------------------- --- Placeholder table for view `view_run_unit_sessions` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `view_run_unit_sessions` (`session_id` INT, `created` INT, `ended` INT, `run_name` INT, `id` INT, `user_id` INT, `position` INT, `unit_id` INT, `run_id` INT, `type` INT); - --- ----------------------------------------------------- --- View `view_run_unit_sessions` --- ----------------------------------------------------- -DROP VIEW IF EXISTS `view_run_unit_sessions` ; -DROP TABLE IF EXISTS `view_run_unit_sessions`; -CREATE OR REPLACE VIEW `view_run_unit_sessions` AS -SELECT - `survey_unit_sessions`.id AS session_id, - `survey_unit_sessions`.created, - `survey_unit_sessions`.ended, - `survey_runs`.name AS run_name, - `survey_runs`.id, - `survey_runs`.user_id, - `survey_run_units`.position, - `survey_run_units`.unit_id, - `survey_run_units`.run_id, - `survey_units`.type - - FROM `survey_unit_sessions` - - LEFT JOIN `survey_units` - ON `survey_unit_sessions`.unit_id = `survey_units`.id - - LEFT JOIN `survey_run_units` - ON `survey_unit_sessions`.unit_id = `survey_run_units`.unit_id - - LEFT JOIN `survey_runs` - ON `survey_run_units`.run_id = `survey_runs`.id -; - SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; diff --git a/webroot/admin/add_study.php b/webroot/admin/add_study.php index c48a1bc35..bcedfbb97 100755 --- a/webroot/admin/add_study.php +++ b/webroot/admin/add_study.php @@ -9,12 +9,12 @@

    1. The format must be one of .csv, .xls, .xlsx, .ods (OpenOffice), .xml, .txt
    2. -
    3. .csv-files have to use the comma as a separator, "" as escape characters and UTF-8 as the charset. Because there are inconsistencies when creating CSV files using various spreadsheet programs (e.g. German excel), you should probably steer clear of this.
    4. +
    5. .csv-files have to use the comma as a separator, " as escape characters and UTF-8 as the charset. Because there are inconsistencies when creating CSV files using various spreadsheet programs (e.g. German Excel), you should probably steer clear of this format.
    diff --git a/webroot/admin/index.php b/webroot/admin/index.php index 5b0854e7d..0005cf6f9 100755 --- a/webroot/admin/index.php +++ b/webroot/admin/index.php @@ -7,7 +7,7 @@

    runs & studies what's the difference?

    Studies are meant to be a simple survey that can be completed -in one session (though it can reference fields in other surveys for skipif and substitution logic).
    +in one session (though they can reference and use information gathered in other surveys).
    The only way a survey can be accessed is through a session key (which allows exactly one session). These keys can be created by another applications (via API), a user, by runs. diff --git a/webroot/admin/run/user_detail.php b/webroot/admin/run/user_detail.php index 96a7f00c7..9aa8660d6 100755 --- a/webroot/admin/run/user_detail.php +++ b/webroot/admin/run/user_detail.php @@ -15,13 +15,16 @@ `survey_run_units`.position, `survey_units`.type AS unit_type, `survey_unit_sessions`.created, - `survey_unit_sessions`.ended + `survey_unit_sessions`.ended, + `survey_users`.email FROM `survey_unit_sessions` LEFT JOIN `survey_run_sessions` ON `survey_run_sessions`.id = `survey_unit_sessions`.run_session_id +LEFT JOIN `survey_users` +ON `survey_users`.id = `survey_run_sessions`.user_id LEFT JOIN `survey_units` ON `survey_unit_sessions`.unit_id = `survey_units`.id LEFT JOIN `survey_run_units` @@ -49,6 +52,7 @@ unset($userx['created']); unset($userx['ended']); unset($userx['position']); + unset($userx['email']); # $user['body'] = "". substr($user['body'],0,50). "…"; $users[] = $userx; @@ -70,9 +74,9 @@ // printing table rows foreach($users AS $row): - if($row['email']!==$last_user): + if($row['Email']!==$last_user): $tr_class = ($tr_class=='') ? 'alternate' : ''; - $last_user = $row['email']; + $last_user = $row['Email']; endif; echo ''; diff --git a/webroot/admin/run/user_overview.php b/webroot/admin/run/user_overview.php index f04f6057a..c3d770713 100755 --- a/webroot/admin/run/user_overview.php +++ b/webroot/admin/run/user_overview.php @@ -33,7 +33,7 @@ ON `survey_run_sessions`.run_id = `survey_runs`.id LEFT JOIN `survey_users` -ON `survey_run_sessions`.session = `survey_users`.user_code +ON `survey_run_sessions`.user_id = `survey_users`.id WHERE `survey_runs`.name = :run_name diff --git a/webroot/admin/survey/brainstorm_email_reminder.mdown b/webroot/admin/survey/brainstorm_email_reminder.mdown deleted file mode 100644 index 3a13adaab..000000000 --- a/webroot/admin/survey/brainstorm_email_reminder.mdown +++ /dev/null @@ -1,46 +0,0 @@ -### an alle -SELECT email FROM vans - -### zufallsziehung -SELECT email FROM vans ORDER BY RAND() LIMIT 1000 - -### nach demographischen Charakteristika -SELECT email from vpnueberblick LEFT OUTER JOIN demographics ON demographics.vpncode= demographics.vpncode WHERE demographics.sex = 1 - -##### schon ausgefüllt? -SELECT email from vpnueberblick LEFT OUTER JOIN demographics ON demographics.vpncode= demographics.vpncode WHERE demographics.beginsurveysmsintvar IS NULL - -#### nicht zu ende ausgefüllt -SELECT email from vpnueberblick LEFT OUTER JOIN demographics ON demographics.vpncode= demographics.vpncode WHERE demographics.endedsurveysmsintvar IS NULL AND demographics.beginsurveysmsintvar IS NOT NULL - - -# brainstorm RUNS! - -## types of run units -* survey -* social network -* breaks -* emails / reminders -* loops? -* feedback -* external pages -* lab date -* __branches__ to other runs? - -## access regulation -* can all be done by branches -* require - - email - - birthday - - relationship - - registration - - demographic info -* closed user pool (external site doles out session tokens via API) -* open (session token created on access) -* looped (???) -* survey about someone? - - -## order? - -## using runs to specify which tables to look in for an item? \ No newline at end of file diff --git a/webroot/admin/survey/delete_study.php b/webroot/admin/survey/delete_study.php index 6967b4293..064eeda21 100755 --- a/webroot/admin/survey/delete_study.php +++ b/webroot/admin/survey/delete_study.php @@ -6,7 +6,7 @@ { $study->delete(); alert("Success. Successfully deleted study '{$study->name}'.",'alert-success'); - redirect_to(WEBROOT.">admin/survey/index"); + redirect_to(WEBROOT."admin/index"); } elseif(isset($_POST['delete'])) { diff --git a/webroot/admin/survey/edit_substitutions.php b/webroot/admin/survey/edit_substitutions.php deleted file mode 100755 index 3453ee93b..000000000 --- a/webroot/admin/survey/edit_substitutions.php +++ /dev/null @@ -1,62 +0,0 @@ -editSubstitutions($_POST); - redirect_to(WEBROOT . "survey/{$study->name}/edit_substitutions"); -} - -require_once INCLUDE_ROOT.'View/header.php'; - -require_once INCLUDE_ROOT.'View/acp_nav.php'; - -$subs = $study->getSubstitutions(); -?> - -

    -

    - - - - - - - - - - - - "; - echo ''; - echo ''; - echo ''; - echo ''; - echo ""; - endforeach; - - ?> - - - - - - - - -
    DeleteSearchReplace with Study.FieldMode
    - - -
       
    -
    - -
    - -
    - $value): if(in_array($field,$display_columns) AND !empty_column($field,$results)): @@ -85,6 +85,7 @@ function empty_column($col,$arr) continue; else: + if($field == 'label_parsed' AND $cell === null) $cell = $row->label; echo "$cell"; endif; endforeach; diff --git a/webroot/admin/survey/study_added.php b/webroot/admin/survey/study_added.php index 3c2bf9ad2..8d0a563cf 100755 --- a/webroot/admin/survey/study_added.php +++ b/webroot/admin/survey/study_added.php @@ -44,7 +44,7 @@ $errors = $errors + $study->errors; } -if (empty($errors)): +if (empty($errors)): umask(0002); ini_set('memory_limit', '256M'); $target = $_FILES['uploaded']['tmp_name']; @@ -79,6 +79,7 @@ $messages = array_merge($messages, $SPR->messages); endif; +// if items are ok, make actual survey if (empty($errors)): if (empty($study->errors) AND $study->createSurvey($SPR) ): From 823cdfd87fb118cbba2950f1f48f9b27a3b57a6b Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Mon, 4 Nov 2013 19:08:00 +0100 Subject: [PATCH 7/8] added a contraception selector to example files --- .../Example files/contraception_selector.xls | Bin 0 -> 67072 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/Example files/contraception_selector.xls diff --git a/documentation/Example files/contraception_selector.xls b/documentation/Example files/contraception_selector.xls new file mode 100644 index 0000000000000000000000000000000000000000..8742e50040b56a88e5a56a4cc5504d0e866905ed GIT binary patch literal 67072 zcmeHw2Vhji*8fc-2{rW4mk=O<^hP3qR05l_2}uYTmAKh#k~N#%xVs^QfS`b4d5VH4 zioG{{qS#}vPgHDRMNsVeuwy~;|DCyW@7~$m#PEIJ`##_MvoL#i&di+o&6zW2&di;A zv-{Pd`>(ra>;cK=Ggk_bj&_Ag{WNrc{Pt7gVUpC!<43!?x)kyn{6O^h=ifvEe*ov1 z=(7NXK!hL!>hoZP5QI>K{s;pQ1|keX7>qCk0V*I3MHq%K9AN~)NQ6-cqY=Up#vqJE z7>6((VFJQLgh>bngvkgI2vZOu5vC$cLzs>bg%FJ}17RjY3_>hI96~%o0zx7}5<)UU z3PLJE8p14ubc76q6A)%2WFpK#n2V5wkd2Uokc*IqkdH7Ap#Wh%!U6;%LLovCLNP)K zf(fA%p$uUmLODVOLM6f?geru^2ul!7M5snM3E^afQxKLS)F7OSU`D7#uprbSSP|+G z8W0*0YzU_zG$Gg#nh_ibPJ|YO(-B+0rJB7@ zKZZ&Eex$bwhQ1UcgqIzZa|WU3S|QbD^n?r2GD5ob3=>g2kiV13yC=R;sGph=fIt{} z%BQ8bA+m-B4n9H9IwyLcFj!HO=NR#%qkg6BeXXDB4dL<+4Z$ex7bIO(u`4(Xt?1WJ zk`74z(%%E0#J41Ugm5x64P(E&wbtq|0l*?q~8`l*vv;skO)2H2>p{B{;>62Vm5Bl#m^Bqa99zJW;1Lv^$xX4E4Ls&Z~2LV$*||6 zCBF#iPD2D-nizyBa8qjF#>|Epjgov*PDaYaz&UWa#`je0B={FrAULHL23hdeCUj>I zhq`;KT~3!V7|~S`y|d^YiI$lSK3kIHSEIIghGgg_4>6UbE{l28*pn|_}h#bPJRv543RM$fK^o*3AUo;jgscv`WE z5JZsP7VAUJf+dieOD4`L9!ptG_R*!!7(ElEFh8KCpZ=LrMR$!lly zACJ@jC*(j<^n=Q&AAcV?-^Wt|&lTmb((mqpeoYVbp7`9>L;jxl-+7Grd&0B52R=RV zznA5Q^C;_~Du=6kpkLJkUB=U$&z2tY-_rwKmQQy+kM)p$QxEi>@Z8u#{+{s2?G5fG zpSu{J5QV;Z=+MgsTsA-ol-nDs((CIVpY-@7DewW7KL|F2>G?0nz&?t8M)yFE>482& zmrg5wy>Udl0F18o@9hi^RtGZuO|~eWg!LVx({2IFFVj(6rqd1rryKASn+ZPjA3AEq*H+9iqG8Dy8~)Ij=hI_<2m{NaqM z(kaI5m2Q56ycI*4I3L=bVflUdjAnR{pSEh~!}C)%y?Uv=j1MU=eboHCUETN)9h0>W zopy=z_@F~|>9m`qm!H_`(Z^wB%jl%2^x-&ZH%c%6#2)DAP~H5Kdf;#9A^&7XN5A{X zU#4Tf%ZHBa-RfN#GD2FZ$el7^-|6$qj<{BZ#7e6KI;Htz=WYbsrSL;c@h}F%bMWt8 zfU+D@0eJ~|3^mYp$uZSHdpyTffLx+uDnN6^F%<|t)&kTi$5aEE|6?jZcKetLkU>AD z0yKb*sQ^s@$5epkhGQx~lS8isa(u=E8Oea2$3q|+DAsyXIb}_yzg#!m&+T|H(AOtx8jP>-&!wrQC7j`nm_JS59*>q$k&y1I6$OcWEeW5D5Cj-BAOSJujZYAB(LUmlT`PW z_iUknud4d33R&bc9b}?FV9#qAlDqFv)ec{!+1-)MQIU{5(MD08-3!cB3+QS^_X1hR zS|Iya3*;PYf!t#)kaw&F@{hH^JhcGz13rJ&4+Y3`OgcATEzrjr7W`R(C?6#?qJW>S zlCBEz&0Ba3d5exAZ}BnYEjfm~CN(cfFS));?Vs*#D?Nt1Wyg?r;W6Z;17CgZi;82& zTiHuqU$aPu`RUJ_CwT|!>7l-%n3L% zXuz#u1J3eU@J~KPCA%1=r@^Q456vC?@84R^{pnUdo>ZgR3ke% ztePNe{rB&`r(ex5-)fS(S2L}bYGgNvRnyN}|J8T<^s5=}TTM#$YG(9O4LM4*Q4T=` zTk8*g__cmDBYdk#?Osh>FV&EH#j6Ri*1!ADAM~pk>03=&_iB=QsYZ5~SZhM9^?!Wv zj(#8?J9n7*FpViM*CKyqiIumsYa`5yNW-3@B#g5!hNgJ(X{Ek zRHN0jUBz!7d{n=hF}~I4XxhwPs?loNuHs!!ysKZ$Sl?=NG%dcDYP6cRtN4L^pX*mM z&bJyJO-t^j8m*@7Dn9boefrgmr)tuA*E9pFN$Z2AB_&^a?_RkYGHCdyHf@4$H9DFW z*-JHAO-o9Ccgtq|Y9{(tqoZk2y;P&sw4~%`_Fk!9%_QGybTlodmuj?{mXv(Ywa@EU zWALp;N7E8|sYa`5Ny(SI{JwrQlYOhv(X^Cas?lm%Qu1$)U!+&fKj8A-bGkrVZq zPW3W{w)irQ_F<~k5bSu>U9Zn{nwKeb!k81GkelNo`HjCWrqz%@{Z^??MiY>5{4~6 z+#k#{+bykjv&ZIiToQ7o$k2aO*8n^^L5DW!2)iA>yhrAPnI}O^Y0<4zKs%PKf_`|8 zgc51T#1CT7#zKTxs1V!aKLn=>ai=q{(Q0WjO*7f~VRB}u~CC3z0a%_`-pfqz$K-VQ91`$e704mAD8Grd1 z1Jor^-k3H0kT=RFZ$CV7<;`orQzHrNi4nO>?3zH7ndVa_uqy;*T5(F%#e822d*(wf z5w|87CE|Qa1a}SWRzj?6B%ZIqUDA2WTX5Fj>~Xr<4VBjAo=ZaJi>&-pyTb6u%yK*+ zKz&a~WIgQRiFU}m5^$CyPQJd<`_$Q7y+YA8Z2rx6I-#huMZSJxy8`hD4m}c5hw@%k zrF~0<7b;VD4aT{ZP&}|>HP_i34F;?ge1HaoL9z<~h;-iupbY>huMwCEV8Bc=u9Df2 zDh30YYzQ~`55^)x!yLBHm-$c~=Cb|kfq7TfEsv8APt23G%wYq4nGe%pF5AH#n9Ht# zKVzPvWe!{DV-Ny{>o6yKDEC;fRxF$R`{U^<-1RX!T3VqBtzwt?k3f6q>6sSjB6YfV zpwT|5(rL7r`rjP>VQ`ROmx^tUCTkrZ|3yAv!eN(+Sw}aa)9VBa5TI(KYKs)>Lz}1l zAh>~eehf3H$=d31nPFah471;O7-ka~Q%haYDKacxC8ga{rM=s*#mW^PDz!$!a7-4l z`bntL#6}H0azw1S^!@PDyI2jy^9^8Oa(b+ngw%>W{QG0P5DyPP;UKNT`-OfhM4OfhM4Y?J>0JU)jzbfv8x*5hqHm5v1KQYM4$eXce6WFdt9?}4xy@!A?j0Fi??y^9pRKorO$z8D{a%+_ssn}3FiZ~F@37TCFGFh^D z%@Tq74}hg!j2c`RSBllrGpjU-GYMZ9vP8O2vq`cMts9Dem0(iKT3Z3g?d(?x+D^uh z9zDx|6m8Nnra}5SQlv}pFc@w9qb@w>_CZKLY0?8D5PMTP@VFu70oP%G(ksvqs_tw(R3W1)CI$=&K&W^G@ObF0(W6D3%( zG&*e-tNV(OaOnz-_$iS-7`M_5c+&0$pR@~*;)j1v`h_4!(*6j4X%F)4(d47bk4Rf5 zi~y>ukO!vE=5Tvltrl|0kkRR|w>upcEB$OCn%RzQGobz!yV>nV-41iJ6&Fu?ixpJ6 zxz=jO)on4`t(e&CHn*pSvS6sYn`|w%dLy34onkOHx~zsOtE=&dr`6HW-_+_bxIOT; z@DN~|&4pwKepzh}TZ7e5;4(KLwxX4la(RozMMB4|c1xqxkmK;!Vsp*4?XhJxa53O% z!dA};l&Y{<={8^ss2CA$tKDkx7%1ijN_NG%Imd2wyKQE}f_Y1Fiea0h7Fd^??a{zI zkHirN>CCUlM}dTxgtUbIlHaw`wUPl-cLpBz$iP1X9?C&2W?P*ZB8)1uI?OGNW><4G zO6FITsU?zG3EJ(U67Vx~+^x-KkJXTr0AWQ{S?$YgW(SojHqB@CB_?R=OGbUOFjMl< z`Brzc4bMv^C7^9l^IbM|Rm zRlG^4D+bxqlp5zPGuvAoX4D9ch$=DHnOogVPF3?jL$#)P6%2Q(26qa)A(GQ9#syFd ztj)G2a;H!RLWs(D#TkmsbyjV~DGaIHRLEw&xz=SP1<_z5=_hkpqOXj0yUk%HToqIPHquAVxR#4??S0*uta>t+r#a5fsO{%cC-Rf!dvPx!cNrSQCeNb%0pkVr< zVU`AFsa$GcQtVtt(5Z_{T@7Z3)1hT3*DMPM+EZe-VODUGY~UtG&9~N}21B{c(&(|e zwB<-b1c!jYCYE5dxG~&VNkhH0xf>q23N*jO<^qUiX40BmbGy}5MOA8f%N>@YH1b3< zDH^o_rSr}0cB{u@MQ@*IUZK_^>vkg7PP97L42`mwku9$zN0W_oFqI1s-Ii;$n_Xt8 z0e-+-xNXg59Mg;{cX~YXAc`%~B1=GNWdKoWo4wiTph1_IV<@9BXZGe!g38f=kq0P2 zLSN-u&D0Uq7%H}9W;Rqz^Hq3>Y=mZb`z{YWkx$Ja^UUDQM8$bzA89RPC{Z&d10unc zD@NOtk(!)9M#bT>o$kvqohveQ&)Uj*Pf`Y3vR6+NS&K;2d<4@_YH(_qQO)UGyu;U9#J$3Ux98&zy`leYP=P36`^J7AK@D3zEoe`5Hck`nWBn|2hC zWHR`GL2|RXo%Bw%0J1SxjcbX`;&MWAPKPEBja9_}qv;rPgbkxlwPEqORyQUMuTX=qgWTYf>sPR6+tqSj$*-~$0dsOp{6?>PRO$b<)U)jm=?7l zWNRVYHMpDkk?ziotVT_EtNCFn1C;U-2nWMO$~~eoR|yk24Ky1Sz*^&>*G*W za%y~X0{#zUlX0pc-jEQJm>^%YawH|1#dQ?Lz|2gdAr1-gDZ~NpC8l$k1JqV#(XB6( zSqsQ2T{O}#q{L#VUnoUNpT@Nl;8E)IRvS#5rVq)6WndmAg^;tzh8vaS+LqazcAAh) z&Q@1D8?R>Sj_NiNLL5|vp+^qDNK#>sf-iyIYHsnE4c@UGo19AKw=74kobGAT7?({u zxRBMA=PzW|WFt-2*x5WAd?XK!!$%dG9d5VP5etgBfy}3AekD`nq*O9)d3G!MjYdR{ zy&3b2-ELT5g;mx}FQmR+zX<}!Yj1Hm>yV2qQ$FREy(bMEnvfKI0%}%*jXgt7F-;da zc3Z1QX9A#dsoa>L^Yh_eS+xx%|ABJIb0g$D4->TAYNnP}np<71?jD$?aoq(|xO)y; zz17>pvXE1`kSRy2-A03n+UIq&qRDtUT~@Qfjp^7o=g$IlvONe2^gi33AhRkLnA8F{B`7ZM^D5}|G&<+bS8(zzacAKou*m<`Q~PLhSzcfL3WCMvw7Lx>Y>a@=>{l} zjWQ>t*U(RlFnN)e#1?muQ4SVm=xGdUTI1C;($Wru=Y2{q1)13NWpe9cxsM8C>?AX)2d}XQDEnm@)!Mos|ZMMfPHW z!=kvWHOW`cvC%=A5BF73Zv3 zcFxdh#mz!Fh(-1}Gy;;zmD^iA9<1kemHxZLTrf0icfNClmxut2_~bcp9Hy=qH~@NU}6@)UcTYxm)CU z0_@$2y+?LnN0VBcQ4_|ZY?o_bmr>kdb=FvA0}ODdGb;)$UO|SDKq_MryiaRoLlW8Q z*oXvU!c7guPu77Lk0=CdfF6{`2>;EzeJs-IvalC5Ho_14NC6|-R;>++;V`s1+{#W?jsunhBy}rG=8I^v z8D`!QH)942mIrsk&<+N_hC!wcv|>N_hG1xb9pja7BxKI9iRP}gl1FCcyJQ?P_{LyM z4L+IG4x_9Z`luN@XEa0`6dSK?ChZ{|w0q(V`4CDod7Y?_vBQ=e+g~EWiZ&Z9F&u^j zw6M+qze2-ZVH;;C!4^Oxyg%C3tD|1SbkRoL1;r&{7|gAfM(R+_gb~#YWDQo5iHyQ+ zHB@8%GBh6{&y)7_&^Hc;0ljL#23dlkxz+Bmwb*Sd-~&+4wKi+f@V1iJvEyjA1AZK4 zQ%7raEjp6c4+t=8%@)+k=Q2#1nhsFNr~FGgfhN(@tnlwKW1@M=94hGEF?I^NgL);I zgrn&fg>{@^!NJygTf<+iSD^N4ucQEbOyViDB>JzaJ=+_087kXbRG}JR^xLeCI;)4Z zo!mvGbKUSy@*3?0UbIOp*vrVj<6 zJ@6GRHT6yx^jp?nrFC#R7GvC?`Pg%p2T>L>!5zSDNNiwXGtA2N^PLVW1YyLeNhzpQxdvlL4_s{wJaS;5$t4N=TmL}N%bIj}+Ou5mU%pokW+XlyA( zN!m`E2Ma8l19EV+w%|927DlWQiJ0u@R#uI<9$A@D1ojBo#=#W8QbeFvY!0l#JeY8y zN42mit&V!!%4qb|nq6pqi`nIYe88FKLPwOzG;L0}U(_!cjBaZkdY>361eg~OAS#>` zvb7GI2?{HPNO{#>00L}ZyWDt?AqUEbn;*F{r5Soa>SBn((zK-!w>p~5F?7qL)#_+s zLXI(%IngL*lewkE8V$^l43Y^VT!j{RwPsf=MBCbeW|1ONf6!{$5Zgq~k0HwFEg)x) zcED?qVKhSB(c^G_z4ujs#oFTZxLaH{+(U^mEMR$T&9uph5fS6f>86#5Hr`T?+d_b* z6ykWIAs=#*;8b{8UDg_SsPLK_+zD7_s^nNK+Tba$1o~ak4zG$SG3F1ep+uGxbr1N! z>#)_4!(PE6D-gj|i2zt8_zjRj1GdvJH`X(}*wbu+*Mrrqp@09y@CF&x?IaRr_k)de z-;5f_Tn<)WDco1AOYALRW;M91G~COoHVm4yVW>SASu?WrcI=i1*N5GO&iQy zvn3X$$z!va?RZ2Zmsv=9u|h1 zrZ)IqjEZ8~MW#XqWPXEDY&C9dYij8gq*!q3^e*Xo+`ip`N9$lcrC)F@$Mt5qRSq{g z01u|YC6StNeHPabaGiyFx<))3b_1?Y;yR8t0r2S8mAJl%YaBex42W$Lu6N)X1W!8^ z4`f}0>tncvWAwzpOr4GEjkq4gH9AX@*23!Fgewk3NW-$>zQgt3fa^!N4$i>~g<*f! ztS3MLZ`|WNYd@N-i#{_BuM^7yjT|3lW^UM z>qEE>hlUO=1WsJtxW0_*wqi;88J+p82}iU>;|0*Al5`HP58*mI9B01DB#-$d%fKy=gZ5Ka6c9K9_w$K7S-SG`meM2mH6FbJ zosv$OLiId9(e_i(fkJ>4dO(hu0rnyZipPT@Ody^!6*)Uv$c(^M4HJ z*KR-m?J1K>a=$-3VRqc+VgBnKfv@lCJiP1HlP5iw^G)Kk&u)ADjz@R*fAP2H7B2qc z)t8Hw-My&x+J5~?mwYj0TIcq=@BYWjiKmude{!-=DJ=T2Hv(LTvLDW|-G<^K**QL@OUFRNsCFO??_tZcXT{t%?3hSmlw|w>l zQquh7cZ1hpsp*c7qwjSWy$T@>Jm=8*&b6bqk;nHT7owYk`Ku=cuJ<3FzG z+<2??_BSW)-ud9Kd;UOEx;M0`eaon|Xy|zeP$vls-ezmO<{PUgGiCx(kAb^N`af+5 z%RaE`y0(q)%(6TZHLrHZOWPm$S<2fsHs|?kU%%$Py`Ox%cGfE&j(F?JqCqFdYzrQA zp7rIp4G(;~GUk?Xx4yez{IfCk1J95A^o!-;FW&dJ;U5}ba4%dn<*kkD@7no+Vb9K) zZ%sZF^TE=GB2Sxh{`|$Czi~MFqj_J=oYvnzT_1eHkPS^kVGQ`|A@+ zo#W<>cznut6AC({?Zb!8o3$vv z_N?r=7hn0{nEb++5RcJ$K8ABTZPtDQ=dx- zEj!Cn*3po1{p6fgcO||3k4xLaGp7}PdFIA*udXT?AG&tJ#LCoMll96_&xR9|*R-E~ zl{P77_nI5T#{c(&mIPcpx-!0#B;#ZE!lOB3y*b7Iu?fqc;n=?~K*S!9C zT7&zBw@!O&+}7Bt+x*_SW@pBc0&C~}onP)B^ukA9xqqo{dgOzpZQu5*`wo$RUi#dM zm!BP1_DrKI;ha5w-z-c1CaCV2cLv3;4A?*J(t&gHa?(b;bJH#1-{r^tV`q5Q{_6)w zgX)&N7I>SjupoV1jN{|whNwNm_m`Yia(+dJbA&{XWe}Jm`AUvy>-LZ#}>c( z_^O|dM6dYi$cryN-7tN~>h$&>KRh%L~sNzyF))`ne~c|KPz7hVRZ?`NUV7f-k(Q zb3yTlpLVTGK5xSQxXUUkv1>F+npI_nY7 z*O#Xhh5b<J3A`#iT)JfG5j%6s)Ae!Ksw1I_O_`n~t}4ZoiE z*>ktmcZM8}x4$-f`6XWuz4g3br+(Rd&Kd7rx3+8LIZG>F8vWsA4R?h8uk0qrgV;-9N^1hRv@=y8tscW|+pJOT?|IF(lXM93uhkjG6t;yO$P6|MK&+O^bFeEPAyn_2#WNf4-~g!8@bVK673B zXv?5}1JcY5YfsGzjJf;idumDteKuj&3uQkzESt}HHvhogp$k9V*&6v&UTxmNftS5~ z=M`^%5}oqdHOpT8^o3vFj#(1$`YUNq-T3TBM^3!t;K@&3P#2bYN=Z!g-cd!n7bZ8p zx%ex;{-?h?u%PAj_1B!tl--m6YTY+AckT7;IOT$XtLt}c8`(5&V?@{GBg0Ocbzfad#C0=* zA4$3Xp?fbnar(jG^YY`zPQ1?V$_=Xq9tbw=%*vZ_;HjrZ+;_&B_flWJzx|V+_uTo$ z=0o=leC0yRmV)%Jw*0ni+TG~`X8m#F-=EC9bXUNKkKRA-vsVtCxBZv%T{mret}A)* zk1lCeNK@W~GsEKAf(jlkzrt_yjE{D&e|^K*r}%yK*cTHv#*YJnUVH7kw^$;hVy4d+w(jeklak(PJA21z_y4%$(wK_6q}%JZ7vJ?xfNQ~$ zn!``Dey}!RM9%G3IxgAiw|4ebtN-b)%2|8Qz8f}w_3{^W&%SPJ+J9)@gKyXNyT$a) zRL{{*kBpu+>W<&-Ki&I%L1xXAmoEH#^u4E)$KKt);k%}k9k=b~RlAJ%>{B&Vw8^-~5V zEts|7_a^E0iL)Cw8SmKfX8r6*FIPXdq~_a#otGaT@y@$DtRJm1?Kr<=^X#iC&L3@D z_T1l}-Z|l<1*!Qzd(M4ocU0Cnmp^g&kW)T!E?oJoOvzfI3tJ)-#SVLNITd>^|brz!EO#`XKJIJA3z z|N7;zr!9Udcll5D1G!J_8W{UXSlZ~*<_3McDyHfE-x`CLzgKtH-iIG_-Mr-chNzRC zTApRyx9Qa#o8MXcQB%NA{WjnB@!pCpi9rWno<4Eqff3;sE}iqnYV&LNY;}|``wH%= zjt4O4wT;)@kCbun52pJ}qO#k=yaA0Lz}=vd{!b;0Sa&$`e#>zk1c7Z*j9Op7d!ic7rQHF$dArfs{=tNeA%_VgPrsyY~P!_7G_ zJhFSi;nr2xes`tc%4Z`xYr{I;lE!Q)yQ1sfKhnpZ+Ymo#)G0?7=D6Qk9~5={bG!CW zx$^enz<-?d@Wao1s5aftKNc^I=*cNYHqA%JMJ_868TdMi-qNv6NJnn_ z?)8$|vaA|LpTX!e+4otDvWBg9WX4l*vL0(mzcZ2YB-TRmAMjbra<60GCDNWT0b!Y0 z@DpjX(T(%Pb0QMs5+bm5VsX;rHgh5tRTjjiM`X?IpE)_dG_Uf+vUvt<^kc)MY*B8p zG0zYY8y}z3(qgy9$LCk(8_J4}6_p0?h>xFViZDbpdOR&B#K*U_wZ&oo%x=X7K{I7^ z$CtUB*gEpG(=DV}6o{+y)J32gnY#c7)H<8RGq-zHo7tppb zewJXf%(eoHJF~sq>duU({3ynY>zBt)26pP=EV!SC$Dx!mp_$n8fCx0zo#w2S^Jd2L zwEm&JvcwIp<{X#H-0o$HZAUXfLO}&o4?O<7S;PdO?Q_!-5;Ei2FJjy)Bsv;mEx?T` z6%z8(W-rz`bHPRV$q>dX5HsTy+?fjP&$|M9U|3?arwf(J)Hdsu{&(mIoko$w6|p6X z68x)lMFsZipv(U`-Qd$8btFLkf4Ol`#Wzd;qYRQxqts6LYnmekv5)Hf`j%Ju1!dumL{5sLk zN*sX0Ux1_M%qp1g!-W5DE%-h(=`Ym_l{ROC`QKdZJ+wh1XPes@YyLmhc;B%lxZ62( zr?uifdL0qV@yO!8qv83lHIRBqW6ls$Tw7ne(tDD;E=f&F#h<+LeloP~85po!DQT(c zadpAdRkgsn)fqHS3%Mf z{*4p_k}|@z!Cu6_wH@!S`MovlFK^tv;1}Ug{(qu%?^6rA58MBSd7qV@tT$X!Q~%Ni zTwhM0{^wZmzBRGCE^rf`uGg!viMr(UB=~Wx9NT(S?0xDi(USkgCUHeTEiHBbxpumz z#%XNz|Mjxdcaq@?+?+BaHZ|yegxB%r3+04_xFmQOecOMhx1x08;9Dn~rD?{NcPBKw z)s=H^n+)BtDry&1YL!>c& z8(Gw#61)Al4lk(;1uH5{f86~@*O4wc(|(*_q|bgljR-3Nch z+8;+3+3!Zy)-`^4j7E`QX&p%d<%cjD-G>X7me56|QHEgLXVcQ?&Reh)LhRLiIN;fh zMz;)o%TgiVdg&CSZ@oC^30jJL?vdle{mO3n=tg9)bSh<6vCwJOVCg}2k5XwH4qifH zVmol?60~gAwrpO)V< zxVSrO=+Y@vhv8W0K^EE91Fsqf2YP!jP96bNtYr~j#0Ub)EJd>s4*(n%wqv4 zIZs-s#sUz#3^70de$cl-#E2igVQ#)u!E@0op0cFFyyifLk@Sml1|n}3y%Uzls4kMb zoYoI%TR0bbr<<1xUSE#bm1-Jsxmb;9xdcI~S<*J1){m7_@Dt`Nsa#E?ati8TmJ?7I zmSC3i5}q>{?VBrAsxhjejK}b(Gh&ykF~Ye>jZuA7YK*x2O^s=}gbG|j8I~nHXDGw6 zS&b2w#cE8;g)|~d+RD?Y*R!M()fi!^R%674?#Ywn`!ks-EgB$T8Nj%l%ySN4ST?CK z;&PH2(_$IOxLm>0=+1o>-Y6#5H;{2@QquyFMizsx;I*vad7+x7@Fb0+(U>DWhFmn> za;0q4u~&+eZpW~S@vD_);BopCyn(HN{h}-Vt3-a;qNO8$KcCT@p+m#pO7E6$wh!$w zoIN0Z^Z367z)dvbr_kne8u3$T^Ei$8X=!`W@@s)J6Ngdg-(0+{|1oAOvq4opFN6%0 zUSQTOn~~Vh9M(XZAhIFm2{<4j+h-8u50P;2feefvh9G_gHH3_o8e}uc^1wjQOSJ>? zdpn$aoQdSg|c79sr-F-Y1_xg&uOqzAj`DJMvkA;&_8}c4mVpO{WWil z>KtiM?_%}lv;L(I%;+?Vx*bcSI+%R!3@NKo=!bg0S*88C$|&97qdKbE>2lyO|I#L@hlc&t z#>DY+8osAZsE3Z9)6nd>=^K7N2D?ul!X0IG9FtVl12V_YY4qW!@&B;ckDt@1Bv9fdF zE9c&m*kC_?PU9~+(R)phR@r?gsUA(Z?tzTs=QQXsLt*pcFW&pd&uM5+Kj`@2ieJo! zOC@`XUV{W4&>ruNf}KH{w1V?nENwIqj{@4nyt{<>&?7P{Yfh z5R{`AgQbIX20%TYKsWOS``o;w48AnF_vcHaV+X!8x*Otk^0iYaG%qcHdKc;OoujHhc-foHd2Q+N{2RD zhZe3w8>2%Tt3w;7LmRI{o1jCRs6(6NL!+DU^eMn`CHa;--8C*?caP;Xf5f~8QUat3 z>2oz_AYxyrG5WJ}Um`}g?CB4QW#L~iyUkC-pi=ru%^8Z=*J`XkV&AB-0f_xmjSWN% zht$|0q|N7t1!#l}VMB~?(*5v7l1WYTN30aF$M9M!SP5{cKv_am$^TJ&5JN}DWy+8~mlv3FNd8|e5=k@O4CNk_bjSj}=;AYyo99K%6JaEkCdHJfA|09hB~U$E4P z908CurKM!!J9|ZTC_@;4d_@wya)H_rfTKbsc#G&Q*)s2eNTY*Ja%>Q!svxA}Jx1wQ zo<_%ej5zin=cMC3h4i*NR*p^@coEY1145C`5C#ee13ALDY~)z8j3W$W2ygdz|K zi*PVPi4j7)-H@jZLd?izNJoc?q~CZN9UUr?@P<5=GYANaB)lV*$FvCPh#Vo5Wk?5! zyfO^Zm0=J=NUupFgh31;UOmQRgpdxZ$Z3R7kzqd|G)ZwBFX@d*x`pSYLrSGmy&4O| zpDI*(xgYAld;d7XegZ;zg9*~so7(;}%qM@WaGittZv3muLslniQ2D?>Ue<&|NufDniOSlZldM9{+!0bz)MFhmz& zh=4FeKo}w*3=t60p)QjY&k@q0E|YXSM@WadO4X4P3WVNX4i$PiR6rQ2+smOsFNX@f z9Ljq64z*sb49Q9wrGXqFSu-P0$ucCHPzY2?Oxw$(>)u`_P4bSE{<<=xLuN(DCHHcF zL56hbtBCZH^>TkfhIAOsC=KEW=`flR)>6(%htUdQ#g&*A;Q#^Q00H3uU4#P!gaZVG z0~kWQS(72eyXiD~NC(}F6207q#uOcNGfLO6j5oCh{(rBq9i571NlZ`SKh6u75!empe z)}+-m@@kDz0!J9e5Z=jihB1V9sWC0WFacqhfRJ9G1caD1@U6}oVGQARl^f~T-D-?_ z?+!Jl)i3g~O;RF9NUvxzNq^@#hXP@#bdMU-TD+k^NR~#Pd4~!JhXNteeCD;GKwEifU@;JibKv*vQz;g}vupq*v9^xF5+7KA^_52uBJCM+yi>>LMH| zARH+m9LW$qsMe%KNGrf{DVHN0#d`01o^urIy(q-UCXNz%ZAc9AVcrUfp!E;QVK^n76?t!Lmc5)AS}h9a#{9cfzazyjs-%mg&iv( z9IHD5#sZ<&!j2V2z*sf{9#(78jsV)9FiJx?!f{N7OL@+5Oop^}CaoMN$Z(t>!*K$_ zak?@b$7HC?qvK>f35zsfyppZjnP=1s>ZY7lZMoxo%`O|40*hqRMqluqSo6B$Bpj1VTPXiq4B>P&MhM9glO9eI^l*}ZaFT#yNI<%=e zv}roD={hueiqaQfv<_{C4sE6mEk=hHt3!*^p~dUa5_D*ZI@wFL%Yq#4*qQ|5I88)>y_y;^HUqrr%=E|2%g3}LhyBU@ll zV_Iu9SwJ{hKsZ^~7EERc6|a9XL#TNDlNrJowI(e>8k(TM>vHcwDO!&7(!*wa*EK)Qv`%l1cXy` z5l#^hP7x4JVF(-4dbJ42ZW*PcJS~zTj8$XQ%W-Ngo=MTO+YwJKsZf6I87JfG=^}v%9}jkCN)Mrx?PQFdzoe! zqtwOIrZa>IYK(eW@r|Yn2&W4Orwa(D>-O?=hH$dVTkE4wXEIDw)3h?A`OYY1av4T3 zgsl zojV!t3?M9(oN7$#qt5_B?>c9OfN%y7cHc>w0sh`~&I};*?j+3s!ZPV`wI(e>@=VI5 z94CZ&X-hG;xsM)(uGZQtJOZ!!RTKyvb$0W_- zHODa7Ji&9uFxfn*#U@}VH`&&uJq#sgmD7GI00dtAVcz0jglWn7|#&S;t1mzLd7G97ZAn^ z2;&8W@wzgMX9$%wU_3*p%x3WnVTM|-R)*v^8zp~^Fo7XFf#*yRWSAfzOb`$z2nZ8& z5he%-69j|_4B>3GUM)iM;*HX1jxdoSbnu*s454C05(R{b0>VTAVWMs?Co+V}UPK}g zVo!|kMIT@ zt+$L)AV-+O5N7e5DGXt@8q*?75fG*b2vc+srZ9xz;6^*RDY6XtnTZsJFh{LPi;z}- zM!Y3Rp1)EVLO0KuDj-Z1dO1}mQKwehrchR_?+?l`3j2-5|G=>o!Z zU4-cZ!gK*)IzzZzMWIDVy9P#SJn!WUhOnLI%wRH9y!#9RVTOP(LqM3Ji!g&BROXZn zp_ell!WC-0T7)lYO9v67emMb{;8o$iAl)}VLG`LmK+WEh zS0|um@5!qZP_y^s)d_-r(N2j`n!szG&1BQTYo5(yvr>&|t;lRaHnRoU%+{67Y$h9J zu9z+K-fSkDRccLI+0ed?QJTmRW-^3l@SK^#2*?zAFH=C6DIm<$MVKk{UMA~3WnGcU z5Ux?{)gq)_B%>6>5zb)U{0!Z`xMIRe5t9HF>xJx4$|hapsamN^Vzo?5RK zA?;}yrAZtiy$;PNoyl{~We63oYOa8Au7Gf^fN-v^4CgY0%KDaG#pPY!(o3(3q_fm| zwFqg4%_#Nb2KGY7pUsZhPclO-U`5)fty2(xr$m?g+COORm}Ls+2Jt01I( z>y}ZpZ>{V=i`VWu)Y^1!D(zcmqovxtM55*B&~kNXc{;Rw9ojq{T7eF2z7B1H4hug0|VK#qVgM?jdPi;&*iRmA?tu3Rr!2*t|gFob8T zHE9vjcrZ!n9APdHnxvII*TwZTmF{M#N}ab zm(Rq}>lBNm*O7xffIRt3+%Ferll7E?VD;$i-o&;UZK`U zIImP=TAXCbj8X~5IgjDo#B+W8zCa$~d^J|U#?KhFCM`m;^+st5M>wA$+`x0rX9&+#V_JmtIzKPM`2xcE zx(Mg1I!OrU3pQxJV1wohz9`K+Mk#|MT)+@M!!a#j2=7v3giz5*dI@1qeZ7Dod=}*h z%K|=jk^J11wSS?4W_o^{M{k9s@_CL+nM(G5O zx{#rMf#)n_s10gNE8Rjtx)Isbf)RYg7YfoX6r@|oq^sN$EMz18MYRUP`42Uw#YsMd zQJTSV7BQULcutZ+AznZ!&tOHuh%e$e^(<2n!>L%NBEd4@yg#rgYqlbW^D4Cl!g;kC z)8Zt*#wg9^IExw1mw3)%hEvhjVgYBdAWzXU6$|n#7UWqh$g`N?+@;n>IA2y{TAbu- z8Ks#VX9>f34bNG^a4M_c5&>sPFY+uA&ulggy*aEY9(355KiR?%NW87 zc+N70@Na5NYw61bgk=K4GF^ma0>U!LutZWkr80)_LbWDBsO+vTWC*8mgbNwMi+Ik3 z4BckE23BSji9ubA*));e3v;Qb1TKAgmM+Rtg9!IYMz?gkE;+ zJ)2u8AgmM+(zA}VXFgzD+xMFPS_ z0>VWMVWC>D_Dp0ILx^|eGYzO>2;bp3s~Ey})tGjqRH+C_bE<&Q>p@guWuc8}eT^z+ zBNbnxilKfFHIN0Wl2LECf%z|04E6hJ?Ic&lLs|mr5cO5%wBj5hE#+;fL5sXAmKwCE zNUA~FUMWo)k7e+FKY8!uPCUPND?1-}t8_p6O>vpx-CemKYkb;4ITdvT_&g_W)}htv z&@4K%Ivtu-helSwx84RF8l89X&1ci0ou)%;)}hh;JYRlvSI?K$0%`lwPS>HibZBlJ znn#D$szY0*Lu=EaE!Uy7>(Ex{&^mNzD}89B{ilLf1kI7h(5X!0PUYHYW@(ByZDwg^ zo>t4!Ci8N&ENvf;Sy&p`M5@8U(rS6RI+mvFf!47!3s1AMv^q6L+Hd8tdX}bmqV=rY zC%lFRmR8SmHn6k?9&2Q2GkDHMme$DAY%EP#Hcqq4$Yg3UdVqxd)hP`8lil2U&zm1!M_A3=!n%4 z{PXksllSc_?2cdm#S)-C@kgL}JrLn2{^&tJex*NvaQyS1ErFw5===Vp1>%S4#al1G zwJmO3*rv-uq?s|lZcjj#w-G`SC>{Ibm={gaW5uacLcdKiewH=PO zBv~4rHjC9Q4dlraIg7Fy<`o|9=#vjrkEir`1yq=KR6-44%VzaoM zZfCv6FmJiVYByxeGQ=8^5)x7jDhxK}(hH2agOQ)*imM=aap^Ljf9ZE`{l9M-QE@TbM8>zO|EL?=JUE7uaU1+P7Hx*KH)BQ2Z4m2(djrM}`vzoo{o zNXv7t_>qmH53MxUfjQZ_GGkt47%3|KZK^fWQ2(xhQrA($sBskNLn-v3hrIf)@mqsG zdWJuHb_IqGyH}2joI|caDH(=AK(C>Jf`{Dn^qsiMABCHIoi8~%es!*tnyP>4*vG$} z9Y1yK^Ka|4guA!l7jpcJxO>~u!|rW|JNEgxx4E}{gR3RHshY0N4!|ivw%^^`P^=*X zELV5=ckC-HZ|lS_r2K@qdz;B^3CAyDi0|^v`0dx$+1B|DQmb|@J?!lGCn$_vh17J? z5obq0Tj%O7g<(TRLq_!;EyME7)q7NiVBzd&>pZMsYI0ZYbZ=9cW*%v(4s6Jy3+fYPy#z8OrZtrOrBSV;L=ffVseQ?&$ckcfNRr|kO+w4NHUmq`UIW~2B~T;1FL zU~GTKH*05L$3E&c66u#<*s;&qAzwT8?PYN)#0#6;C>+|cuOQJ9KIhQV!zOq6<~fIQ z!*avWHqhHT=Nu|XtlpCwR=sD=p{kuG_o3BYAszdo3#mkI7^M~@=7xQ@x@$nkzK(qv zugp1Q3D0g@QlE}RNvq+=cXpf~vblzo4}`Kz6EJew@=f001u2hqr1-PN&= zh71iUO@E-LWm;S35oTy8PNSB3od#Y*#`}tX+qj}NWOQRQv|}F)uIfDni6(bL23er$ zJ>{FrH(SEXH`B1H+S!ot+v=`hVoRo`uzcxZ8hA&`HwRL=rs{&k^39(pRarS^_cpRR zKA3_3s3kn4eDl)7WY35lvA2XDt=b8TY6(Y0Fqu@*AILZ75CNhpC_h;?wVIjG;9uDg zAyd@WNv5c+Q!zzH5NoRbfEgx8Vk%{38AzLvnSE=undB^`BFRVTVNfjL)q4mceUto@ zL8kV(ezEF3)HeCMYG=p3ZpC7|*9P(Y-qs00v~_mN-p8SKibiE%M9?ZlWk@xg9kNZf zg#W@)$TCATY+fQWfjCniC=@0FZv$vB^;>$lsaj<|j5Mzxv9O%ff~-;1 z&cbq&n5)JI8$SNc&8>tzUpuA+m3(F}^wwuc5hLvw_swUm<*hjX%YA5ld z$&-E`HM#rGIaI!xC`%7hJ*2+5VQrl>&(Sm^-K9!`R80%Et+T1RshYZGbr((OmT+eW z^(`qGO|F*kh75pBq>({!nkHoxTzZ&B2j!&BZK`g_pytZgh71`jm8UX9C4HfI)lN$| z0hcw&*+Fq<2L%;w!Y|#d@{i1|XzPSi!X{Y6(JP-Q(=5{nRjYfn(I@gQquNv{Kr3XE zPL%3BFc;7bXU7jZ{ZHCRqe9NrRL%547V){Nh)Ebe%rWayPdPhCFP0w84Wqs;NMybS z^niMm;&Q)|7Ld^BTMm?)?1bD+tGmeT&=g7~h!+_lrn)keb5yfK^45bwR*F=NRLBxe zY}z{E@G$3q6pR?kJ=Kt5au=3E#YRwW*&>qik-n_%lKGh2R7M%(9s3|58Hm06u*SSj z_C=nL0Sy+8R0WkEMPE_^h$CepB@m?{LyVJ7%1kJS+)wC~Bam+i|)5 zZ@RV(+z40i5q%=rPs8vJCO^GuCm9&`HkvpvU6Z$j?}iM@#f$`|+4_<3B(qGbQnGonhgZGFG0(Bq O-$%B6&i3zI|NjH}iKZa{ literal 0 HcmV?d00001 From 2083bb21b176b38e148b5c8f2eb46796bd0b1ee9 Mon Sep 17 00:00:00 2001 From: "Ruben C. Arslan" Date: Mon, 4 Nov 2013 19:08:44 +0100 Subject: [PATCH 8/8] dearyliewald first steps --- Model/DearyLiewald.php | 230 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 Model/DearyLiewald.php diff --git a/Model/DearyLiewald.php b/Model/DearyLiewald.php new file mode 100644 index 000000000..ca9cfe91b --- /dev/null +++ b/Model/DearyLiewald.php @@ -0,0 +1,230 @@ +dbh->prepare("SELECT id,name FROM `survey_dearyliewalds` WHERE id = :study_id LIMIT 1"); + $study_data->bindParam(":study_id",$unit['unit_id']); + $study_data->execute() or die(print_r($study_data->errorInfo(), true)); + $vars = $study_data->fetch(PDO::FETCH_ASSOC); + + if($vars): + $this->id = $vars['id']; + $this->name = $vars['name']; +# $this->logo_name = $vars['logo_name']; + $this->results_table = $this->name; + $this->getSettings(); + endif; + + $this->getNextItems(); + +# if(isset($_POST['session_id'])) +# { + $this->post($_POST); +# } + + if($this->getProgress()===1) + $this->end(); + } + protected function getSettings() + { + $study_settings = $this->dbh->prepare("SELECT `key`, `value` FROM `survey_settings` WHERE study_id = :study_id"); + $study_settings->bindParam(":study_id",$this->id); + $study_settings->execute() or die(print_r($study_settings->errorInfo(), true)); + while($setting = $study_settings->fetch(PDO::FETCH_ASSOC)) + $this->settings[$setting['key']] = $setting['value']; + + return $this->settings; + } + public function render() { + $ret = $this->render_form_header(). + $this->render_items(). + $this->render_form_footer(); + $this->dbh = NULL; + return $ret; + } + public function post($posted) { + + unset($posted['id']); // cant overwrite your session + unset($posted['session']); // cant overwrite your session + unset($posted['session_id']); // cant overwrite your session ID + unset($posted['study_id']); // cant overwrite your study ID + unset($posted['created']); // cant overwrite + unset($posted['modified']); // cant overwrite + unset($posted['ended']); // cant overwrite + + + $answered = $this->dbh->prepare("INSERT INTO `survey_items_display` (item_id, session_id, answered, answered_time, modified) + VALUES( :item_id, :session_id, 1, NOW(), NOW() ) + ON DUPLICATE KEY UPDATE answered = 1,answered_time = NOW()"); + + $answered->bindParam(":session_id", $this->session_id); + + $start_entry = $this->dbh->prepare("INSERT INTO `{$this->results_table}` (`session_id`, `study_id`, `created`, `modified`) + VALUES(:session_id, :study_id, NOW(), NOW()) + ON DUPLICATE KEY UPDATE modified = NOW();"); + $start_entry->bindParam(":session_id", $this->session_id); + $start_entry->bindParam(":study_id", $this->id); + $start_entry->execute() or die(print_r($start_entry->errorInfo(), true)); + + + foreach($posted AS $name => $value) + { + if (isset($this->unanswered_batch[$name])) { + $value = $this->unanswered_batch[$name]->validateInput($value); + if( ! $this->unanswered_batch[$name]->error ) + { + $this->dbh->beginTransaction() or die(print_r($answered->errorInfo(), true)); + $answered->bindParam(":item_id", $this->unanswered_batch[$name]->id); + $answered->execute() or die(print_r($answered->errorInfo(), true)); + + $post_form = $this->dbh->prepare("UPDATE `{$this->results_table}` + SET + `$name` = :$name + WHERE session_id = :session_id AND study_id = :study_id;"); + $post_form->bindParam(":$name", $value); + $post_form->bindParam(":session_id", $this->session_id); + $post_form->bindParam(":study_id", $this->id); + + try + { + $post_form->execute(); + $this->dbh->commit(); + } + catch(Exception $e) + { + pr($e); + pr($value); + } + unset($this->unanswered_batch[$name]); + } else { + $this->errors[$name] = $this->unanswered_batch[$name]->error; + } + } + } //endforeach + + if(empty($this->errors) AND !empty($posted)) + { // PRG + redirect_to(WEBROOT."{$this->run_name}"); + } else + { + $this->getProgress(); + } + + } + + public function end() + { + $post_form = $this->dbh->prepare("UPDATE + `{$this->results_table}` + SET `ended` = NOW() + WHERE `session_id` = :session_id AND + `study_id` = :study_id AND + `ended` IS NULL;"); + $post_form->bindParam(":session_id", $this->session_id); + $post_form->bindParam(":study_id", $this->id); + $post_form->execute() or die(print_r($post_form->errorInfo(), true)); + + return parent::end(); + } + public function exec() + { + if($this->called_by_cron) + return true; // never show to the cronjob + if($this->getProgress()===1) { + $this->end(); + return false; + } + + $action = WEBROOT."{$this->run_name}"; + + if(!isset($this->settings['form_classes'])) $this->settings['form_classes'] = ''; + $form = + + return array('title' => (isset($this->settings['title'])?$this->settings['title']: null), + 'body' => + '
    + + + +
    +
    '.implode("
    ",array_unique($this->errors)).' +
    + +
    +
    + '. + + (isset($this->settings['title'])?"

    {$this->settings['title']}

    ":'') . + (isset($this->settings['description'])?"

    {$this->settings['description']}

    ":'') . + ' +
    +
    +
    + + '. + (isset($this->settings['problem_email'])? + ' +
    + ':'') + ); + + } +} \ No newline at end of file