tidy up and variety validation work

This commit is contained in:
Nathan Coad
2018-05-03 08:09:29 +10:00
parent 145e914f5e
commit 8b133cf160
7 changed files with 1008 additions and 845 deletions

View File

@@ -93,7 +93,7 @@ function booking_update_7201() {
* Add table for variety sessions
*/
function booking_update_7202() {
$booking_variety_options = array(
$booking_variety_sessions = array(
'fields' => array(
'vid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_eventid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
@@ -105,7 +105,7 @@ function booking_update_7202() {
),
'primary key' => array('vid'),
);
$booking_variety_times = array(
$booking_variety_timeslots = array(
'fields' => array(
'tid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_eventid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
@@ -127,8 +127,8 @@ function booking_update_7202() {
);
db_create_table('booking_variety_options', $booking_variety_options);
db_create_table('booking_variety_times', $booking_variety_times);
db_create_table('booking_variety_sessions', $booking_variety_sessions);
db_create_table('booking_variety_timeslots', $booking_variety_timeslots);
db_create_table('booking_variety_regn', $booking_variety_regn);
//TODO: create tables for variety session timeslots and variety session registrations (map user to variety session id)
@@ -781,6 +781,17 @@ function booking_update_7253() {
_booking_node_create_mysqlview();
}
/**
* Change booking_variety_regn field type and rename some tables
*/
function booking_update_7254() {
$spec = array('type' => 'varchar', 'length' => '1000', 'not null' => FALSE);
db_change_field('booking_variety_regn', 'booking_variety_id', 'booking_variety_ids', $spec);
db_rename_table('booking_variety_times', 'booking_variety_timeslots');
db_rename_table('booking_variety_options', 'booking_variety_sessions');
}
/**
* Implementation of hook_install().
*/
@@ -1047,7 +1058,7 @@ function booking_schema() {
'primary key' => array('payid'),
);
$schema['booking_variety_options'] = array(
$schema['booking_variety_sessions'] = array(
'fields' => array(
'vid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_eventid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
@@ -1060,7 +1071,7 @@ function booking_schema() {
'primary key' => array('vid'),
);
$schema['booking_variety_times'] = array(
$schema['booking_variety_timeslots'] = array(
'fields' => array(
'tid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_eventid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
@@ -1075,7 +1086,7 @@ function booking_schema() {
$schema['booking_variety_regn'] = array(
'fields' => array(
'rid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_variety_id' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
'booking_variety_ids' => array('type' => 'varchar', 'length' => '1000', 'not null' => TRUE),
'booking_node_id' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'disp-width' => '10'),
),
'primary key' => array('rid'),

View File

@@ -408,7 +408,7 @@ function booking_menu() {
'type' => MENU_LOCAL_ACTION,
);
$items['admin/config/booking/variety/%/edit'] = array(
$items['admin/config/booking/variety/%/edit'] = array(
'title' => 'Edit Variety Session Timeslot',
'page callback' => 'drupal_get_form',
'page arguments' => array('booking_variety_timeslot_form', false, 4),
@@ -416,6 +416,14 @@ function booking_menu() {
'type' => MENU_CALLBACK,
);
$items['admin/config/booking/variety/%/csv'] = array(
'title' => 'Variety Session CSV',
'description' => 'CSV Report of Variety Session Timeslot',
'page callback' => 'booking_varietysessions_csv_report',
'page arguments' => array(4),
//'type' => MENU_CALLBACK,
);
$items['admin/config/booking/variety/%/session/list'] = array(
'title' => 'List Variety Sessions',
'description' => 'List variety sessions for the specified timeslot',

View File

@@ -71,7 +71,7 @@ function _booking_node_create_mysqlview()
$query->leftJoin('booking_studygroup_mapping', 's' . $id, 'p.nid = s' . $id . '.booking_node_id and s' . $id . '.booking_studygroup_id = ' . $id);
}
}
//filter the results either by current active event
// @todo is this filter really necessary?
$query->condition('p.booking_eventid', $event->eid, '=');

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,7 @@ function booking_variety_admin()
'variety_session_add' => t('Add Session'),
);
$result = db_query("SELECT * from {booking_variety_times}");
$result = db_query("SELECT * from {booking_variety_timeslots}");
foreach($result as $data)
{
@@ -83,7 +83,7 @@ function booking_variety_timeslot_form($node, &$form_state, $create, $editid = 0
return "";
}
$data = db_select ('booking_variety_times', 'v')
$data = db_select ('booking_variety_timeslots', 'v')
->condition('v.tid', $editid, '=')
->fields('v')
->execute()
@@ -165,7 +165,7 @@ function booking_variety_timeslot_form_submit($form, &$form_state) {
if ($form_state['values']['op'] == 'Create')
{
db_insert('booking_variety_times')
db_insert('booking_variety_timeslots')
->fields(array(
'booking_eventid' => $event->eid,
'booking_variety_status' => $values['booking_variety_status'] == 1 ? 1 : 0,
@@ -183,7 +183,7 @@ function booking_variety_timeslot_form_submit($form, &$form_state) {
return "";
}
$num_deleted = db_delete('booking_variety_times')
$num_deleted = db_delete('booking_variety_timeslots')
->condition('tid', $values['tid'])
->execute();
@@ -200,7 +200,7 @@ function booking_variety_timeslot_form_submit($form, &$form_state) {
}
//update the event
db_update('booking_variety_times')
db_update('booking_variety_timeslots')
->fields(array (
'booking_eventid' => $event->eid,
'booking_variety_time_descrip' => $values['booking_variety_time_descrip'],
@@ -230,7 +230,7 @@ function booking_variety_create_session_form($node, &$form_state, $timeslot_id =
}
/*
$data = db_select ('booking_variety_times', 'v')
$data = db_select ('booking_variety_timeslots', 'v')
->condition('v.tid', $editid, '=')
->fields('v')
->execute()
@@ -286,7 +286,7 @@ function booking_variety_create_session_form_submit($form, &$form_state) {
global $event;
$values = $form_state['input'];
db_insert('booking_variety_options')
db_insert('booking_variety_sessions')
->fields(array(
'booking_eventid' => $event->eid,
'booking_variety_timeslot_id' => $values['tid'],
@@ -317,8 +317,8 @@ function booking_variety_list_session_form($node, &$form_state, $timeslot_id = 0
$prefix = t("<p>!link</p>",
array ('!link' => l('Add New Variety Session', "admin/config/booking/variety/$timeslot_id/session/create")));
$query = db_select ('booking_variety_options', 'v');
$query->join('booking_variety_times', 't', 'v.booking_variety_timeslot_id = t.tid');
$query = db_select ('booking_variety_sessions', 'v');
$query->join('booking_variety_timeslots', 't', 'v.booking_variety_timeslot_id = t.tid');
$query->condition('v.booking_variety_timeslot_id', $timeslot_id, '=')
->fields('v')
->fields('t', array('booking_variety_time_descrip'));
@@ -368,3 +368,121 @@ function booking_variety_edit_session_form()
{
}
/**
* Function to generate a CSV file listing the session membership for the specified variety session timeslot
*/
function booking_varietysessions_csv_report($timeslot_id) {
global $event;
$data = array();
//verify that $group_id is a number
if (! preg_match('/^[0-9]+$/', $timeslot_id)) {
drupal_set_message("Error: Invalid variety session timeslot ID '" . $group_id . "' supplied.", 'error', FALSE);
drupal_goto('admin/booking/studygroups');
return "";
}
// TODO - UPDATE FROM HERE ON!
//retrieve the name of the study group for the specified ID
$group = db_query("SELECT * FROM {booking_studygroup_list} WHERE booking_eventid = :eid and sid = :sid",
array(':eid' => $event->eid, ':sid' => $group_id))
->fetchObject();
if (! $group)
{
drupal_set_message("Error: Could not find matching study group ID. Unable to view group membership.", 'error', FALSE);
drupal_goto('admin/booking/studygroups');
return "";
}
//set options for the CSV file
$name = 'bookings-studygroup-' . $group->booking_studygroup_descrip . '-' . format_date(time(), 'custom', 'Y-m-d-His');
$filename = file_directory_temp() . '/' . $name;
$csv = '';
$delimiter = ',';
$enclosure = '"';
$encloseAll = true;
$nullToMysqlNull = true;
$delimiter_esc = preg_quote($delimiter, '/');
$enclosure_esc = preg_quote($enclosure, '/');
//get the list of study group session memberships
$session_members_query = db_query("SELECT m.*, p.* FROM {booking_studygroup_mapping} m
inner join {booking_person} p on p.nid = m.booking_node_id
WHERE m.booking_studygroup_id = :sid ORDER BY m.booking_session_id, m.booking_studygroup_role DESC, p.booking_lastname",
array(':sid' => $group_id));
$session_members = $session_members_query->fetchAll();
//generate the row data
foreach ($session_members as $member) {
if (! isset($data[$member->booking_session_id])) {
$data[$member->booking_session_id] = array();
}
// lookup the name and role for this entry in the study group session and optionally include age
if (variable_get('booking_studygroup_csv_ages', 0) == 1) {
$text = array($member->booking_firstname, $member->booking_lastname, '[' . _booking_get_age_years($member->booking_dob) .']');
}
else {
$text = array($member->booking_firstname, $member->booking_lastname);
}
//add their role if they're leading/helping etc
if ($member->booking_studygroup_role > 0) {
array_push($text, '(' . _booking_studygroup_role_lookup($member->booking_studygroup_role) . ')');
}
//also tag committee members
if ($member->booking_committee_member == 'Y') {
array_push($text, '(committee)');
}
//add the spaces and put this element in the right array
$data[$member->booking_session_id][] = implode(' ', $text);
}
//watchdog('booking_debug', "<pre>Study Group CSV Report\n@info</pre>", array('@info' => print_r( $data_array, true)));
//calculate the CSV layout
$header_array = array_keys($data);
$maximums = array();
$column_headings = array();
foreach ($header_array as $column) {
$maximums[] = count($data[$column]);
//make the column headings a bit more user friendly
if ($group->booking_is_readinggroup == 'Y') {
$column_headings[] = _booking_readinggroup_colour_lookup($column);
}
else {
$column_headings[] = "Session " . $column;
}
}
//add the column headings to the CSV
$header = implode( $delimiter, $column_headings );
$csv .= $header . "\n";
//generate each row for the CSV
for ($i = 0; $i < max($maximums); $i++) {
$output = array();
foreach ($header_array as $column) {
$field = isset($data[$column][$i]) ? $data[$column][$i] : '';
//enclose $field if necessary
if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
$output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure;
}
else {
$output[] = $field;
}
} //loop through columns
$row = implode($delimiter, $output) . "\n";
$csv .= $row;
}
//output the CSV to the browser
drupal_add_http_header("Content-type", "application/octet-stream; charset=utf-8");
drupal_add_http_header("Content-Disposition", "attachment; filename=" . $name . ".csv");
print $csv;
exit(0);
}

View File

@@ -14,14 +14,14 @@ function booking_variety_regn_form($node, &$form_state)
$data = $node;
// Query the variety timeslot table
$timeslot_query = db_select('booking_variety_times', 'v');
$timeslot_query = db_select('booking_variety_timeslots', 'v');
$timeslot_query->condition('v.booking_eventid', $event->eid, '=')
->fields('v')
->orderBy('v.booking_variety_start');
$result = $timeslot_query->execute();
$form['#prefix'] = '<div id="booking_variety_session_form_wrapper">';
$form['#suffix'] = '</div>';
//$form['#prefix'] = '<div id="booking_variety_session_form_wrapper">';
//$form['#suffix'] = '</div>';
$form['identity'] = array(
'#type' => 'fieldset',
@@ -93,13 +93,14 @@ function _booking_get_variety_timeslot_options($timeslot_id) {
$session_options = array();
$session_options[] = "--";
$session_query = db_query("SELECT * FROM {booking_variety_options} WHERE booking_variety_timeslot_id = :tid AND booking_variety_status = 1",
$session_query = db_query("SELECT * FROM {booking_variety_sessions} WHERE booking_variety_timeslot_id = :tid AND booking_variety_status = 1",
array(':tid' => $timeslot_id));
// Only add sessions that aren't full to the return result
foreach($session_query as $session) {
if ($session->booking_variety_regncount < $session->booking_variety_maxsize) {
$session_options[$session->vid] = $session->booking_variety_descrip;
$available_spots = $session->booking_variety_maxsize - $session->booking_variety_regncount;
if ($available_spots > 0) {
$session_options[$session->vid] = $session->booking_variety_descrip . " [" . $available_spots . " spots]";
}
}
//watchdog('booking_debug', "<pre>Variety Session Options:\n@info</pre>", array('@info' => print_r( $session_options, true)));
@@ -124,8 +125,6 @@ function booking_variety_regn_form_validate($form, &$form_state) {
$values = $form_state['input'];
//watchdog('booking_debug', 'booking_variety_regn_form_submit: <pre>@info</pre>', array('@info' => print_r( $form_state, true)));
//TODO : Check that the booking number is valid for this event
//verify that user-entered data is a number
if (! preg_match('/^[0-9]+$/', $values['booking_nid'])) {
form_set_error('booking_nid', t('You have entered an invalid booking reference number.'));
@@ -146,6 +145,29 @@ function booking_variety_regn_form_validate($form, &$form_state) {
if (! $person) {
form_set_error('booking_nid', t('You have entered an invalid booking reference number.'));
}
// --- Check there is still space available in the selected variety sessions ---
//get a list of timeslot IDs from matching form values
$variety_timeslot_ids = preg_filter('/^select-variety-(\d+)/', '$1', array_keys( $values ));
//query the sessions table
$sessions_query = db_query("SELECT * FROM {booking_variety_sessions} WHERE booking_eventid = :eid",
array(':eid' => $event->eid));
$sessions = $sessions_query->fetchAllAssoc('vid');
watchdog('booking_debug', 'booking_variety_regn_form_validate sessions query: <pre>@info</pre>', array('@info' => print_r( $sessions, true)));
//check there is still room
foreach ($variety_timeslot_ids as $id) {
$selected_session_id = $values['select-variety-' . $id];
if ($sessions[$selected_session_id]->booking_variety_regncount < $sessions[$selected_session_id]->booking_variety_maxsize) {
watchdog('booking_debug', 'Still room in session ' . $selected_session_id);
}
}
}
/**
@@ -155,4 +177,7 @@ function booking_variety_regn_form_submit($form, &$form_state) {
global $event;
$values = $form_state['input'];
watchdog('booking_debug', 'booking_variety_regn_form_submit: <pre>@info</pre>', array('@info' => print_r( $form_state, true)));
//use an update query for the regncount field
//based on update booking_variety_sessions set booking_variety_regncount = booking_variety_regncount+1 where vid = 1;
}

View File

@@ -48,7 +48,7 @@ function booking_variety_session_callback($form, &$form_state) {
// --- Update the wrapper for available variety sessions ---
// Query the variety timeslot table
$timeslot_query = db_select('booking_variety_times', 'v');
$timeslot_query = db_select('booking_variety_timeslots', 'v');
$timeslot_query->condition('v.booking_eventid', $event->eid, '=')
->fields('v')
->orderBy('v.booking_variety_start');
@@ -81,7 +81,7 @@ function booking_variety_session_callback($form, &$form_state) {
//$form['variety-sessions'][$fieldname]['#title'] = t('Rebuilt Variety Session: ' . $timeslot->booking_variety_time_descrip);
// Tell drupal to update the wrapper for this field
$commands[] = ajax_command_replace('#booking_variety_session_' . $timeslot->tid . '_wrapper', drupal_render($form['variety-sessions'][$fieldname]));
$commands[] = ajax_command_replace('#booking_variety_session_' . $timeslot->tid . '_wrapper', drupal_render($form['form']['variety-sessions'][$fieldname]));
//$commands[] = ajax_command_replace('#booking_variety_session_' . $timeslot->tid . '_wrapper', drupal_render($form));
}