diff --git a/includes/admin.form.inc b/includes/admin.form.inc index 9d0f6e7e..69f09fd2 100644 --- a/includes/admin.form.inc +++ b/includes/admin.form.inc @@ -83,6 +83,16 @@ function islandora_repository_admin(array $form, array &$form_state) { ), ), ), + 'islandora_ds_replace_exclude' => array( + '#type' => 'fieldset', + '#title' => t('Excluded DSID'), + 'islandora_ds_replace_exclude_enforced' => array( + '#type' => 'textfield', + '#title' => t('Enforce DSID restrictions'), + '#description' => t("A comma seperated list, allowing administrator to restrict user's access to replace a versionable datastreams latest version"), + '#default_value' => variable_get('islandora_ds_replace_exclude_enforced', 'RELS-EXT,RELS-INT'), + ), + ), ), ); return system_settings_form($form); diff --git a/includes/datastream.version.inc b/includes/datastream.version.inc index ecef019d..85f20c0e 100644 --- a/includes/datastream.version.inc +++ b/includes/datastream.version.inc @@ -231,6 +231,109 @@ function islandora_revert_datastream_version_form_submit(array $form, array &$fo $form_state['redirect'] = "islandora/object/{$islandora_object->id}/datastream/{$datastream_to_revert->id}/version"; } +/** + * 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'); + + $object = islandora_object_load($datastream->parent->id); + $form_state['object_id'] = $object->id; + $form_state['dsid'] = $datastream->id; + $form_state['object'] = $object; + $extensions = islandora_get_datastreams_requirements_from_models($object->models); + $mime_detect = new MimeDetect(); + $ext = array(); + foreach ($extensions[$datastream->id]['mime'] as $key => $value) { + $str = $mime_detect->getExtension($value); + array_push($ext, $str); + } + $comma = count($ext) > 1 ? "," : ""; + $ext = array(implode($comma, $ext)); + $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' => "
DSID: $datastream->id
", + ), + 'label' => array( + '#type' => 'markup', + '#markup' => "
Label: $datastream->label
", + ), + 'file' => array( + '#type' => 'managed_file', + '#required' => TRUE, + '#title' => t('Upload Document'), + '#size' => 64, + '#description' => t('Select a file to upload.
Files must be less than @size MB.', array('@size' => $upload_size)), + '#upload_location' => 'temporary://', + '#upload_validators' => array( + 'file_validate_extensions' => $ext, + // Assume its specified in MB. + 'file_validate_size' => array($upload_size * 1024 * 1024), + ), + ), + 'submit' => array( + '#type' => 'submit', + '#value' => t('Add Contents'), + ), + ), + ); +} + +/** + * Submit handler for the replace datastream form. + * + * Adds a new datastream version as latest. + * + * @param array $form + * The Drupal form. + * @param array $form_state + * The Drupal form state. + */ +function islandora_datastream_version_replace_form_submit($form, &$form_state) { + $object = islandora_object_load($form_state['object_id']); + $form_state['redirect'] = "islandora/object/{$object->id}"; + $file = file_load($form_state['values']['file']); + try { + $ds = $object[$form_state['dsid']]; + $ds->mimetype = $file->filemime; + $path = drupal_realpath($file->uri); + $ds->setContentFromFile($path); + file_delete($file); + } + catch (exception $e) { + drupal_set_message(t('An error occurred during datastream updates. See watchlog for more information.'), 'error'); + watchdog('islandora', + 'Failed to add new versionable datastream.
code: @code
message: @msg', + array( + '@code' => $e->getCode(), + '@msg' => $e->getMessage(), + ), + WATCHDOG_ERROR + ); + file_delete($file); + return; + } + drupal_set_message(t("Successfully Updated Datastream")); +} + /** * Gets Audit datastream values from foxml. * diff --git a/islandora.install b/islandora.install index caff7d75..f37894e9 100644 --- a/islandora.install +++ b/islandora.install @@ -43,6 +43,11 @@ function islandora_install() { function islandora_uninstall() { module_load_include('inc', 'islandora', 'includes/solution_packs'); islandora_install_solution_pack('islandora', 'uninstall'); + // Add new variables to clean up. + $variables = array( + 'islandora_ds_replace_exclude_enforced', + ); + array_walk($variables, 'variable_del'); } /** diff --git a/islandora.module b/islandora.module index 21c902c2..1fa1148f 100644 --- a/islandora.module +++ b/islandora.module @@ -37,7 +37,7 @@ define('ISLANDORA_VIEW_DATASTREAM_HISTORY', 'view old datastream versions'); define('ISLANDORA_MANAGE_DELETED_OBJECTS', 'manage deleted objects'); define('ISLANDORA_REVERT_DATASTREAM', 'revert to old datastream'); define('ISLANDORA_REGENERATE_DERIVATIVES', 'regenerate derivatives for an object'); - +define('ISLANDORA_REPLACE_DATASTREAM_CONTENT', 'replace a datastream with new content, preserving version history'); // Hooks. define('ISLANDORA_VIEW_HOOK', 'islandora_view_object'); @@ -317,6 +317,16 @@ function islandora_menu() { 'access arguments' => array(ISLANDORA_VIEW_DATASTREAM_HISTORY, 4), 'load arguments' => array(2), ); + $items['islandora/object/%islandora_object/datastream/%islandora_datastream/replace'] = array( + 'title' => 'Replace Datastream', + 'page arguments' => array('islandora_datastream_version_replace_form', 4), + 'page callback' => 'drupal_get_form', + 'file' => 'includes/datastream.version.inc', + 'type' => MENU_CALLBACK, + 'access callback' => 'islandora_datastream_access', + 'access arguments' => array(ISLANDORA_REPLACE_DATASTREAM_CONTENT, 4), + 'load arguments' => array(2), + ); $items['islandora/object/%islandora_object/datastream/%islandora_datastream/version/%/delete'] = array( 'title' => 'Delete datastream version', 'page arguments' => array('islandora_delete_datastream_version_form', 4, 6), @@ -516,6 +526,10 @@ function islandora_theme() { 'file' => 'theme/theme.inc', 'variables' => array('datastream' => NULL), ), + 'islandora_datastream_replace_link' => array( + 'file' => 'theme/theme.inc', + 'variables' => array('datastream' => NULL), + ), 'islandora_dublin_core_display' => array( 'file' => 'theme/theme.inc', 'template' => 'theme/islandora-dublin-core-display', @@ -594,6 +608,10 @@ function islandora_permission() { 'title' => t('Regenerate derivatives'), 'description' => t('Regenerate derivatives for an object or per datastream.'), ), + ISLANDORA_REPLACE_DATASTREAM_CONTENT => array( + 'title' => t('Replace datastreams'), + 'description' => t('Add new datastream content as latest version.'), + ), ); } @@ -699,6 +717,7 @@ function islandora_forms($form_id) { * otherwise. */ function islandora_user_access($object_or_datastream, array $permissions, $content_models = array(), $access_any = TRUE, $user = NULL) { + module_load_include('inc', 'islandora', 'includes/utilities'); $is_repository_accessible = &drupal_static(__FUNCTION__); diff --git a/theme/theme.inc b/theme/theme.inc index feac06b2..c81a918d 100644 --- a/theme/theme.inc +++ b/theme/theme.inc @@ -25,7 +25,7 @@ function islandora_preprocess_islandora_default_edit(array &$variables) { $header[] = array('data' => t('Versions')); } - $header[] = array('data' => t('Operations'), 'colspan' => '4'); + $header[] = array('data' => t('Operations'), 'colspan' => '5'); $table_attributes = array('class' => array('manage-datastreams')); $rows = array(); @@ -60,6 +60,13 @@ function islandora_preprocess_islandora_default_edit(array &$variables) { 'datastream' => $ds, )), ); + // Add new datastream content as the lastest version. + $row[] = array( + 'class' => 'datastream-replace', + 'data' => theme('islandora_datastream_replace_link', array( + 'datastream' => $ds, + )), + ); } $row[] = array( 'class' => 'datastream-download', @@ -436,6 +443,27 @@ function theme_islandora_datastream_version_link(array $vars) { } } +/** + * Renders a link to take you to the datastream add latest version page. + * + * @param array $vars + * An array containing: + * - datastream: An AbstractDatastream to generate a new version. + * + * @return string + * Markup. + */ +function theme_islandora_datastream_replace_link(array $vars) { + $datastream = $vars['datastream']; + if (islandora_datastream_access(ISLANDORA_REPLACE_DATASTREAM_CONTENT, $datastream)) { + $var_string = variable_get("islandora_ds_replace_exclude_enforced", "RELS-EXT,RELS-INT"); + $replace_exclude = explode(",", $var_string); + if (!in_array($datastream->id, $replace_exclude)) { + return l(t('replace'), "islandora/object/{$datastream->parent->id}/datastream/{$datastream->id}/replace"); + } + } +} + /** * Renders a link that will re-create derivatives for a datastream. *