Added confirmation to study group auto updates

This commit is contained in:
2014-06-26 23:41:58 +10:00
parent a61520b72d
commit b51f6a60d1
4 changed files with 206 additions and 147 deletions

View File

@@ -115,7 +115,7 @@ function booking_available_leadhelp_select_form($node, &$form_state, $group_id)
//also restrict to males from the current event
$db_and = db_and();
$db_and->condition('p.booking_event_id', $event->eid, '=');
//$db_and->condition('p.booking_gender', 'M', '=');
$db_and->condition('p.booking_gender', 'M', '=');
$db_and->condition($db_or);
$query->condition($db_and);
@@ -134,18 +134,26 @@ function booking_available_leadhelp_select_form($node, &$form_state, $group_id)
foreach ($group_mapping as $group)
{
$role = $group->booking_studygroup_role;
/*
//add to the listing of all the roles this person is doing
if ($group->booking_node_id == $data->nid && $role > 0)
{
$text = _booking_studygroup_role_lookup($role);
$role_listing .= $text . " group " . $group->booking_studygroup_id . " #" . $group->booking_session_id . "; ";
}
*/
//also record if they are doing anything for our current group
if ($group->booking_node_id == $data->nid && $group->booking_studygroup_id == $group_id)
{
$assigned_role = $role;
$session_id = $group->booking_session_id;
//list any role for this current group
if ($role > 0)
{
$text = _booking_studygroup_role_lookup($role);
$role_listing .= "<b>" . $text . "</b> group " . $group->booking_studygroup_id . " #" . $group->booking_session_id . "; ";
}
}
}
@@ -963,7 +971,7 @@ function booking_studygroups_calculate() {
/**
* Function for calculating who belongs to which study group
*/
function booking_studygroups_update($node, &$form_state, $sid) {
function booking_studygroups_update_form($node, &$form_state, $sid) {
global $event;
//master attendee list
@@ -980,6 +988,10 @@ function booking_studygroups_update($node, &$form_state, $sid) {
$intro_text = "";
$reading_group_id = variable_get('booking_readinggroup_id','7');
//store our calculated updates in this array which will then get serialized and added to the form for processing
$updates_to_confirm = array();
$inserts_to_confirm = array();
//verify that $nid is a number
if (! preg_match('/^[0-9]+$/', $sid)) {
drupal_set_message("Error: Invalid group ID '" . $sid . "' supplied. Unable to update study group session.", 'error', FALSE);
@@ -1012,6 +1024,7 @@ function booking_studygroups_update($node, &$form_state, $sid) {
array(':eid' => $event->eid));
$attendees = $query->fetchAllAssoc('nid');
//TODO: Move statistics generation to separate function
//calculate the ratios of males to females, and various age groups
$statistics = _booking_generate_statistics($attendees);
$gender_ratio = ($statistics['males'] / $statistics['females']) * ($max_people / 2);
@@ -1259,11 +1272,9 @@ function booking_studygroups_update($node, &$form_state, $sid) {
$age_type = 'over25';
//make sure this person is going to fit in with our calculated gender ratios
_booking_loop_carefully($session_count, $gender, $start, $maximums[$gender], $group->booking_num_group_sessions, 3, $calculation_messages);
_booking_loop_carefully($session_count, $gender, $start, $maximums[$gender], $group->booking_num_group_sessions, 3, $calculation_messages);
//make sure this person is going to fit in with our calculated age ratios
_booking_loop_carefully($session_count, $age_type, $start, $maximums[$age_type], $group->booking_num_group_sessions, 3, $calculation_messages);
//check for maximum group size
_booking_loop_carefully($session_count, 'total', $start, $max_people, $group->booking_num_group_sessions, 4, $calculation_messages);
@@ -1286,12 +1297,8 @@ function booking_studygroups_update($node, &$form_state, $sid) {
$i++;
} //finished looping through attendees for this study group
//iterate over the attendee list and write to the database the session they're assigned to
//use the multi-insert query type at https://drupal.org/node/310079
$insert_query = db_insert('booking_studygroup_mapping')->fields(array('booking_eventid', 'booking_node_id',
'booking_studygroup_id', 'booking_session_id', 'booking_studygroup_role'));
//now calculate the updates for the database
foreach($working_list as $person)
{
//watchdog('booking', "<pre>Working list role person:\n@info</pre>", array('@info' => print_r( $person, true)));
@@ -1300,6 +1307,8 @@ function booking_studygroups_update($node, &$form_state, $sid) {
// if already in $group_mapping then just run an update query here
$found = FALSE;
$message = "";
foreach ($group_mapping as $mapping)
{
//check if we can find a study group session already for this user and this study group (eg Monday Tuesday or Wednesday)
@@ -1313,9 +1322,13 @@ function booking_studygroups_update($node, &$form_state, $sid) {
$message = t('Found existing study group session for user !id (!name). Changing old session !old to !session. Role id is !role',
array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session,
'!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname));
$update_messages[] = $message;
//drupal_set_message($message, 'status', FALSE);
watchdog('booking', $message);
$update = array(
'booking_session_id' => $person->session,
'booking_studygroup_role' => $person->booking_studygroup_role,
);
$updates_to_confirm[] = array('sid' => $mapping->sid, 'fields' => $update);
//update the entry
/*
@@ -1325,63 +1338,56 @@ function booking_studygroups_update($node, &$form_state, $sid) {
'booking_studygroup_role' => $person->booking_studygroup_role,
))
->condition('sid', $mapping->sid)
->execute();
*/
->execute();
*/
}
elseif ($mapping->booking_session_id !== $person->session && $group->sid == $reading_group_id)
{
$message = t('Found existing reading group session for user !id (!name). Changing old session !old to !session. Role id is !role',
array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session,
'!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname));
$update_messages[] = $message;
//drupal_set_message($message, 'status', FALSE);
watchdog('booking', $message);
//update the entry
/*
db_update('booking_studygroup_mapping')
->fields(array(
$update = array(
'booking_session_id' => $person->session,
'booking_studygroup_role' => $person->booking_studygroup_role,
))
->condition('sid', $mapping->sid)
->execute();
*/
);
$updates_to_confirm[] = array('sid' => $mapping->sid, 'fields' => $update);
}
else
{
//drupal_set_message(t('Found existing study group session for user !id, but old session !old matches new value !session.',
// array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session)));
}
//stop looping through the list
break;
}
}
} //end checking for existing group session
} //end looping through study group mappings
//if we didn't find an existing record, add it to the list to insert
if (! $found && $person->session <> 0)
{
$message = t('Found no existing study group session for user id !id (!name). Adding to list of inserts.',
$message = t('Found no existing study group session for user id !id (!name). Adding to list of inserts for session !session.',
array('!id' => $person->nid, '!sid' => $mapping->sid, '!session' => $person->session,
'!name' => $person->booking_firstname . " " . $person->booking_lastname
));
//drupal_set_message($message, 'status', FALSE);
$update_messages[] = $message;
watchdog('booking', $message);
$record = array(
$inserts_to_confirm[] = array(
'booking_eventid' => $event->eid,
'booking_node_id' => $person->nid,
'booking_studygroup_id' => $group->sid,
'booking_session_id' => $person->session,
'booking_studygroup_role' => $person->booking_studygroup_role,
);
$insert_query->values($record);
);
}
}
//$insert_query->execute();
//log any update we made
if ($message !== "")
{
$update_messages[] = $message;
//watchdog('booking', $message);
}
} //end loop through working copy of attendee list
//watchdog('booking', "<pre>Session statistics list:\n@info</pre>", array('@info' => print_r( $session_count, true)));
@@ -1389,7 +1395,9 @@ function booking_studygroups_update($node, &$form_state, $sid) {
unset($session_count);
unset($working_list);
drupal_set_message(t('Finished processing study group !group.', array('!group' => $group->booking_studygroup_descrip)));
$final_message = t('Finished processing study group !group.', array('!group' => $group->booking_studygroup_descrip));
drupal_set_message($final_message);
watchdog('booking', "<pre>" . $final_message . "\n" . implode("\n", $update_messages) . "</pre>");
} //finished processing study groups
@@ -1423,6 +1431,18 @@ function booking_studygroups_update($node, &$form_state, $sid) {
'#title' => '',
'#markup' => "<p>" . implode("<br />\n", $update_messages) . "</p>",
);
$form['update_string'] = array (
'#type' => 'hidden',
'#value' => serialize($updates_to_confirm),
);
$form['insert_string'] = array (
'#type' => 'hidden',
'#value' => serialize($inserts_to_confirm),
);
$form['confirm'] = array (
'#type' => 'submit',
'#value' => t('Confirm Updates'),
);
return array (
'first_para' => array (
'#type' => 'markup',
@@ -1433,6 +1453,45 @@ function booking_studygroups_update($node, &$form_state, $sid) {
}
/**
* Process the submission to accept calculated study group membership updates
*/
function booking_studygroups_update_form_submit($form, &$form_state) {
global $event;
$values = $form_state['input'];
$raw_updates = unserialize($values['update_string']);
$raw_inserts = unserialize($values['insert_string']);
watchdog('booking', "<pre>Study group insert confirmation array:\n@info</pre>", array('@info' => print_r( $raw_inserts, true)));
watchdog('booking', "<pre>Study group update confirmation array:\n@info</pre>", array('@info' => print_r( $raw_updates, true)));
//process the updates
foreach($raw_updates as $update)
{
$rows = db_update('booking_studygroup_mapping')
->fields($update['fields'])
->condition('sid', $update['sid'])
->execute();
//watchdog('booking', "Updated sid !sid affecting !rows rows.", array('!sid' => $update['sid'], '!rows' => $rows));
}
//handle the database inserts using the multi-insert query type at https://drupal.org/node/310079
$insert_query = db_insert('booking_studygroup_mapping')->fields(array('booking_eventid', 'booking_node_id',
'booking_studygroup_id', 'booking_session_id', 'booking_studygroup_role'));
foreach($raw_inserts as $insert)
{
$insert_query->values($insert);
}
$insert_query->execute();
drupal_set_message(t('Study group update confirmation processed.'));
//redirect the user back to the study groups page
$form_state['redirect'] = array('admin/booking/studygroups');
}
/**
* Function for viewing a printable format of who belongs to which study group
*/