forked from science-ation/science-ation
349 lines
10 KiB
PHP
349 lines
10 KiB
PHP
<?php
|
|
require_once('common.inc.php');
|
|
require_once('form.inc.php');
|
|
require_once('user.inc.php');
|
|
require_once('incomplete.inc.php');
|
|
require_once('project.inc.php');
|
|
require_once('filter.inc.php');
|
|
require_once('fairs.inc.php');
|
|
require_once('remote.inc.php');
|
|
|
|
$mysqli = sfiab_init('committee');
|
|
|
|
$u = user_load($mysqli);
|
|
|
|
|
|
function get_last_sync($mysqli, $fair_id)
|
|
{
|
|
global $config;
|
|
$text = '';
|
|
$q = $mysqli->query("SELECT time,result FROM log WHERE `year`='{$config['year']}' AND `type`='sync_stats' AND fair_id='$fair_id' ORDER BY `time` DESC LIMIT 1");
|
|
if($q->num_rows != 1) {
|
|
$text = 'never';
|
|
} else {
|
|
$r = $q->fetch_assoc();
|
|
$text = date("F j, Y h:ia", strtotime($r['time'])).'<br/>';
|
|
if($r['result'] == 1) {
|
|
$text .= '<font color="green">OK</font>';
|
|
} else {
|
|
$text .= '<font color="red">failed</font>';
|
|
}
|
|
}
|
|
return $text;
|
|
}
|
|
|
|
|
|
$action = '';
|
|
if(array_key_exists('action', $_POST)) {
|
|
$action = $_POST['action'];
|
|
}
|
|
switch($action) {
|
|
|
|
case 'add':
|
|
$fair_id = fair_create($mysqli);
|
|
/* Print the id so the caller can jump to the edit page with the right id */
|
|
print("$fair_id");
|
|
exit();
|
|
|
|
case 'pass':
|
|
$id = (int)$_POST['id'];
|
|
$f = fair_load($mysqli, $id);
|
|
$f['password'] = base64_encode(mcrypt_create_iv(96, MCRYPT_DEV_URANDOM));
|
|
fair_save($mysqli, $f);
|
|
form_ajax_response(array('status'=>0, 'val' => array('password' => $f['password']))) ;
|
|
exit();
|
|
|
|
case 'check':
|
|
$id = (int)$_POST['id'];
|
|
$f = fair_load($mysqli, $id);
|
|
post_text($f['url'], 'url');
|
|
if($f['password'] === NULL) $f['password'] = '';
|
|
$ret = remote_ping($mysqli, $f);
|
|
if($ret['error'] == 0) {
|
|
$val = array();
|
|
if($f['name'] == '') {
|
|
$f['name'] = $ret['name'];
|
|
$val['name'] = $ret['name'];
|
|
}
|
|
if($f['abbrv'] == '') {
|
|
$f['abbrv'] = $ret['abbrv'];
|
|
$val['abbrv'] = $ret['abbrv'];
|
|
}
|
|
$f['password'] = $f['original']['password'];
|
|
fair_save($mysqli, $f);
|
|
form_ajax_response(array('status'=>0, 'happy'=>"Server Responded: {$ret['name']}. Use the \"Check Authentication\" button to verify the secret key works", 'val' => $val)) ;
|
|
exit();
|
|
}
|
|
form_ajax_response(array('status'=>1, 'error'=>"Server couldn't be contacted"));
|
|
exit();
|
|
|
|
case 'auth':
|
|
$id = (int)$_POST['id'];
|
|
$f = fair_load($mysqli, $id);
|
|
$ret = remote_auth_ping($mysqli, $f);
|
|
if($ret['error'] == 0) {
|
|
form_ajax_response(array('status'=>0, 'happy'=>"Server Responded: {$ret['name']}. Everything seems to be working")) ;
|
|
exit();
|
|
}
|
|
form_ajax_response(array('status'=>1, 'error'=>"Authentication failed. Make sure the remote fair is using the same secret key"));
|
|
exit();
|
|
|
|
|
|
|
|
case 'saveback':
|
|
case 'save':
|
|
$id = (int)$_POST['id'];
|
|
$f = fair_load($mysqli, $id);
|
|
|
|
post_text($f['name'], 'name');
|
|
post_text($f['abbrv'], 'abbrv');
|
|
post_text($f['type'], 'type');
|
|
post_text($f['url'], 'url');
|
|
post_text($f['website'], 'website');
|
|
post_text($f['password'], 'password');
|
|
if($f['type'] == 'ysc') {
|
|
post_text($f['username'], 'username');
|
|
} else {
|
|
$f['username'] = '';
|
|
}
|
|
fair_save($mysqli, $f);
|
|
|
|
$ret = array('status'=>0);
|
|
if($action == 'saveback') {
|
|
$ret['location'] = 'c_config_fairs.php';
|
|
}
|
|
form_ajax_response($ret);
|
|
exit();
|
|
|
|
case 'del':
|
|
/* Delete by id (not cid) and year just to be safe */
|
|
$id = (int)$_POST['id'];
|
|
$mysqli->real_query("DELETE FROM fairs WHERE `id`='$id'");
|
|
form_ajax_response(array('status'=>1, 'location' => 'c_config_fairs.php'));
|
|
exit();
|
|
|
|
case 'allstats':
|
|
remote_queue_get_stats_from_all_fairs($mysqli, $config['year']);
|
|
form_ajax_response(0);
|
|
exit();
|
|
|
|
case 'sync':
|
|
$id = (int)$_POST['id'];
|
|
$f = fair_load($mysqli, $id);
|
|
if($f['type'] == 'sfiab_upstream') {
|
|
/* Push our stats to upstream */
|
|
$response = remote_push_stats_to_fair($mysqli, $f, $config['year']);
|
|
} else if($f['type'] == 'old_sfiab2_feeder') {
|
|
/* Get stats from an old sfiab 2 */
|
|
$response = remote_get_stats_from_fair_old_sfiab2($mysqli, $f, $config['year']);
|
|
} else {
|
|
/* Get stats from upstream */
|
|
$response = remote_get_stats_from_fair($mysqli, $f, $config['year']);
|
|
}
|
|
|
|
$text = get_last_sync($mysqli, $id);
|
|
print($text);
|
|
exit();
|
|
}
|
|
|
|
if(array_key_exists('edit', $_GET)) {
|
|
$page = 'edit';
|
|
} else {
|
|
$page = '';
|
|
}
|
|
|
|
switch($page) {
|
|
case 'edit':
|
|
$id = (int)$_GET['edit'];
|
|
$page_id = 'c_config_edit_fair';
|
|
$help = '<p>';
|
|
sfiab_page_begin($u, "Edit Fairs", $page_id, $help);
|
|
|
|
?>
|
|
<div data-role="page" id="<?=$page_id?>" class="sfiab_page" >
|
|
|
|
<?php $fair = fair_load($mysqli, $id);
|
|
/* Couldn't find the fair */
|
|
if($fair === NULL) {
|
|
exit();
|
|
}
|
|
form_page_begin($page_id, array());
|
|
|
|
?>
|
|
<h3>Edit Fair: <?=$fair['name']?></h3>
|
|
<p>For creating a new fair: Enter the Server Address, then press "Check Server", that will verify the server and populate the Name and Abbreviation
|
|
<?php
|
|
$form_id = $page_id.'_form';
|
|
form_begin($form_id, 'c_config_fairs.php');
|
|
form_hidden($form_id,'id',$fair['id']);
|
|
form_text($form_id, 'url', "Server Address", $fair['url']);
|
|
form_button_with_label($form_id, 'check', '', 'Check Server');
|
|
form_text($form_id, 'name', "Name", $fair['name']);
|
|
form_text($form_id, 'abbrv', "Abbreviation", $fair['abbrv']);
|
|
form_select($form_id, 'type', "Type", $fair_types, $fair['type']);
|
|
form_text($form_id, 'website', "Website", $fair['website']);
|
|
form_text($form_id, 'password', "Secret Key", $fair['password']);
|
|
form_button_with_label($form_id, 'pass', '', 'Generate Random Secret Key');
|
|
form_text($form_id, 'username', "YSC Username (only for YSC upstream fairs)", $fair['username']);
|
|
form_submit($form_id, 'save', 'Save', 'Information Saved');
|
|
form_submit($form_id, 'saveback', 'Save and Go Back', 'Information Saved', 'g', 'back');
|
|
?> <a href="c_config_fairs.php" data-ajax="false" data-role="button" data-icon="back" data-theme="r" data-inline="true">Cancel, Go Back</a>
|
|
<?php form_end($form_id);
|
|
?>
|
|
<hr/>
|
|
<h3>Check Authentication</h3>
|
|
<p>Use this button to check that your secret key is working after you have saved all the information above</p>
|
|
<?php
|
|
$form_id = $page_id.'_auth_form';
|
|
form_begin($form_id, 'c_config_fairs.php');
|
|
form_hidden($form_id,'id',$fair['id']);
|
|
form_button($form_id, 'auth', 'Check Authentication');
|
|
form_end($form_id);
|
|
|
|
?>
|
|
<hr/>
|
|
<h3>How To Connect two SFIABs</h3>
|
|
<p>On the Feeder Fair:
|
|
<ul><li>Create a fair entry for the Upstream fair, select the type as 'Upstream'
|
|
<li>Enter the server address (usually the website of the registration system)
|
|
<li>Enter or generate a secret key. Both the Upstream and Feeder fair must have the SAME secret key, so generate it on one, and enter it on the other
|
|
</ul>
|
|
On the Upstream Fair:
|
|
<ul><li>Create a fair entry for the Feeder fair, select the type as 'Feeder'
|
|
<li>Enter the server address (usually the website of the registration system)
|
|
<li>Enter or generate a secret key. Both the Upstream and Feeder fair must have the SAME secret key, so generate it on one, and enter it on the other
|
|
</ul>
|
|
|
|
<hr/>
|
|
<h3>Delete Fair</h3>
|
|
<?php
|
|
$form_id = $page_id.'_del_form';
|
|
form_begin($form_id, 'c_config_fairs.php');
|
|
form_hidden($form_id,'id',$fair['id']);
|
|
form_submit_enabled($form_id, 'del', 'Delete This Fair', 'Deleted', 'r', 'delete', 'Really Delete this fair?');
|
|
form_end($form_id);
|
|
|
|
break;
|
|
|
|
default:
|
|
$page_id = 'c_config_fairs';
|
|
$help = '<p>';
|
|
|
|
sfiab_page_begin($u, "Edit Fairs", $page_id, $help);
|
|
?>
|
|
<div data-role="page" id="<?=$page_id?>" class="sfiab_page" >
|
|
|
|
<?php $fairs = fair_load_all($mysqli); ?>
|
|
|
|
<h3>Feeder/Upstream Fairs</h3>
|
|
<p>Fair Types:
|
|
<ul><li><b>Feeder Fairs</b> are fairs that provide this fair with students. This fair may export awards to feeder fairs, retrieve winners for those awards, and download fair statistics.
|
|
<li><b>Upstream Fairs</b> are fairs that this fair can send students to. This fair can upload winners (of awards downloaded from the upstream fair) to the upstream fair, and can upload fair statistics.
|
|
<li><b>Youth Science Canada</b> is a special type of upstream fair that uses a different communication protocol. Winners uploaded to this fair are registered for the CWSF.
|
|
</ul>
|
|
|
|
<table id="config_fairs" data-role="table" data-mode="none" class="table_stripes">
|
|
<thead>
|
|
<tr>
|
|
<th align="center" width=20%>Fair name</th>
|
|
<th align="center" width=10%>Type</th>
|
|
<th align="center" width=10%>Last Stats Sync</th>
|
|
<th align="center" width=5%></th>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$current_type = '';
|
|
foreach($fairs as $fid=>&$f) {
|
|
|
|
$sync_text = get_last_sync($mysqli, $fid);
|
|
|
|
|
|
switch($f['type']) {
|
|
case 'sfiab_feeder':
|
|
case 'sfiab_upstream':
|
|
case 'old_sfiab2_feeder':
|
|
$sync_link = "href=\"#\" onclick=\"fair_sync_stats({$f['id']})\"";
|
|
break;
|
|
case 'ysc':
|
|
$sync_link = "href=\"c_ysc_stats.php\"";
|
|
break;
|
|
}
|
|
|
|
?>
|
|
|
|
<tr id="<?=$s['id']?>" >
|
|
<td align="center"><?=$f['name']?></td>
|
|
<td align="center"><?=$fair_types[$f['type']]?></td>
|
|
<td align="center"><span id="fair_sync_result_<?=$f['id']?>"><?=$sync_text?></span></td>
|
|
<td align="left">
|
|
<div data-role="controlgroup" data-type="horizontal" data-mini="true">
|
|
<a <?=$sync_link?> data-role="button" data-icon="recycle" data-iconpos="notext" >Sync</a>
|
|
<a href="c_config_fairs.php?edit=<?=$f['id']?>" data-role="button" data-iconpos="notext" data-icon="gear" data-ajax="false">Edit</a>
|
|
</div>
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<?php } ?>
|
|
</tbody>
|
|
</table>
|
|
<a href="#" onclick="return fair_create();" data-role="button" data-icon="plus" data-inline="true" data-ajax="false" data-theme="g">New Fair</a>
|
|
|
|
<hr/>
|
|
<h3>Statistics Synchronization</h3>
|
|
SFIAB does three types of synchronization. The last two (awards and winners) are automatic.
|
|
|
|
<ul><li>Fair statistics (like student counts) from feeder fairs to upstream fairs
|
|
<li>External Awards from upstream fairs to feeder fairs
|
|
<li>Winners for External Awards from feeder fairs back to upstream fairs
|
|
</ul>
|
|
|
|
Before generating reports with statistics from feeder fairs, they
|
|
should all be synchronized. It may take a minute or two for all feeder
|
|
fairs to respond.
|
|
|
|
<?php
|
|
$form_id = $page_id.'_form';
|
|
form_begin($form_id, 'c_config_fairs.php');
|
|
form_button($form_id, 'allstats', 'Synchronize All Statistics' );
|
|
form_end($form_id);
|
|
?>
|
|
|
|
|
|
<?php
|
|
break;
|
|
}
|
|
|
|
/* Everything here is common to all pages */
|
|
?>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
|
|
function fair_create() {
|
|
$.post('c_config_fairs.php', { action: "add" }, function(data) {
|
|
window.location = "c_config_fairs.php?edit="+data;
|
|
});
|
|
return false;
|
|
}
|
|
|
|
function fair_sync_stats(id) {
|
|
$("#fair_sync_result_"+id).html("");
|
|
$.post('c_config_fairs.php', { action: "sync", id: id }, function(data) {
|
|
$("#fair_sync_result_"+id).html(data);
|
|
|
|
|
|
});
|
|
return false;
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<?php
|
|
sfiab_page_end();
|
|
?>
|