Browse Source
This commit allows users with the correct permissions to see all the previous versions of a datastream. It also allows the user to see the contents of old datastreams and delete versions of the previous datastreams.pull/374/head
jonathangreen
11 years ago
8 changed files with 428 additions and 63 deletions
@ -0,0 +1,125 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* The form displayed that shows the datastream version history. |
||||
*/ |
||||
|
||||
/** |
||||
* Function that returns markup for the datastream versions page. |
||||
*/ |
||||
function islandora_datastream_version_table($datastream) { |
||||
module_load_include('inc', 'islandora', 'includes/datastream'); |
||||
module_load_include('inc', 'islandora', 'includes/utilities'); |
||||
|
||||
drupal_set_title(t("@dsid Previous Versions", array('@dsid' => $datastream->id))); |
||||
|
||||
$header = array(); |
||||
$header[] = array('data' => 'Created Date'); |
||||
$header[] = array('data' => t('Size')); |
||||
$header[] = array('data' => t('Label')); |
||||
$header[] = array('data' => t('Mime type')); |
||||
$header[] = array('data' => t('Operations')); |
||||
$rows = array(); |
||||
|
||||
foreach ($datastream as $version => $datastream_version) { |
||||
$row = array(); |
||||
$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-mime', |
||||
'data' => $datastream_version->mimeType, |
||||
); |
||||
$row[] = array( |
||||
'class' => 'datastream-delete', |
||||
'data' => theme('islandora_datastream_delete_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. |
||||
* |
||||
* @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 sucessfully deleted from Islandora object %o', array( |
||||
'%d' => $datastream_id, |
||||
'%o' => $object->label))); |
||||
|
||||
$form_state['redirect'] = "islandora/object/{$object->id}/datastream/{$datastream->id}/version"; |
||||
} |
@ -1,42 +0,0 @@
|
||||
<?php |
||||
|
||||
function islandora_datastream_versions_table ($datastream) { |
||||
module_load_include('inc', 'islandora', 'includes/datastream'); |
||||
module_load_include('inc', 'islandora', 'includes/utilities'); |
||||
|
||||
drupal_set_title("$datastream->id Previous Versions"); |
||||
|
||||
$header = array(); |
||||
$header[] = array ('data' => 'Created Date'); |
||||
$header[] = array('data' => t('Size')); |
||||
$header[] = array('data' => t('Label')); |
||||
$header[] = array('data' => t('Mime type')); |
||||
$rows = array(); |
||||
|
||||
foreach ($datastream as $version => $datastream_version) { |
||||
$row = array(); |
||||
$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-mime', |
||||
'data' => $datastream_version->mimeType, |
||||
); |
||||
$rows[] = $row; |
||||
} |
||||
|
||||
return theme('table', array('header' => $header, 'rows' => $rows)); |
||||
} |
@ -0,0 +1,198 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Tests that datastream versions code works as intended |
||||
*/ |
||||
|
||||
class IslandoraDatastreamVersionTestCase extends IslandoraWebTestCase { |
||||
|
||||
/** |
||||
* Gets info to display to describe this test. |
||||
* |
||||
* @see IslandoraWebTestCase::getInfo() |
||||
*/ |
||||
public static function getInfo() { |
||||
return array( |
||||
'name' => 'Islandora Datastream Versions', |
||||
'description' => 'Tests the functionality related to datastream versions in Islandora.', |
||||
'group' => 'Islandora', |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Create an object with many datastram versions. |
||||
* |
||||
* @see IslandoraWebTestCase::setUp() |
||||
*/ |
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->pid = $this->randomName() . ":" . $this->randomName(); |
||||
$tuque = islandora_get_tuque_connection(); |
||||
$object = $tuque->repository->constructObject($this->pid); |
||||
$object = $tuque->repository->ingestObject($object); |
||||
$this->dsid = $this->randomName(); |
||||
$ds = $object->constructDatastream($this->dsid); |
||||
$ds->label = 'Test'; |
||||
$ds->content = 'test'; |
||||
$object->ingestDatastream($ds); |
||||
|
||||
// Create three versions. |
||||
$ds->mimetype = 'application/pdf'; |
||||
$ds->label = 'jaaaaa maaaan'; |
||||
$ds->content = 'Tests... are the bests.'; |
||||
} |
||||
|
||||
/** |
||||
* Free any objects/resources created for this test. |
||||
* |
||||
* @see IslandoraWebTestCase::tearDown() |
||||
*/ |
||||
public function tearDown() { |
||||
$tuque = islandora_get_tuque_connection(); |
||||
$tuque->repository->purgeObject($this->pid); |
||||
|
||||
parent::tearDown(); |
||||
} |
||||
|
||||
/** |
||||
* Check if the user can see datastream versions in the datastream table. |
||||
*/ |
||||
public function testSeeDatastreamVersions() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view fedora repository objects', |
||||
'ingest fedora objects', |
||||
'view old datastream versions', |
||||
'add fedora datastreams', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
$this->drupalGet("islandora/object/{$this->pid}/manage/datastreams"); |
||||
$this->assertLink($this->dsid); |
||||
$this->assertLink("4"); |
||||
$encoded_pid = urlencode($this->pid); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version"); |
||||
} |
||||
|
||||
/** |
||||
* Check that users without permission cannot see datastream versions. |
||||
*/ |
||||
public function testNotSeeDatastreamVersions() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view fedora repository objects', |
||||
'ingest fedora objects', |
||||
'add fedora datastreams', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
$this->drupalGet("islandora/object/{$this->pid}/manage/datastreams"); |
||||
$this->assertLink($this->dsid); |
||||
$this->assertNoLink("4"); |
||||
$encoded_pid = urlencode($this->pid); |
||||
$this->assertNoLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version"); |
||||
} |
||||
|
||||
/** |
||||
* Check that users without permission cannot see datastream version pages. |
||||
*/ |
||||
public function testDatastreamVersionPermissions() { |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version"); |
||||
$this->assertResponse(403); |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/0/view"); |
||||
$this->assertResponse(403); |
||||
} |
||||
|
||||
/** |
||||
* Check that the proper infomration is displayed on the ds version page. |
||||
*/ |
||||
public function testDatastreamVersionPage() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view old datastream versions', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version"); |
||||
$this->assertNoLink("Delete"); |
||||
$this->assertText("text/xml"); |
||||
$this->assertText("application/pdf"); |
||||
$this->assertText("jaaaaa maaaan"); |
||||
$this->assertText("Test"); |
||||
|
||||
$encoded_pid = urlencode($this->pid); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/0/view"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/1/view"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/2/view"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/3/view"); |
||||
} |
||||
|
||||
/** |
||||
* Make sure the correct content is displayed for each datastream version. |
||||
*/ |
||||
public function testDatastreamVersionContent() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view old datastream versions', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/3/view"); |
||||
$content = $this->drupalGetContent(); |
||||
if ($content != 'test') { |
||||
$this->fail("Incorrect datastream content"); |
||||
} |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/2/view"); |
||||
$content = $this->drupalGetContent(); |
||||
if ($content != 'test') { |
||||
$this->fail("Incorrect datastream content"); |
||||
} |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/1/view"); |
||||
$content = $this->drupalGetContent(); |
||||
if ($content != 'test') { |
||||
$this->fail("Incorrect datastream content"); |
||||
} |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/0/view"); |
||||
$content = $this->drupalGetContent(); |
||||
if ($content != 'Tests... are the bests.') { |
||||
$this->fail("Incorrect datastream content"); |
||||
} |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/5/view"); |
||||
$this->assertResponse(404); |
||||
} |
||||
|
||||
/** |
||||
* Make sure you can delete datastream versions. |
||||
*/ |
||||
public function testDatastreamVersionDelete() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view old datastream versions', |
||||
'delete fedora objects and datastreams', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version"); |
||||
$this->assertLink("delete"); |
||||
$this->assertText('text/xml'); |
||||
|
||||
$encoded_pid = urlencode($this->pid); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/0/delete"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/1/delete"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/2/delete"); |
||||
$this->assertLinkByHref("islandora/object/$encoded_pid/datastream/{$this->dsid}/version/3/delete"); |
||||
|
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/3/delete"); |
||||
$this->drupalPost(NULL, array(), t('Delete')); |
||||
$this->assertNoText('text/xml'); |
||||
} |
||||
|
||||
/** |
||||
* Make sure you can't delete versions that don't exist/have only 1 version. |
||||
*/ |
||||
public function testDatastreamVersionDeleteEdgeCase() { |
||||
$user = $this->drupalCreateUser(array( |
||||
'view old datastream versions', |
||||
'delete fedora objects and datastreams', |
||||
)); |
||||
$this->drupalLogin($user); |
||||
|
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/{$this->dsid}/version/6/delete"); |
||||
$this->assertResponse(404); |
||||
|
||||
$this->drupalGet("islandora/object/{$this->pid}/datastream/DC/version/0/delete"); |
||||
$this->assertResponse(404); |
||||
} |
||||
} |
Loading…
Reference in new issue