parent; drupal_set_title(t("@dsid Previous Versions", array('@dsid' => $datastream->id))); $audit_values = islandora_get_audit_trail($parent->id, $datastream->id); $header = array(); $header[] = array('data' => t('Created Date')); $header[] = array('data' => t('Size')); $header[] = array('data' => t('Label')); $header[] = array('data' => t('Responsibility')); $header[] = array('data' => t('Mime type')); $header[] = array('data' => t('Operations'), 'colspan' => '2'); $rows = array(); foreach ($datastream as $version => $datastream_version) { $row = array(); $reponsibility = $parent->owner; foreach ($audit_values as $audit_value) { $internal = $datastream_version->createdDate; if ($audit_value['date'] == $datastream_version->createdDate) { $reponsibility = $audit_value['responsibility']; } } $user = user_load_by_name($reponsibility); if ($user) { $user_id = $user->uid; $user_val = l($reponsibility, "user/$user_id"); } else { $user_val = $reponsibility; } $row[] = array( 'class' => 'datastream-date', 'data' => theme('islandora_datastream_view_link', array( 'datastream' => $datastream, 'label' => $datastream_version->createdDate->format(DATE_RFC850), 'version' => $version, )), ); $row[] = array( 'class' => 'datastream-size', 'data' => islandora_datastream_get_human_readable_size($datastream_version), ); $row[] = array( 'class' => 'datastream-label', 'data' => $datastream_version->label, ); $row[] = array( 'class' => 'datastream-responsibility', 'data' => $user_val, ); $row[] = array( 'class' => 'datastream-mime', 'data' => $datastream_version->mimeType, ); $row[] = array( 'class' => 'datastream-delete', 'data' => theme('islandora_datastream_delete_link', array( 'datastream' => $datastream, 'version' => $version, )), ); $row[] = array( 'class' => 'datastream-revert', 'data' => theme('islandora_datastream_revert_link', array( 'datastream' => $datastream, 'version' => $version, )), ); $rows[] = $row; } return theme('table', array('header' => $header, 'rows' => $rows)); } /** * The admin delete datastream form. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. * @param AbstractDatastream $datastream * The datastream to be deleted. * @param string $version * The version number of the datastream we are trying to delete. * * @return array * The drupal form definition. */ function islandora_delete_datastream_version_form(array $form, array &$form_state, AbstractDatastream $datastream, $version) { if (!isset($datastream[$version]) || count($datastream) < 2) { return drupal_not_found(); } $form_state['datastream'] = $datastream; $form_state['version'] = $version; return confirm_form($form, t('Are you sure you want to delete version @version of the @dsid datastream?', array('@dsid' => $datastream->id, '@version' => $version)), "islandora/object/{$datastream->parent->id}", t('This action cannot be undone.'), t('Delete'), t('Cancel') ); } /** * Submit handler for the delete datastream form. * * Purges/Delete's the given AbstractDatastream if possible. * * The ISLANDORA_PRE_PURGE_DATASTREAM_HOOK will query other modules as to * whether the given FedoraDatastream * should be: blocked from purging; state set to 'Deleted'; or purged. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. */ function islandora_delete_datastream_version_form_submit(array $form, array &$form_state) { $datastream = $form_state['datastream']; $version = $form_state['version']; $datastream_id = $datastream->id; $object = $datastream->parent; try { unset($datastream[$version]); } catch (Exception $e) { drupal_set_message(t('Error deleting version %v of %s datastream from object %o %e', array( '%v' => $version, '%s' => $datastream_id, '%o' => $object->label, '%e' => $e->getMessage())), 'error'); } drupal_set_message(t('%d datastream version successfully deleted from Islandora object %o', array( '%d' => $datastream_id, '%o' => $object->label))); $form_state['redirect'] = "islandora/object/{$object->id}/datastream/{$datastream->id}/version"; } /** * The admin revert datastream form. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. * @param AbstractDatastream $datastream * The datastream to be deleted. * @param string $version * The version number of the datastream we are trying to revert to. * * @return array * The drupal form definition. */ function islandora_revert_datastream_version_form(array $form, array &$form_state, AbstractDatastream $datastream, $version) { if (!isset($datastream[$version]) || count($datastream) < 2) { return drupal_not_found(); } $form_state['dsid'] = $datastream->id; $form_state['object_id'] = $datastream->parent->id; $form_state['version'] = $version; return confirm_form($form, t('Are you sure you want to revert to version @version of the @dsid datastream?', array('@dsid' => $datastream->id, '@version' => $version)), "islandora/object/{$datastream->parent->id}", "", t('Revert'), t('Cancel') ); } /** * Submit handler for the revert datastream form. * * Reverts the given AbstractDatastream if possible. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. */ function islandora_revert_datastream_version_form_submit(array $form, array &$form_state) { $islandora_object = islandora_object_load($form_state['object_id']); $datastream_to_revert = $islandora_object[$form_state['dsid']]; $version = $form_state['version']; // Create file holding specified datastream version, and set datastream to it. $datastream_to_revert_to = $datastream_to_revert[$version]; if (in_array($datastream_to_revert->controlGroup, array('R', 'E'))) { $datastream_to_revert->url = $datastream_to_revert_to->url; } else { $filename = file_create_filename('datastream_temp_file', 'temporary://'); $datastream_to_revert_to->getContent($filename); $datastream_to_revert->setContentFromFile($filename); file_unmanaged_delete($filename); } if ($datastream_to_revert->mimeType != $datastream_to_revert_to->mimeType) { $datastream_to_revert->mimeType = $datastream_to_revert_to->mimeType; } if ($datastream_to_revert->label != $datastream_to_revert_to->label) { $datastream_to_revert->label = $datastream_to_revert_to->label; } drupal_set_message(t('%d datastream successfully reverted to version %v for Islandora object %o', array( '%d' => $datastream_to_revert->id, '%v' => $version, '%o' => $islandora_object->label))); $form_state['redirect'] = "islandora/object/{$islandora_object->id}/datastream/{$datastream_to_revert->id}/version"; } /** * Process available dsids, mime and extensions for a given object. * * @param AbstractObject $object * The FedoraObject to process available extensions * * @return array() * An associative array, merged from calls to * islandora_get_datastreams_requirements_from_content_models() * and an objects dsid's. */ function islandora_get_object_extensions(AbstractObject $object) { $extensions = islandora_get_datastreams_requirements_from_models($object->models); foreach ($object as $datastream) { // Could be a datastream not associated in a content model, // such as user added. if (!isset($extensions[$datastream->id])) { // Add the extensions manually. $extensions[$datastream->id] = array( 'id' => $datastream->id, 'optional' => TRUE, 'mime' => array($datastream->mimeType), ); } } return $extensions; } /** * The admin replace datastream form. * * @param array $form * The Drupal form. * @param array $form_state * The Drupal form state. * @param AbstractDatastream $datastream * The datastream to be updated. * * @return array * The drupal form definition. */ function islandora_datastream_version_replace_form($form, &$form_state, AbstractDatastream $datastream) { module_load_include('inc', 'islandora', 'includes/content_model'); module_load_include('inc', 'islandora', 'includes/utilities'); module_load_include('inc', 'islandora', 'includes/mimetype.utils'); $object = islandora_object_load($datastream->parent->id); $form_state['object_id'] = $object->id; $form_state['dsid'] = $datastream->id; $form_state['object'] = $object; $datastream_mime_map = islandora_get_object_extensions($object); $current_mime = $datastream->mimetype; $mimes = $datastream_mime_map[$datastream->id]['mime']; if (!in_array($current_mime, $mimes)) { $mimes[] = $current_mime; } $extensions = array(); foreach ($mimes as $mime) { $extensions = array_merge($extensions, islandora_get_extensions_for_mimetype($mime)); } $valid_extensions = implode(' ', $extensions); $upload_size = min((int) ini_get('post_max_size'), (int) ini_get('upload_max_filesize')); return array( 'dsid_fieldset' => array( '#type' => 'fieldset', '#title' => t("Update datastream with latest version"), '#collapsible' => FALSE, '#collapsed' => FALSE, 'dsid' => array( '#type' => 'markup', '#markup' => "