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.
*