From 87e0272f174309cc1182dc100d92e84fe7072c4b Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 15:08:01 -0300 Subject: [PATCH 1/7] Changed collection management so that every content model can be removed from the collection policy --- .../includes/change_content_models.inc | 150 +++++++++++ .../includes/child_collection.inc | 167 ++++++++++++ .../includes/collection_management.inc | 239 ++++++++++++++++++ .../includes/collection_manager_table.inc | 117 +++++++++ .../includes/delete_collection.inc | 126 +++++++++ .../includes/manage_policies.inc | 223 ++++++++++++++++ .../includes/move_collection.inc | 78 ++++++ .../islandora_basic_collection.module | 53 ++-- 8 files changed, 1120 insertions(+), 33 deletions(-) create mode 100644 islandora_basic_collection/includes/change_content_models.inc create mode 100644 islandora_basic_collection/includes/child_collection.inc create mode 100644 islandora_basic_collection/includes/collection_management.inc create mode 100644 islandora_basic_collection/includes/collection_manager_table.inc create mode 100644 islandora_basic_collection/includes/delete_collection.inc create mode 100644 islandora_basic_collection/includes/manage_policies.inc create mode 100644 islandora_basic_collection/includes/move_collection.inc diff --git a/islandora_basic_collection/includes/change_content_models.inc b/islandora_basic_collection/includes/change_content_models.inc new file mode 100644 index 00000000..6ae8b9b2 --- /dev/null +++ b/islandora_basic_collection/includes/change_content_models.inc @@ -0,0 +1,150 @@ +repository); + $cm_name = $item->Label; + $cm_options[$content_model] = $cm_name; + } + } + + $namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); + + $collection_policy_dsid = variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'); + $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); + $collection_policy_datastream = $collection_object->getDatastream($collection_policy_dsid); + + $supported_collection_models = array(); + if ($collection_policy_datastream && $collection_policy_datastream->content) { + $collection_policy = new CollectionPolicy($collection_policy_datastream->content); + $supported_collection_models = $collection_policy->getContentModels(); + } + $collection_namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); + + $collection_name = $collection_object->label; + $new_content_models = get_content_models_as_option_array(); + $current_models_in_policy = array(); + + if ($supported_collection_models) { + foreach ($supported_collection_models as $supported_model) { + $current_models_in_policy[$supported_model['pid']] = $supported_model['pid']; + } + } + + $form['change_cmodel']['titlebox'] = array( + '#type' => 'item', + '#title' => t("Change content models within @collection_pid", array('@collection_pid' => $collection_pid)), + ); + + $form['change_cmodel']['current_content_model'] = array( + '#title' => "Choose content model to be changed", + '#type' => 'select', + '#options' => $current_models_in_policy, + '#description' => t("All objects in this collection with the selected content model will be changed."), + ); + + $form['change_cmodel']['new_content_model'] = array( + '#title' => "Choose new content model", + '#type' => 'select', + '#options' => $new_content_models, + '#description' => t("The new content model to be assigned to selected objects."), + ); + + $form['change_cmodel']['collection_pid'] = array( + '#type' => 'hidden', + '#value' => $collection_pid, + ); + + $form['change_cmodel']['submit'] = array( + '#type' => 'submit', + '#value' => t('Change content model associations'), + '#id' => 'change_model', + ); + + return $form; +} + +function islandora_change_content_models_form_validate($form, &$form_state) { + +} + +function islandora_change_content_models_form_submit($form, &$form_state) { + module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionPolicy'); + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + + $current_content_model = $form_state['values']['current_content_model']; + $new_content_model = $form_state['values']['new_content_model']; + $collection_pid = $form_state['values']['collection_pid']; + + $current_content_model_object = new FedoraObject($current_content_model, $rest_connection->repository); + + $collection_object = new FedoraObject($form_state['values']['collection_pid'], $rest_connection->repository); + $collection_policy_datastream = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); + $policy = new CollectionPolicy($collection_policy_datastream->content); + + $collection_policy_xml = new DOMDocument(); + $collection_policy_xml->loadXML($collection_policy_datastream->content); + + $add_to_policy = TRUE; + $policy_content_models = $policy->getContentModels(); + foreach ($policy_content_models as $policy_content_model) { + if ($policy_content_model['pid'] == $current_content_model) { + $namespace = $policy_content_model['namespace']; + } + if ($policy_content_model['pid'] == $new_content_model) { + $add_to_policy = FALSE; + } + } + if ($add_to_policy) { + $new_content_model_object = new FedoraObject($new_content_model, $rest_connection->repository); + $new_content_model_datastream = $new_content_model_object->getDatastream(variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); + $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); + + $content_model_element = $collection_policy_xml->createElement('content_model'); + $content_model_element->setAttribute('name', $new_content_model_object->label); + $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + $content_model_element->setAttribute('namespace', $namespace); + $content_model_element->setAttribute('pid', $new_content_model_object->id); + $content_models_element->item(0)->appendChild($content_model_element); + + $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); + $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); + $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; + $collection_object->ingestDatastream($new_collection_policy_datastream); + } + + $query = "select \$object from <#ri> + where (\$object + and (\$object + or \$object ) + and \$object )"; + + $objects = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + + $count = 0; + foreach ($objects as $object) { + if (!$object['object']['value']) { + continue; + } + $fedora_item = new FedoraObject($object['object']['value'], $rest_connection->repository); + $fedora_item->relationships->remove(FEDORA_MODEL_URI, 'hasModel', $current_content_model); + $fedora_item->relationships->add(FEDORA_MODEL_URI, 'hasModel', $new_content_model); + $count++; + } + drupal_set_message(t('@current_content_model changed to @new_content_model on @count objects', array('@current_content_model' => $current_content_model, '@new_content_model' => $new_content_model, '@count' => $count))); +} \ No newline at end of file diff --git a/islandora_basic_collection/includes/child_collection.inc b/islandora_basic_collection/includes/child_collection.inc new file mode 100644 index 00000000..669442c5 --- /dev/null +++ b/islandora_basic_collection/includes/child_collection.inc @@ -0,0 +1,167 @@ + 'item', + '#title' => t("This object is not a collection and so can't contain child collections. To fix this add the islandora:collectionCModel to this object's collection policy"), + ); + return $form; + } + $restricted = FALSE; + if (variable_get('fedora_namespace_restriction_enforced', TRUE)) { + $restricted = TRUE; + $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); + $namespaces = explode(':', $allowed_string); + foreach ($namespaces as $namespace) { + if ($namespace) { + $allowed[trim($namespace)] = trim($namespace); + } + } + } + $collection_namespace = substr($this_collection_pid, 0, strpos($this_collection_pid, ":")); + + $content_models = get_content_models_as_option_array(); + unset($content_models['islandora:collectionCModel']); + + $form['child_creation']['titlebox'] = array( + '#type' => 'item', + '#title' => t("Create new child collection within @collection", array('@collection' => $this_collection_pid)), + ); + + $form['child_creation']['collection_name'] = array( + '#title' => "Collection name", + '#type' => 'textfield', + '#size' => 25, + '#description' => t("Human readable name for this collection"), + ); + + $form['child_creation']['new_collection_pid'] = array( + '#title' => "Collection PID", + '#type' => 'textfield', + '#size' => 15, + '#default_value' => $rest_connection->repository->api->m->getNextPid($collection_namespace), + '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection (eg. islandora:pamphlets)"), + ); + + if (!$restricted) { + $form['child_creation']['collection_namespace'] = array( + '#title' => "Collection namespace", + '#type' => 'textfield', + '#size' => 15, + '#default_value' => $collection_namespace, + '#description' => t("Namespace for objects in this collection."), + ); + } + else { + $form['child_creation']['collection_namespace'] = array( + '#title' => "Collection namespace", + '#type' => 'select', + '#options' => $allowed, + '#default_value' => 'default', + '#description' => t("Namespace for objects in this collection."), + ); + } + + $form['current'] = array( + '#type' => 'hidden', + '#value' => $this_collection_pid, + ); + + $form['child_creation']['content_models'] = array( + '#title' => "Choose allowable content models for this collection", + '#type' => 'checkboxes', + '#options' => $content_models, + '#description' => t("Content models describe the behaviours of objects with which they are associated."), + ); + + $form['child_creation']['submit'] = array( + '#type' => 'submit', + '#value' => t('Create collection'), + '#id' => 'create_child' + ); + return $form; +} + +function islandora_create_child_collection_form_validate($form, &$form_state) { + +} + +/** + * Submit handler for child collection creation form + * + * @global type $base_url + * @param array $form + * @param array $form_state + */ +function islandora_create_child_collection_form_submit($form, &$form_state) { + global $base_url; + module_load_include('inc', 'islandora', '/includes/islandora.ingest'); + $thumbnail = $base_url . '/' . drupal_get_path('module', 'islandora_basic_collection') . '/Crystal_Clear_filesystem_folder_grey.png'; + $new_collection_pid = $form_state['values']['new_collection_pid']; + $new_collection_label = $form_state['values']['collection_name']; + $namespace = $form_state['values']['collection_namespace']; + $all_cModels = get_content_models_as_option_array(); + $collection_content_models = array(array('pid' => 'islandora:collectionCModel')); + $relationship = 'isMemberOfCollection'; + + $collection_policy = ' + + + + + + + + isMemberOfCollection +'; + + $content_models = $form_state['values']['content_models']; + + $collection_policy_xml = new DOMDocument(); + $collection_policy_xml->loadXML($collection_policy); + + $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); + $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); + foreach ($content_models as $content_model) { + if ($content_model) { + $content_model_element = $collection_policy_xml->createElement('content_model'); + $content_model_element->setAttribute('name', $all_cModels[$content_model]); + $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + $content_model_element->setAttribute('namespace', $namespace . ':1'); + $content_model_element->setAttribute('pid', $content_model); + $content_models_element->item(0)->appendChild($content_model_element); + } + } + $fedora_object = islandora_ingest_get_object($collection_content_models, $form_state['values']['current'], $relationship, $new_collection_pid); + $fedora_object->label = $new_collection_label; + $thumbnail_datastream = $fedora_object->constructDatastream('TN'); + $thumbnail_datastream->setContentFromUrl($thumbnail); + $thumbnail_datastream->label = 'Thumbnail'; + $thumbnail_datastream->mimetype = 'image/png'; + $fedora_object->ingestDatastream($thumbnail_datastream); + $policy_datastream = $fedora_object->constructDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'), 'X'); + $policy_datastream->setContentFromString($collection_policy_xml->saveXML()); + $policy_datastream->label = 'Collection policy'; + $fedora_object->ingestDatastream($policy_datastream); + $new_fedora_object = islandora_ingest_add_object($fedora_object); + + drupal_goto('/islandora/object/' . $new_collection_pid); +} \ No newline at end of file diff --git a/islandora_basic_collection/includes/collection_management.inc b/islandora_basic_collection/includes/collection_management.inc new file mode 100644 index 00000000..85541ee6 --- /dev/null +++ b/islandora_basic_collection/includes/collection_management.inc @@ -0,0 +1,239 @@ + +where (\$object + or \$object ) + and \$object \$model + and \$object \$title"; + + $model_pids = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + $represented_models = array(); + foreach ($model_pids as $model_pid) { + + if ($model_pid['model']['value'] && $model_pid['model']['value'] != 'fedora-system:FedoraObject-3.0') { + $fedora_object = new FedoraObject($model_pid['model']['value'], $rest_connection->repository); + $content_model_title = $fedora_object->label; + $represented_models[$model_pid['model']['value']] = $model_pid['model']['value'] . ' ~ ' . $content_model_title; + } + } + return $represented_models; +} + +function get_child_collections($collection_pid) { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + + $query = << + where \$object + and \$object +EOD; + + $lines = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + $collection_pids = array_values(array_filter($lines)); + return $collection_pids; +} + +function islandora_collections_get_collection_from_pid($pid) { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + + $query = 'select $parent from <#ri> + where ($object $parent + or $object $parent) + and $object \'' . $pid . '\' + order by $object'; + + $object_pids = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + $object_pids = array_values(array_filter($object_pids)); + return $object_pids; +} + +/** + * Returns an array of pids that match the query contained in the collection + * object's QUERY datastream or in the suppled $query parameter. + * @param $collection_pid + * @param $query + * @param $query_format R + */ +function get_related_items_as_array($collection_pid, $relationship = array('isMemberOfCollection'), $limit = 10000, $offset = 0, $active_objects_only = TRUE, $cmodel = NULL, $orderby = '$title') { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + + global $user; + +// Not sure if this is necessary given that we should never be able to delete objects in a namespace that we don't have access to. +// if (!fedora_repository_access('view fedora repository', $collection_pid['object']['value'])) { +// drupal_set_message(t("You do not have access to Fedora objects within the attempted namespace or access to Fedora denied."), 'error'); +// return array(); +// } + + $query_string = 'select $object $title $content from <#ri> + where ($object $title + and $object $content + and ('; + + if (is_array($relationship)) { + foreach ($relationship as $rel) { + $query_string .= '$object '; + if (next($relationship)) { + $query_string .= ' OR '; + } + } + } + elseif (is_string($relationship)) { + $query_string .= '$object '; + } + else { + return ''; + } + + $query_string .= ') '; + $query_string .= $active_objects_only ? 'and $object ' : ''; + + if ($cmodel) { + $query_string .= ' and $content '; + } + + $query_string .= ') + minus $content + order by ' . $orderby; + + $results = $rest_connection->repository->ri->itqlQuery($query_string, $limit, $offset); + + return $results; +} + +/** + * determines whether we can see the object or not + * checks PID namespace permissions, and user permissions + * @global type $user + * @param type $op + * @param type $pid + * @return type + */ +function fedora_repository_access($permission, $pid) { + global $user; + $name_space_access = FALSE; + $is_restricted = variable_get('islandora_namespace_restriction_enforced', TRUE); + if (!$is_restricted) { + $name_space_access = TRUE; + } + if ($pid == NULL) { + $pid = variable_get('islandora_repository_pid', 'islandora:root'); + } + $name_space_allowed = explode(" ", variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora: ilives: islandora-book: books: newspapers: ')); + $pos = NULL; + foreach ($name_space_allowed as $name_space) { + $pos = stripos($pid, $name_space); + if ($pos === 0) { + $name_space_access = TRUE; + } + } + if ($name_space_access) { + $user_access = user_access($permission); + if ($user_access == NULL) { + return FALSE; + } + return $user_access; + } + else { + return FALSE; + } +} + +/** + * gets the name of the content models for the specified object + * this now returns an array of pids as in Fedora 3 we can have more then one Cmodel for an object + * @param type $pid + * @param type $include_fedora_system_content_models + * @return array + */ +function get_content_models_list($pid, $include_fedora_system_content_models = FALSE) { + + module_load_include('inc', 'islandora', 'RestConnection'); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + $rest_connection = new RestConnection(); + $pids = array(); + $query = 'select $object from <#ri> + where $object + and $object '; + $content_models = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + + if (empty($content_models)) { + return $pids; + } + + $cmodels = array(); + foreach ($content_models as $content_model) { + if (strpos($content_model['object']['uri'], 'fedora-system:FedoraObject-3.0') != FALSE && $include_fedora_system_content_models == FALSE) { + continue; + } + $cmodels[] = substr(strstr($content_model['object']['uri'], '/'), 1); + } + + return $cmodels; +} + +/** + * Function: get_content_models_as_option_array + * + * Description: Returns an associative array of all available content models in Fedora instance + * + * @return array + */ +function get_content_models_as_option_array() { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + + $restricted = variable_get('fedora_namespace_restriction_enforced', TRUE); + $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); + $namespaces = explode(':', $allowed_string); + foreach ($namespaces as $namespace) { + if ($namespace) { + $allowed[] = trim($namespace); + } + } + $query = 'select $object $title from <#ri> + where ($object $title + and ($object + or $object ) + and $object ) + order by $title'; + + $list = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + $options = array(); + foreach ($list as $item) { //removes blanks + if ($item) { + $item_namespace = explode(':', $item['object']['value']); + if (!$restricted || in_array($item_namespace[0], $allowed)) { + + if (!preg_match('/fedora-system/', $item['object']['value'])) { + $options[$item['object']['value']] = $item['title']['value'] . ' ~ ' . $item['object']['value']; + } + } + } + } + + return $options; +} \ No newline at end of file diff --git a/islandora_basic_collection/includes/collection_manager_table.inc b/islandora_basic_collection/includes/collection_manager_table.inc new file mode 100644 index 00000000..63a91b25 --- /dev/null +++ b/islandora_basic_collection/includes/collection_manager_table.inc @@ -0,0 +1,117 @@ + + where ($object + or $object ) + and $object $title'; + $results = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + $keys = array(); + $objects = array(); + foreach ($results as $result) { + $objects[$result['object']['value']] = $result['title']['value']; + $keys[] = $result['object']['value']; + } + $rows = array(); + foreach ($objects as $key => $object) { + $rows[$key] = array( + '#pid' => $key, + 'pid' => array('#value' => l($key, 'islandora/object/' . $key)), + 'title' => array( + 'data' => array( + '#type' => 'link', + '#title' => $object, + '#href' => 'islandora/object/' . $key, + ), + ), + ); + } + + $header = array( + 'title' => array('data' => t('Title')), + ); + + if (!$rows) { + return; + } + + $table = array( + '#type' => 'tableselect', + '#header' => $header, + '#options' => $rows, + ); + + return $table; + +} + +/** + * themes the form table. + * + * @param array $element Drupal Form Element. + * @return string + */ +function theme_islandora_basic_collection_management_form_table(array $element) { + $rows = array(); + foreach (element_children($element['rows']) as $child) { + $setting = $element['rows'][$child]; + $pid = $setting['#pid']; + $fields = array( + drupal_render($element['selections'][$pid]) // First field is a checkbox + ); + foreach (element_children($setting) as $property) { + $field = $setting[$property]; + $fields[] = drupal_render($field); + } + $rows[] = array( + 'data' => $fields, + 'class' => isset($setting['#attributes']['class']) ? $setting['#attributes']['class'] : NULL + ); + } + $attributes = isset($element['#id']) ? array('id' => $element['#id']) : NULL; + return theme_table($element['#header'], $rows, $attributes); +} + +function get_collections_as_option_array() { + module_load_include('inc', 'islandora', 'RestConnection'); + require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; + + $restricted = variable_get('fedora_namespace_restriction_enforced', TRUE); + $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); + $namespaces = explode(':', $allowed_string); + + $rest_connection = new RestConnection(); + $query = 'select $object $title from <#ri> + where ($object $title + and $object + and $object ) + order by $title'; + $results = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); + foreach ($namespaces as $namespace) { + $trimmed_names[] = trim($namespace); + } + $options = array(); + foreach ($results as $item) { //removes blanks + $namespace = explode(':', $item['object']['value']); + $namespace = trim($namespace[0]); + if (!$restricted || in_array($namespace, $trimmed_names)) { + $options[$item['object']['value']] = $item['title']['value']; + } + } + unset($options['islandora:ContentModelCollection']); + return $options; +} \ No newline at end of file diff --git a/islandora_basic_collection/includes/delete_collection.inc b/islandora_basic_collection/includes/delete_collection.inc new file mode 100644 index 00000000..3f0e441c --- /dev/null +++ b/islandora_basic_collection/includes/delete_collection.inc @@ -0,0 +1,126 @@ + 'item', + '#title' => t("Delete objects from @collection_pid", array('@collection_pid' => $pid)), + ); + + if ($table) { + $form['collection_delete']['table'] = array( + 'table' => $table, + ); + } + else { + $form['collection_delete']['delete_root'] = array( + '#type' => 'checkbox', + '#title' => "Remove this empty collection?", + '#id' => 'delete_collection', + ); + } + $form['current'] = array( + '#type' => 'hidden', + '#value' => $pid, + ); + + $form['collection_delete']['message'] = array( + '#type' => 'item', + '#value' => t("This action is permanant and cannot be undone."), + ); + $form['collection_delete']['submit'] = array( + '#type' => 'submit', + '#description' => t("This action is permanant and cannot be undone."), + '#value' => t('@message', array('@message' => $submit_text_message)), + ); + + return $form; +} + +/** + * Submit handler for object deletion form in the collection manager. + * + * @global type $user + * @param array $form + * @param array $form_state + */ +function islandora_collection_deletion_form_submit($form, &$form_state) { + global $user; + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + + $collection_pid = $form_state['values']['current']; + $fedora_object = new FedoraObject($collection_pid, $rest_connection->repository); + $parents = $fedora_object->relationships->get(NULL, 'isMemberOfCollection'); + $parents = Islandora_collections_get_collection_from_pid($collection_pid); + $collection_pid = $form_state['values']['current']; + if (isset($form_state['values']['delete_root']) && $form_state['values']['delete_root'] == 1) { + delete_root_collection($collection_pid); + drupal_goto("islandora/object/" . $parents[0]['parent']['value']); + } + + $child_collections = get_child_collections($collection_pid); + + $populated_child_collections = array(); + $pids = @array_filter($form_state['values']['table']); + + if (!empty($child_collections)) { + foreach ($child_collections as $child) { + $child_pids = get_related_items_as_array($child, 'isMemberOfCollection'); + if (!empty($child_pids)) { + $populated_child_collections[] = $child; + } + } + } + if (!empty($populated_child_collections)) { + $conflict = FALSE; + foreach ($populated_child_collections as $collection) { + if (in_array($collection, $pids)) { + $conflict = TRUE; + drupal_set_message(t("Populated child collections were not deleted.")); + } + } + } + $pids_to_delete = array_diff($pids, $populated_child_collections); + + foreach ($pids_to_delete as $pid_to_delete) { + $rest_connection->repository->purgeObject($pid_to_delete); + } + drupal_goto("islandora/object/" . $collection_pid); +} + +/** + * Deletes the collection object + * + * @param string $pid + */ +function delete_root_collection($pid) { + module_load_include('inc', 'islandora', 'RestConnection'); + try { + $rest_connection = new RestConnection(); + $rest_connection->repository->purgeObject($pid); + } catch (Exception $e) { + drupal_set_message(t("Collection '@pid' could not be deleted!", array('@pid' => $pid)), 'error'); + return; + } + drupal_set_message(t("Collection '@pid' deleted.", array('@pid' => $pid))); +} diff --git a/islandora_basic_collection/includes/manage_policies.inc b/islandora_basic_collection/includes/manage_policies.inc new file mode 100644 index 00000000..3b6572c9 --- /dev/null +++ b/islandora_basic_collection/includes/manage_policies.inc @@ -0,0 +1,223 @@ +repository); + $cm_name = $item->Label; + $cm_options[$content_model] = $cm_name; + } + } + + $namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); + + $collection_policy_dsid = variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'); + $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); + $collection_policy_string = $collection_object->getDatastream($collection_policy_dsid); + + $supported_collection_models = array(); + if ($collection_policy_string) { + $collection_policy = new CollectionPolicy($collection_policy_string->content); + $supported_collection_models = $collection_policy->getContentModels(); + } + + $collection_namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); + + $represented_content_models = get_represented_content_models($collection_pid); + $collection_name = $collection_object->label; + $new_content_models = get_content_models_as_option_array(); + $current_models_in_policy = array(); + + if ($supported_collection_models) { + foreach ($supported_collection_models as $supported_model) { + $current_models_in_policy[$supported_model['pid']] = $supported_model['pid']; + } + } + + $new_options = array(); + if (is_array($new_content_models) && is_array($current_models_in_policy)) { + $new_options = array_diff_key($new_content_models, $current_models_in_policy); + } + + $s = ''; + if (count($current_models_in_policy) > 1) { + $s = 's'; + } + + $form['manage_collection_policy']['titlebox'] = array( + '#type' => 'item', + '#title' => t("Manage collection policy for @collection_pid", array('@collection_pid' => $collection_pid)), + ); + + $form ['manage_collection_policy']['add']['content_model_to_add'] = array( + '#title' => "Choose content model", + '#type' => 'select', + '#options' => $new_options, + '#description' => t("Choose content model to add to this collection policy."), + ); + + $form ['manage_collection_policy']['add']['new_cp_namespace'] = array( + '#title' => "Choose namespace", + '#type' => 'textfield', + '#size' => 15, + '#default_value' => $namespace, + '#description' => t("Choose namespace for objects in this collection associated with this content model"), + ); + + $form['parent_collection'] = array( + '#type' => 'hidden', + '#value' => $collection_pid, + ); + + $form['collection_pid'] = array( + '#type' => 'hidden', + '#value' => $collection_pid, + ); + + $form['manage_collection_policy']['add']['submit'] = array( + '#type' => 'submit', + '#value' => t('Add content model to collection policy'), + '#id' => 'add_cm' + ); + + if (count($current_models_in_policy) > 0) { + $form['manage_collection_policy']['remove'] = array( + '#title' => "Delete content model from collection policy", + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + + $form ['manage_collection_policy']['remove']['content_models_to_remove'] = array( + '#title' => "Choose content model to remove", + '#type' => 'checkboxes', + '#options' => $current_models_in_policy, + '#description' => t("Choose content models to remove from this collection policy."), + ); + + $form['manage_collection_policy']['remove']['submit'] = array( + '#type' => 'submit', + '#value' => t('Remove content model@s from collection policy', array('@s' => $s)), + '#id' => 'remove_cm' + ); + } + return $form; +} + +function islandora_manage_policies_form_validate($form, &$form_state) { + +} + +/** + * Submit handler for collection policy management form + * + * @param array $form + * @param array $form_state + */ +function islandora_manage_policies_form_submit($form, &$form_state) { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + + $collection_pid = $form_state['values']['parent_collection']; + $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); + $policy = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); + $collection_policy = ' + + + + + + + + isMemberOfCollection +'; + + $collection_policy_xml = new DOMDocument(); + $collection_policy_xml->loadXML($policy->content); + + if ($form_state['clicked_button']['#id'] == 'add_cm') { + if (empty($policy->content)) { + $collection_policy_datastream = $collection_object->constructDatastream('COLLECTION_POLICY', 'X'); + $collection_policy_datastream->setContentFromString($collection_policy); + $collection_policy_datastream->label = 'COLLECTION_POLICY'; + $collection_object->ingestDatastream($collection_policy_datastream); + $policy = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); + } + + $cp_namespace = $form_state['values']['new_cp_namespace']; + $cp_content_model = $form_state['values']['content_model_to_add']; + $content_model_object = new FedoraObject($cp_content_model, $rest_connection->repository); + $content_model_datastream = $content_model_object->getDatastream(variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + + $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); + $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); + + $content_model_element = $collection_policy_xml->createElement('content_model'); + $content_model_element->setAttribute('name', $content_model_object->label); + $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); + $content_model_element->setAttribute('namespace', $cp_namespace); + $content_model_element->setAttribute('pid', $content_model_object->id); + $content_models_element->item(0)->appendChild($content_model_element); + + $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); + $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); + $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; + $collection_object->ingestDatastream($new_collection_policy_datastream); + drupal_set_message(t("Collection model @model successfully added", array('@model' => $content_model_object->label))); + } + + //remove content model from collection policy + if ($form_state['clicked_button']['#id'] == 'remove_cm') { + $candidates = $form_state['values']['content_models_to_remove']; + $count = 0; + $s = ''; + foreach ($candidates as $candidate) { + if (is_string($candidate)) { + $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); + $models = $content_models_element->item(0)->getElementsByTagName('content_model'); + $found = FALSE; + for ($i = 0; $found === FALSE && $i < $models->length; $i++) { + if ($models->item($i)->getAttribute('pid') == $candidate) { + $found = $models->item($i); + } + } + + if ($found !== FALSE && $models->length > 0) { + $content_models_element->item(0)->removeChild($found); + $ret = TRUE; + } + $count++; + } + } + if ($count > 0) { + $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); + $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); + $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; + $collection_object->ingestDatastream($new_collection_policy_datastream); + if ($count > 1) { + $s = 's'; + } + drupal_set_message(t("$count collection model@s removed", array('@s' => $s))); + } + } +} \ No newline at end of file diff --git a/islandora_basic_collection/includes/move_collection.inc b/islandora_basic_collection/includes/move_collection.inc new file mode 100644 index 00000000..7f6a2d6f --- /dev/null +++ b/islandora_basic_collection/includes/move_collection.inc @@ -0,0 +1,78 @@ + 'item', + '#title' => t('No objects found in this collection'), + ); + return $form; + } + $form = array(); + + $form['migrate']['titlebox'] = array( + '#type' => 'item', + '#title' => t("Move objects from @collection_pid", array('@collection_pid' => $pid)), + ); + + $form['migrate']['new_collection'] = array( + '#title' => t('New collection'), + '#description' => t("All content will be migrated from @pid to the selected collection", array('@pid' => $pid)), + '#type' => 'select', + '#options' => $potential_collections, + ); + + $form['migrate']['table'] = $table; + + $form['current'] = array( + '#type' => 'hidden', + '#value' => $pid, + ); + + $form['migrate']['message'] = array( + '#type' => 'item', + '#value' => t(""), + ); + + $form['migrate']['submit'] = array( + '#type' => 'submit', + '#value' => t('Migrate selected objects'), + ); + return $form; +} + +/** + * Submit handler for object migration form + * + * @param array $form + * @param array $form_state + */ +function islandora_collection_migrate_form_submit($form, &$form_state) { + module_load_include('inc', 'islandora', 'RestConnection'); + $rest_connection = new RestConnection(); + + $pids = array_filter($form_state['values']['table']); + $new_collection = $form_state['values']['new_collection']; + $current = $form_state['values']['current']; + foreach ($pids as $pid) { + $fedora_object = new FedoraObject($pid, $rest_connection->repository); + $fedora_object->relationships->remove(FEDORA_RELS_EXT_URI, 'isMemberOfCollection', $current); + $fedora_object->relationships->add(FEDORA_RELS_EXT_URI, 'isMemberOfCollection', $new_collection); + } +} \ No newline at end of file diff --git a/islandora_basic_collection/islandora_basic_collection.module b/islandora_basic_collection/islandora_basic_collection.module index 4314de6a..f5ccf59c 100644 --- a/islandora_basic_collection/islandora_basic_collection.module +++ b/islandora_basic_collection/islandora_basic_collection.module @@ -88,13 +88,13 @@ function islandora_basic_collection_menu_local_tasks_alter(&$data, $router_item, */ function islandora_basic_collection_manage_object($object_id) { - module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionManagement'); - module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionManagerTable'); - module_load_include('inc', 'islandora_basic_collection', 'includes/DeleteCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/MoveCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ChildCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ManagePolicies'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ChangeContentModels'); + module_load_include('inc', 'islandora_basic_collection', 'includes/collection_management'); + module_load_include('inc', 'islandora_basic_collection', 'includes/collection_manager_table'); + module_load_include('inc', 'islandora_basic_collection', 'includes/delete_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/move_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/child_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/manage_policies'); + module_load_include('inc', 'islandora_basic_collection', 'includes/change_content_models'); $form = array(); @@ -200,15 +200,11 @@ function islandora_basic_collection_theme($existing, $type, $theme, $path) { 'islandora_basic_collection_grid' => array( 'template' => 'islandora-basic-collection-grid', 'pattern' => 'islandora_basic_collection_grid__', - 'variables' => array('islandora_object' => NULL, 'collection_results' => NULL), - ), - 'islandora_basic_collection_wrapper' => array( - 'template' => 'islandora-basic-collection-wrapper', 'variables' => array('islandora_object' => NULL), ), 'islandora_basic_collection_management_form_table' => array( 'arguments' => array('element' => NULL), - 'file' => 'includes/CollectionManagerTable.inc', + 'file' => 'includes/collection_manager_table.inc', ), ); } @@ -246,7 +242,13 @@ function islandora_basic_collection_islandora_view_object($object, $user) { $models = $object->models; foreach ($object->models as $model) { if (isset($cmodel_list[$model][ISLANDORA_VIEW_HOOK]) && $cmodel_list[$model][ISLANDORA_VIEW_HOOK] == TRUE) { - $output = theme('islandora_basic_collection_wrapper', array('islandora_object' => $object,)); + $display = (empty($_GET['display'])) ? 'list' : $_GET['display']; + if ($display == 'grid') { + $output = theme('islandora_basic_collection_grid', array('islandora_object' => $object)); + } + else { + $output = theme('islandora_basic_collection', array('islandora_object' => $object)); + } return array('Collection View' => $output); } } @@ -262,24 +264,6 @@ function islandora_basic_collection_preprocess_islandora_basic_collection_grid(& islandora_basic_collection_preprocess_islandora_basic_collection($variables); } -function islandora_basic_collection_preprocess_islandora_basic_collection_wrapper(&$variables) { - $page_number = (empty($_GET['page'])) ? 0 : $_GET['page']; - $page_size = (empty($_GET['pagesize'])) ? variable_get('islandora_basic_collection_page_size', '10') : $_GET['pagesize']; - $islandora_object = $variables['islandora_object']; - $results = islandora_basic_collection_get_objects($islandora_object, $page_number, $page_size); - $total_count = count($results); - pager_default_initialize($total_count, $page_size); - $variables['collection_pager'] = theme('pager', array('quantity' => $total_count)); - $display = (empty($_GET['display'])) ? 'list' : $_GET['display']; - if ($display == 'grid') { - $collection_content = theme('islandora_basic_collection_grid', array('islandora_object' => $islandora_object, 'collection_results' => $results)); - } - else { - $collection_content = theme('islandora_basic_collection', array('islandora_object' => $islandora_object, 'collection_results' => $results)); - } - $variables['collection_content'] = $collection_content; -} - /** * * @global type $base_url @@ -301,8 +285,12 @@ function islandora_basic_collection_preprocess_islandora_basic_collection(&$vari } $page_number = (empty($_GET['page'])) ? 0 : $_GET['page']; $page_size = (empty($_GET['pagesize'])) ? variable_get('islandora_basic_collection_page_size', '10') : $_GET['pagesize']; - $results = $variables['collection_results'];//islandora_basic_collection_get_objects($islandora_object, $page_number, $page_size); + $results = islandora_basic_collection_get_objects($islandora_object, $page_number, $page_size); $total_count = count($results); + pager_default_initialize($total_count, $page_size); + + $pager = theme('pager', array('quantity' => $total_count)); + $variables['pager'] = $pager; $variables['islandora_dublin_core'] = $dc_object; $variables['islandora_object_label'] = $islandora_object->label; $variables['theme_hook_suggestions'][] = 'islandora_basic_collection__' . str_replace(':', '_', $islandora_object->id); @@ -348,7 +336,6 @@ function islandora_basic_collection_preprocess_islandora_basic_collection(&$vari $thumbnail_img = ''; } else { - //TODO: change this default image url $thumbnail_img = ''; } $associated_objects_array[$pid]['thumbnail'] = $thumbnail_img; From 539e99bb7167579724c3dbb25700af83b2fddc41 Mon Sep 17 00:00:00 2001 From: Paul Pound Date: Thu, 31 May 2012 15:14:55 -0300 Subject: [PATCH 2/7] added init functions to load admin css for each module --- islandora.module | 6 ++++ .../islandora_basic_collection.module | 28 +++++++++++-------- .../islandora_basic_image.module | 6 ++++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/islandora.module b/islandora.module index 20ddced2..a5028fb1 100644 --- a/islandora.module +++ b/islandora.module @@ -351,6 +351,12 @@ function islandora_get_types() { return module_invoke_all('islandora_get_types'); } +function islandora_init() { + if (path_is_admin(current_path())) { + drupal_add_css(drupal_get_path('module', 'islandora') . '/css/islandora.admin.css'); + } +} + /** * a function to call other modules edit page. If there are not any modules * that handle this function this module will build a default page. diff --git a/islandora_basic_collection/islandora_basic_collection.module b/islandora_basic_collection/islandora_basic_collection.module index 8d14a042..83ebfe24 100644 --- a/islandora_basic_collection/islandora_basic_collection.module +++ b/islandora_basic_collection/islandora_basic_collection.module @@ -61,22 +61,28 @@ function islandora_basic_collection_menu() { return $items; } +function islandora_basic_collection_init() { + if (path_is_admin(current_path())) { + drupal_add_css(drupal_get_path('module', 'islandora_basic_collection') . '/css/islandora_basic_collection.admin.css'); + } +} + /** * Implements hook_menu_local_tasks_alter(). */ function islandora_basic_collection_menu_local_tasks_alter(&$data, $router_item, $root_path) { - // Add action link - if ($root_path == 'islandora/object/%/manage/collection') { - $object_id = $router_item['page_arguments'][0]; - $item = menu_get_item("islandora/ingest/$object_id"); - $item['title'] = 'Add a repository item'; - if ($item['access']) { - $data['actions']['output'][] = array( - '#theme' => 'menu_local_action', - '#link' => $item, - ); - } + // Add action link + if ($root_path == 'islandora/object/%/manage/collection') { + $object_id = $router_item['page_arguments'][0]; + $item = menu_get_item("islandora/ingest/$object_id"); + $item['title'] = 'Add a repository item'; + if ($item['access']) { + $data['actions']['output'][] = array( + '#theme' => 'menu_local_action', + '#link' => $item, + ); } + } } /** diff --git a/islandora_basic_image/islandora_basic_image.module b/islandora_basic_image/islandora_basic_image.module index 890767c9..47eaeea2 100644 --- a/islandora_basic_image/islandora_basic_image.module +++ b/islandora_basic_image/islandora_basic_image.module @@ -132,6 +132,12 @@ function islandora_basic_image_access($object_id) { return FALSE; } +function islandora_basic_image_init() { + if (path_is_admin(current_path())) { + drupal_add_css(drupal_get_path('module', 'islandora_basic_image') . '/css/islandora_basic_image.admin.css'); + } +} + /** * Theme registry function * We supply a pattern so we can overide templates at the theme level if needed. From 78f38ea6a8b568f4fe42cdf79eb02c8ef7d3b68e Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 15:18:04 -0300 Subject: [PATCH 3/7] Changed names of includes files for collection management so they're less ambiguous --- .../islandora_basic_collection.module | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/islandora_basic_collection/islandora_basic_collection.module b/islandora_basic_collection/islandora_basic_collection.module index 8d14a042..40465616 100644 --- a/islandora_basic_collection/islandora_basic_collection.module +++ b/islandora_basic_collection/islandora_basic_collection.module @@ -86,13 +86,13 @@ function islandora_basic_collection_menu_local_tasks_alter(&$data, $router_item, */ function islandora_basic_collection_manage_object($object_id) { - module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionManagement'); - module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionManagerTable'); - module_load_include('inc', 'islandora_basic_collection', 'includes/DeleteCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/MoveCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ChildCollection'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ManagePolicies'); - module_load_include('inc', 'islandora_basic_collection', 'includes/ChangeContentModels'); + module_load_include('inc', 'islandora_basic_collection', 'includes/collection_management'); + module_load_include('inc', 'islandora_basic_collection', 'includes/collection_manager_table'); + module_load_include('inc', 'islandora_basic_collection', 'includes/delete_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/move_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/child_collection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/manage_policies'); + module_load_include('inc', 'islandora_basic_collection', 'includes/change_content_models'); $form = array(); @@ -210,7 +210,7 @@ function islandora_basic_collection_theme($existing, $type, $theme, $path) { 'islandora_basic_collection_management_form_table' => array( 'file' => 'theme/islandora_basic_collection.theme.inc', 'arguments' => array('element' => NULL), - 'file' => 'includes/CollectionManagerTable.inc', + 'file' => 'includes/collection_manager_table.inc', ), ); } From 25167c6cc9c82f8a9bcabfacc1fcc76b91c287e1 Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 15:21:34 -0300 Subject: [PATCH 4/7] Removed duplicate files that had been renamed --- .../includes/ChangeContentModels.inc | 150 ----------- .../includes/ChildCollection.inc | 159 ------------ .../includes/CollectionManagement.inc | 241 ------------------ .../includes/CollectionManagerTable.inc | 117 --------- .../includes/DeleteCollection.inc | 126 --------- .../includes/ManagePolicies.inc | 217 ---------------- .../includes/MoveCollection.inc | 78 ------ 7 files changed, 1088 deletions(-) delete mode 100644 islandora_basic_collection/includes/ChangeContentModels.inc delete mode 100644 islandora_basic_collection/includes/ChildCollection.inc delete mode 100644 islandora_basic_collection/includes/CollectionManagement.inc delete mode 100644 islandora_basic_collection/includes/CollectionManagerTable.inc delete mode 100644 islandora_basic_collection/includes/DeleteCollection.inc delete mode 100644 islandora_basic_collection/includes/ManagePolicies.inc delete mode 100644 islandora_basic_collection/includes/MoveCollection.inc diff --git a/islandora_basic_collection/includes/ChangeContentModels.inc b/islandora_basic_collection/includes/ChangeContentModels.inc deleted file mode 100644 index 6ae8b9b2..00000000 --- a/islandora_basic_collection/includes/ChangeContentModels.inc +++ /dev/null @@ -1,150 +0,0 @@ -repository); - $cm_name = $item->Label; - $cm_options[$content_model] = $cm_name; - } - } - - $namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); - - $collection_policy_dsid = variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'); - $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); - $collection_policy_datastream = $collection_object->getDatastream($collection_policy_dsid); - - $supported_collection_models = array(); - if ($collection_policy_datastream && $collection_policy_datastream->content) { - $collection_policy = new CollectionPolicy($collection_policy_datastream->content); - $supported_collection_models = $collection_policy->getContentModels(); - } - $collection_namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); - - $collection_name = $collection_object->label; - $new_content_models = get_content_models_as_option_array(); - $current_models_in_policy = array(); - - if ($supported_collection_models) { - foreach ($supported_collection_models as $supported_model) { - $current_models_in_policy[$supported_model['pid']] = $supported_model['pid']; - } - } - - $form['change_cmodel']['titlebox'] = array( - '#type' => 'item', - '#title' => t("Change content models within @collection_pid", array('@collection_pid' => $collection_pid)), - ); - - $form['change_cmodel']['current_content_model'] = array( - '#title' => "Choose content model to be changed", - '#type' => 'select', - '#options' => $current_models_in_policy, - '#description' => t("All objects in this collection with the selected content model will be changed."), - ); - - $form['change_cmodel']['new_content_model'] = array( - '#title' => "Choose new content model", - '#type' => 'select', - '#options' => $new_content_models, - '#description' => t("The new content model to be assigned to selected objects."), - ); - - $form['change_cmodel']['collection_pid'] = array( - '#type' => 'hidden', - '#value' => $collection_pid, - ); - - $form['change_cmodel']['submit'] = array( - '#type' => 'submit', - '#value' => t('Change content model associations'), - '#id' => 'change_model', - ); - - return $form; -} - -function islandora_change_content_models_form_validate($form, &$form_state) { - -} - -function islandora_change_content_models_form_submit($form, &$form_state) { - module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionPolicy'); - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - - $current_content_model = $form_state['values']['current_content_model']; - $new_content_model = $form_state['values']['new_content_model']; - $collection_pid = $form_state['values']['collection_pid']; - - $current_content_model_object = new FedoraObject($current_content_model, $rest_connection->repository); - - $collection_object = new FedoraObject($form_state['values']['collection_pid'], $rest_connection->repository); - $collection_policy_datastream = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); - $policy = new CollectionPolicy($collection_policy_datastream->content); - - $collection_policy_xml = new DOMDocument(); - $collection_policy_xml->loadXML($collection_policy_datastream->content); - - $add_to_policy = TRUE; - $policy_content_models = $policy->getContentModels(); - foreach ($policy_content_models as $policy_content_model) { - if ($policy_content_model['pid'] == $current_content_model) { - $namespace = $policy_content_model['namespace']; - } - if ($policy_content_model['pid'] == $new_content_model) { - $add_to_policy = FALSE; - } - } - if ($add_to_policy) { - $new_content_model_object = new FedoraObject($new_content_model, $rest_connection->repository); - $new_content_model_datastream = $new_content_model_object->getDatastream(variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); - $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); - $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); - - $content_model_element = $collection_policy_xml->createElement('content_model'); - $content_model_element->setAttribute('name', $new_content_model_object->label); - $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); - $content_model_element->setAttribute('namespace', $namespace); - $content_model_element->setAttribute('pid', $new_content_model_object->id); - $content_models_element->item(0)->appendChild($content_model_element); - - $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); - $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); - $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; - $collection_object->ingestDatastream($new_collection_policy_datastream); - } - - $query = "select \$object from <#ri> - where (\$object - and (\$object - or \$object ) - and \$object )"; - - $objects = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - - $count = 0; - foreach ($objects as $object) { - if (!$object['object']['value']) { - continue; - } - $fedora_item = new FedoraObject($object['object']['value'], $rest_connection->repository); - $fedora_item->relationships->remove(FEDORA_MODEL_URI, 'hasModel', $current_content_model); - $fedora_item->relationships->add(FEDORA_MODEL_URI, 'hasModel', $new_content_model); - $count++; - } - drupal_set_message(t('@current_content_model changed to @new_content_model on @count objects', array('@current_content_model' => $current_content_model, '@new_content_model' => $new_content_model, '@count' => $count))); -} \ No newline at end of file diff --git a/islandora_basic_collection/includes/ChildCollection.inc b/islandora_basic_collection/includes/ChildCollection.inc deleted file mode 100644 index 492d7ff1..00000000 --- a/islandora_basic_collection/includes/ChildCollection.inc +++ /dev/null @@ -1,159 +0,0 @@ - 'item', - '#title' => t("Create new child collection within @collection", array('@collection' => $this_collection_pid)), - ); - - $form['child_creation']['collection_name'] = array( - '#title' => "Collection name", - '#type' => 'textfield', - '#size' => 25, - '#description' => t("Human readable name for this collection"), - ); - - $form['child_creation']['new_collection_pid'] = array( - '#title' => "Collection PID", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => $rest_connection->repository->api->m->getNextPid($collection_namespace), - '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection (eg. islandora:pamphlets)"), - ); - - if (!$restricted) { - $form['child_creation']['collection_namespace'] = array( - '#title' => "Collection namespace", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => $collection_namespace, - '#description' => t("Namespace for objects in this collection."), - ); - } - else { - $form['child_creation']['collection_namespace'] = array( - '#title' => "Collection namespace", - '#type' => 'select', - '#options' => $allowed, - '#default_value' => 'default', - '#description' => t("Namespace for objects in this collection."), - ); - } - - $form['current'] = array( - '#type' => 'hidden', - '#value' => $this_collection_pid, - ); - - $form['child_creation']['content_models'] = array( - '#title' => "Choose allowable content models for this collection", - '#type' => 'checkboxes', - '#options' => $content_models, - '#description' => t("Content models describe the behaviours of objects with which they are associated."), - ); - - $form['child_creation']['submit'] = array( - '#type' => 'submit', - '#value' => t('Create collection'), - '#id' => 'create_child' - ); - return $form; -} - -function islandora_create_child_collection_form_validate($form, &$form_state) { - -} - -/** - * Submit handler for child collection creation form - * - * @global type $base_url - * @param array $form - * @param array $form_state - */ -function islandora_create_child_collection_form_submit($form, &$form_state) { - global $base_url; - module_load_include('inc', 'islandora', '/includes/islandora.ingest'); - $thumbnail = $base_url . '/' . drupal_get_path('module', 'islandora_basic_collection') . '/Crystal_Clear_filesystem_folder_grey.png'; - $new_collection_pid = $form_state['values']['new_collection_pid']; - $new_collection_label = $form_state['values']['collection_name']; - $namespace = $form_state['values']['collection_namespace']; - $all_cModels = get_content_models_as_option_array(); - $collection_content_models = array(array('pid' => 'islandora:collectionCModel')); - $relationship = 'isMemberOfCollection'; - - $collection_policy = ' - - - - - - - - isMemberOfCollection -'; - - $content_models = $form_state['values']['content_models']; - - $collection_policy_xml = new DOMDocument(); - $collection_policy_xml->loadXML($collection_policy); - - $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); - $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); - foreach ($content_models as $content_model) { - if ($content_model) { - $content_model_element = $collection_policy_xml->createElement('content_model'); - $content_model_element->setAttribute('name', $all_cModels[$content_model]); - $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); - $content_model_element->setAttribute('namespace', $namespace . ':1'); - $content_model_element->setAttribute('pid', $content_model); - $content_models_element->item(0)->appendChild($content_model_element); - } - } - $fedora_object = islandora_ingest_get_object($collection_content_models, $form_state['values']['current'], $relationship, $new_collection_pid); - $fedora_object->label = $new_collection_label; - $thumbnail_datastream = $fedora_object->constructDatastream('TN'); - $thumbnail_datastream->setContentFromUrl($thumbnail); - $thumbnail_datastream->label = 'Thumbnail'; - $thumbnail_datastream->mimetype = 'image/png'; - $fedora_object->ingestDatastream($thumbnail_datastream); - $policy_datastream = $fedora_object->constructDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'), 'X'); - $policy_datastream->setContentFromString($collection_policy_xml->saveXML()); - $policy_datastream->label = 'Collection policy'; - $fedora_object->ingestDatastream($policy_datastream); - $new_fedora_object = islandora_ingest_add_object($fedora_object); - - drupal_goto('/islandora/object/' . $new_collection_pid); -} \ No newline at end of file diff --git a/islandora_basic_collection/includes/CollectionManagement.inc b/islandora_basic_collection/includes/CollectionManagement.inc deleted file mode 100644 index 1df57e28..00000000 --- a/islandora_basic_collection/includes/CollectionManagement.inc +++ /dev/null @@ -1,241 +0,0 @@ - -where (\$object - or \$object ) - and \$object \$model - and \$object \$title"; - - $model_pids = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - $represented_models = array(); - foreach ($model_pids as $model_pid) { - - if ($model_pid['model']['value'] && $model_pid['model']['value'] != 'fedora-system:FedoraObject-3.0') { - $fedora_object = new FedoraObject($model_pid['model']['value'], $rest_connection->repository); - $content_model_title = $fedora_object->label; - $represented_models[$model_pid['model']['value']] = $model_pid['model']['value'] . ' ~ ' . $content_model_title; - } - } - return $represented_models; -} - -function get_child_collections($collection_pid) { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - - $query = << - where \$object - and \$object -EOD; - - $lines = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - $collection_pids = array_values(array_filter($lines)); - return $collection_pids; -} - -function islandora_collections_get_collection_from_pid($pid) { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - - $query = 'select $parent from <#ri> - where ($object $parent - or $object $parent) - and $object \'' . $pid . '\' - order by $object'; - - $object_pids = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - $object_pids = array_values(array_filter($object_pids)); - return $object_pids; -} - - -/** - * Returns an array of pids that match the query contained in the collection - * object's QUERY datastream or in the suppled $query parameter. - * @param $collection_pid - * @param $query - * @param $query_format R - */ -function get_related_items_as_array($collection_pid, $relationship = array('isMemberOfCollection'), $limit = 10000, $offset = 0, $active_objects_only = TRUE, $cmodel = NULL, $orderby = '$title') { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - - global $user; - -// Not sure if this is necessary given that we should never be able to delete objects in a namespace that we don't have access to. -// if (!fedora_repository_access('view fedora repository', $collection_pid['object']['value'])) { -// drupal_set_message(t("You do not have access to Fedora objects within the attempted namespace or access to Fedora denied."), 'error'); -// return array(); -// } - - $query_string = 'select $object $title $content from <#ri> - where ($object $title - and $object $content - and ('; - - if (is_array($relationship)) { - foreach ($relationship as $rel) { - $query_string .= '$object '; - if (next($relationship)) { - $query_string .= ' OR '; - } - } - } - elseif (is_string($relationship)) { - $query_string .= '$object '; - } - else { - return ''; - } - - $query_string .= ') '; - $query_string .= $active_objects_only ? 'and $object ' : ''; - - if ($cmodel) { - $query_string .= ' and $content '; - } - - $query_string .= ') - minus $content - order by ' . $orderby; - - $results = $rest_connection->repository->ri->itqlQuery($query_string, $limit, $offset); - - return $results; -} - - - /** - * determines whether we can see the object or not - * checks PID namespace permissions, and user permissions - * @global type $user - * @param type $op - * @param type $pid - * @return type - */ - function fedora_repository_access($permission, $pid) { - global $user; - $name_space_access = FALSE; - $is_restricted = variable_get('islandora_namespace_restriction_enforced', TRUE); - if (!$is_restricted) { - $name_space_access = TRUE; - } - if ($pid == NULL) { - $pid = variable_get('islandora_repository_pid', 'islandora:root'); - } - $name_space_allowed = explode(" ", variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora: ilives: islandora-book: books: newspapers: ')); - $pos = NULL; - foreach ($name_space_allowed as $name_space) { - $pos = stripos($pid, $name_space); - if ($pos === 0) { - $name_space_access = TRUE; - } - } - if ($name_space_access) { - $user_access = user_access($permission); - if ($user_access == NULL) { - return FALSE; - } - return $user_access; - } - else { - return FALSE; - } - } - - /** - * gets the name of the content models for the specified object - * this now returns an array of pids as in Fedora 3 we can have more then one Cmodel for an object - * @param type $pid - * @param type $include_fedora_system_content_models - * @return array - */ - function get_content_models_list($pid, $include_fedora_system_content_models = FALSE) { - - module_load_include('inc', 'islandora', 'RestConnection'); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - $rest_connection = new RestConnection(); - $pids = array(); - $query = 'select $object from <#ri> - where $object - and $object '; - $content_models = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - - if (empty($content_models)) { - return $pids; - } - - $cmodels = array(); - foreach ($content_models as $content_model) { - if (strpos($content_model['object']['uri'], 'fedora-system:FedoraObject-3.0') != FALSE && $include_fedora_system_content_models == FALSE) { - continue; - } - $cmodels[] = substr(strstr($content_model['object']['uri'], '/'), 1); - } - - return $cmodels; - } - - /** - * Function: get_content_models_as_option_array - * - * Description: Returns an associative array of all available content models in Fedora instance - * - * @return array - */ -function get_content_models_as_option_array() { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - - $restricted = variable_get('fedora_namespace_restriction_enforced', TRUE); - $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); - $namespaces = explode(':', $allowed_string); - foreach ($namespaces as $namespace) { - if ($namespace) { - $allowed[] = trim($namespace); - } - } - $query = 'select $object $title from <#ri> - where ($object $title - and ($object - or $object ) - and $object ) - order by $title'; - - $list = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - $options = array(); - foreach ($list as $item) { //removes blanks - if ($item) { - $item_namespace = explode(':', $item['object']['value']); - if (!$restricted || in_array($item_namespace[0], $allowed)) { - - if (!preg_match('/fedora-system/', $item['object']['value'])) { - $options[$item['object']['value']] = $item['title']['value'] . ' ~ ' . $item['object']['value']; - } - } - } - } - - return $options; -} \ No newline at end of file diff --git a/islandora_basic_collection/includes/CollectionManagerTable.inc b/islandora_basic_collection/includes/CollectionManagerTable.inc deleted file mode 100644 index 7172652c..00000000 --- a/islandora_basic_collection/includes/CollectionManagerTable.inc +++ /dev/null @@ -1,117 +0,0 @@ - - where ($object - or $object ) - and $object $title'; - $results = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - $keys = array(); - $objects = array(); - foreach ($results as $result) { - $objects[$result['object']['value']] = $result['title']['value']; - $keys[] = $result['object']['value']; - } - $rows = array(); - foreach ($objects as $key => $object) { - $rows[$key] = array( - '#pid' => $key, - 'pid' => array('#value' => l($key, 'islandora/object/' . $key)), - 'title' => array( - 'data' => array( - '#type' => 'link', - '#title' => $object, - '#href' => 'islandora/object/' . $key, - ), - ), - ); - } - - $header = array( - 'title' => array('data' => t('Title')), - ); - - if (!$rows) { - return; - } - - $table = array( - '#type' => 'tableselect', - '#header' => $header, - '#options' => $rows, - ); - - return $table; - -} - -/** - * themes the form table. - * - * @param array $element Drupal Form Element. - * @return string - */ -function theme_islandora_basic_collection_management_form_table(array $element) { - $rows = array(); - foreach (element_children($element['rows']) as $child) { - $setting = $element['rows'][$child]; - $pid = $setting['#pid']; - $fields = array( - drupal_render($element['selections'][$pid]) // First field is a checkbox - ); - foreach (element_children($setting) as $property) { - $field = $setting[$property]; - $fields[] = drupal_render($field); - } - $rows[] = array( - 'data' => $fields, - 'class' => isset($setting['#attributes']['class']) ? $setting['#attributes']['class'] : NULL - ); - } - $attributes = isset($element['#id']) ? array('id' => $element['#id']) : NULL; - return theme_table($element['#header'], $rows, $attributes); -} - -function get_collections_as_option_array() { - module_load_include('inc', 'islandora', 'RestConnection'); - require_once 'sites/all/libraries/tuque/RepositoryQuery.php'; - - $restricted = variable_get('fedora_namespace_restriction_enforced', TRUE); - $allowed_string = variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora:'); - $namespaces = explode(':', $allowed_string); - - $rest_connection = new RestConnection(); - $query = 'select $object $title from <#ri> - where ($object $title - and $object - and $object ) - order by $title'; - $results = $rest_connection->repository->ri->itqlQuery($query, 'unlimited', '0'); - foreach ($namespaces as $namespace) { - $trimmed_names[] = trim($namespace); - } - $options = array(); - foreach ($results as $item) { //removes blanks - $namespace = explode(':', $item['object']['value']); - $namespace = trim($namespace[0]); - if (!$restricted || in_array($namespace, $trimmed_names)) { - $options[$item['object']['value']] = $item['title']['value']; - } - } - unset($options['islandora:ContentModelCollection']); - return $options; -} \ No newline at end of file diff --git a/islandora_basic_collection/includes/DeleteCollection.inc b/islandora_basic_collection/includes/DeleteCollection.inc deleted file mode 100644 index 990f84fd..00000000 --- a/islandora_basic_collection/includes/DeleteCollection.inc +++ /dev/null @@ -1,126 +0,0 @@ - 'item', - '#title' => t("Delete objects from @collection_pid", array('@collection_pid' => $pid)), - ); - - if ($table) { - $form['collection_delete']['table'] = array( - 'table' => $table, - ); - } - else { - $form['collection_delete']['delete_root'] = array( - '#type' => 'checkbox', - '#title' => "Remove this empty collection?", - '#id' => 'delete_collection', - ); - } - $form['current'] = array( - '#type' => 'hidden', - '#value' => $pid, - ); - - $form['collection_delete']['message'] = array( - '#type' => 'item', - '#value' => t("This action is permanant and cannot be undone."), - ); - $form['collection_delete']['submit'] = array( - '#type' => 'submit', - '#description' => t("This action is permanant and cannot be undone."), - '#value' => t('@message', array('@message' => $submit_text_message)), - ); - - return $form; -} - -/** - * Submit handler for object deletion form in the collection manager. - * - * @global type $user - * @param array $form - * @param array $form_state - */ -function islandora_collection_deletion_form_submit($form, &$form_state) { - global $user; - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - - $collection_pid = $form_state['values']['current']; - $fedora_object = new FedoraObject($collection_pid, $rest_connection->repository); - $parents = $fedora_object->relationships->get(NULL, 'isMemberOfCollection'); - $parents = Islandora_collections_get_collection_from_pid($collection_pid); - $collection_pid = $form_state['values']['current']; - if (isset($form_state['values']['delete_root']) && $form_state['values']['delete_root'] == 1) { - delete_root_collection($collection_pid); - drupal_goto("islandora/object/" . $parents[0]['parent']['value']); - } - - $child_collections = get_child_collections($collection_pid); - - $populated_child_collections = array(); - $pids = @array_filter($form_state['values']['table']); - - if (!empty($child_collections)) { - foreach ($child_collections as $child) { - $child_pids = get_related_items_as_array($child, 'isMemberOfCollection'); - if (!empty($child_pids)) { - $populated_child_collections[] = $child; - } - } - } - if (!empty($populated_child_collections)) { - $conflict = FALSE; - foreach ($populated_child_collections as $collection) { - if (in_array($collection, $pids)) { - $conflict = TRUE; - drupal_set_message(t("Populated child collections were not deleted.")); - } - } - } - $pids_to_delete = array_diff($pids, $populated_child_collections); - - foreach ($pids_to_delete as $pid_to_delete) { - $rest_connection->repository->purgeObject($pid_to_delete); - } - drupal_goto("islandora/object/" . $collection_pid); -} - -/** - * Deletes the collection object - * - * @param string $pid - */ -function delete_root_collection($pid) { - module_load_include('inc', 'islandora', 'RestConnection'); - try { - $rest_connection = new RestConnection(); - $rest_connection->repository->purgeObject($pid); - } catch (Exception $e) { - drupal_set_message(t("Collection '@pid' could not be deleted!", array('@pid' => $pid)), 'error'); - return; - } - drupal_set_message(t("Collection '@pid' deleted.", array('@pid' => $pid))); -} diff --git a/islandora_basic_collection/includes/ManagePolicies.inc b/islandora_basic_collection/includes/ManagePolicies.inc deleted file mode 100644 index 413e6fa8..00000000 --- a/islandora_basic_collection/includes/ManagePolicies.inc +++ /dev/null @@ -1,217 +0,0 @@ -repository); - $cm_name = $item->Label; - $cm_options[$content_model] = $cm_name; - } - } - - $namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); - - $collection_policy_dsid = variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY'); - $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); - $collection_policy_string = $collection_object->getDatastream($collection_policy_dsid); - - $supported_collection_models = array(); - if ($collection_policy_string) { - $collection_policy = new CollectionPolicy($collection_policy_string->content); - $supported_collection_models = $collection_policy->getContentModels(); - } - $collection_namespace = substr($collection_pid, 0, strpos($collection_pid, ":")); - - $represented_content_models = get_represented_content_models($collection_pid); - $collection_name = $collection_object->label; - $new_content_models = get_content_models_as_option_array(); - $current_models_in_policy = array(); - - if ($supported_collection_models) { - foreach ($supported_collection_models as $supported_model) { - $current_models_in_policy[$supported_model['pid']] = $supported_model['pid']; - } - } - - $new_options = array(); - if (is_array($new_content_models) && is_array($current_models_in_policy)) { - $new_options = array_diff_key($new_content_models, $current_models_in_policy); - } - - $form['manage_collection_policy']['titlebox'] = array( - '#type' => 'item', - '#title' => t("Manage collection policy for @collection_pid", array('@collection_pid' => $collection_pid)), - ); - - $form ['manage_collection_policy']['add']['content_model_to_add'] = array( - '#title' => "Choose content model", - '#type' => 'select', - '#options' => $new_options, - '#description' => t("Choose content model to add to this collection policy."), - ); - - $form ['manage_collection_policy']['add']['new_cp_namespace'] = array( - '#title' => "Choose namespace", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => $namespace, - '#description' => t("Choose namespace for objects in this collection associated with this content model"), - ); - - $form['parent_collection'] = array( - '#type' => 'hidden', - '#value' => $collection_pid, - ); - - $form['collection_pid'] = array( - '#type' => 'hidden', - '#value' => $collection_pid, - ); - - $form['manage_collection_policy']['add']['submit'] = array( - '#type' => 'submit', - '#value' => t('Add content model to collection policy'), - '#id' => 'add_cm' - ); - - if (count($current_models_in_policy) > 0) { - $form['manage_collection_policy']['remove'] = array( - '#title' => "Delete content model from collection policy", - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - ); - - $form ['manage_collection_policy']['remove']['content_models_to_remove'] = array( - '#title' => "Choose content model to remove", - '#type' => 'checkboxes', - '#options' => $current_models_in_policy, - '#description' => t("Choose content models to remove from this collection policy."), - ); - - $form['manage_collection_policy']['remove']['submit'] = array( - '#type' => 'submit', - '#value' => t('Remove content model from collection policy'), - '#id' => 'remove_cm' - ); - } - return $form; -} - -function islandora_manage_policies_form_validate($form, &$form_state) { - -} - -/** - * Submit handler for collection policy management form - * - * @param array $form - * @param array $form_state - */ -function islandora_manage_policies_form_submit($form, &$form_state) { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - - $collection_pid = $form_state['values']['parent_collection']; - $collection_object = new FedoraObject($collection_pid, $rest_connection->repository); - $policy = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); - $collection_policy = ' - - - - - - - - isMemberOfCollection -'; - - $collection_policy_xml = new DOMDocument(); - $collection_policy_xml->loadXML($policy->content); - - if ($form_state['clicked_button']['#id'] == 'add_cm') { - if (empty($policy->content)) { - $collection_policy_datastream = $collection_object->constructDatastream('COLLECTION_POLICY', 'X'); - $collection_policy_datastream->setContentFromString($collection_policy); - $collection_policy_datastream->label = 'COLLECTION_POLICY'; - $collection_object->ingestDatastream($collection_policy_datastream); - $policy = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); - } - - $cp_namespace = $form_state['values']['new_cp_namespace']; - $cp_content_model = $form_state['values']['content_model_to_add']; - $content_model_object = new FedoraObject($cp_content_model, $rest_connection->repository); - $content_model_datastream = $content_model_object->getDatastream(variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); - - $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); - $content_model_element = $content_models_element->item(0)->getElementsByTagName('content_model'); - - $content_model_element = $collection_policy_xml->createElement('content_model'); - $content_model_element->setAttribute('name', $content_model_object->label); - $content_model_element->setAttribute('dsid', variable_get('Islandora_Content_Model_DSID', 'ISLANDORACM')); - $content_model_element->setAttribute('namespace', $cp_namespace); - $content_model_element->setAttribute('pid', $content_model_object->id); - $content_models_element->item(0)->appendChild($content_model_element); - - $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); - $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); - $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; - $collection_object->ingestDatastream($new_collection_policy_datastream); - drupal_set_message(t("Collection model @model successfully added", array('@model' => $content_model_object->label))); - } - - //remove content model from collection policy - if ($form_state['clicked_button']['#id'] == 'remove_cm') { - $candidates = $form_state['values']['content_models_to_remove']; - $count = 0; - $s = ''; - foreach ($candidates as $candidate) { - if (is_string($candidate)) { - $content_models_element = $collection_policy_xml->getElementsByTagName('content_models'); - $models = $content_models_element->item(0)->getElementsByTagName('content_model'); - $found = FALSE; - for ($i = 0; $found === FALSE && $i < $models->length; $i++) { - if ($models->item($i)->getAttribute('pid') == $candidate) { - $found = $models->item($i); - } - } - - if ($found !== FALSE && $models->length > 1) { - $content_models_element->item(0)->removeChild($found); - $ret = TRUE; - } - $count++; - } - } - if ($count > 0) { - $new_collection_policy_datastream = $collection_object->getDatastream('COLLECTION_POLICY'); - $new_collection_policy_datastream->setContentFromString($collection_policy_xml->saveXML()); - $new_collection_policy_datastream->label = 'COLLECTION_POLICY'; - $collection_object->ingestDatastream($new_collection_policy_datastream); - if ($count > 1) { - $s = 's'; - } - drupal_set_message(t("$count collection model@s removed", array('@s' => $s))); - } - } -} \ No newline at end of file diff --git a/islandora_basic_collection/includes/MoveCollection.inc b/islandora_basic_collection/includes/MoveCollection.inc deleted file mode 100644 index e429d3a5..00000000 --- a/islandora_basic_collection/includes/MoveCollection.inc +++ /dev/null @@ -1,78 +0,0 @@ - 'item', - '#title' => t('No objects found in this collection'), - ); - return $form; - } - $form = array(); - - $form['migrate']['titlebox'] = array( - '#type' => 'item', - '#title' => t("Move objects from @collection_pid", array('@collection_pid' => $pid)), - ); - - $form['migrate']['new_collection'] = array( - '#title' => t('New collection'), - '#description' => t("All content will be migrated from @pid to the selected collection", array('@pid' => $pid)), - '#type' => 'select', - '#options' => $potential_collections, - ); - - $form['migrate']['table'] = $table; - - $form['current'] = array( - '#type' => 'hidden', - '#value' => $pid, - ); - - $form['migrate']['message'] = array( - '#type' => 'item', - '#value' => t(""), - ); - - $form['migrate']['submit'] = array( - '#type' => 'submit', - '#value' => t('Migrate selected objects'), - ); - return $form; -} - -/** - * Submit handler for object migration form - * - * @param array $form - * @param array $form_state - */ -function islandora_collection_migrate_form_submit($form, &$form_state) { - module_load_include('inc', 'islandora', 'RestConnection'); - $rest_connection = new RestConnection(); - - $pids = array_filter($form_state['values']['table']); - $new_collection = $form_state['values']['new_collection']; - $current = $form_state['values']['current']; - foreach ($pids as $pid) { - $fedora_object = new FedoraObject($pid, $rest_connection->repository); - $fedora_object->relationships->remove(FEDORA_RELS_EXT_URI, 'isMemberOfCollection', $current); - $fedora_object->relationships->add(FEDORA_RELS_EXT_URI, 'isMemberOfCollection', $new_collection); - } -} \ No newline at end of file From 4893daffc920cccbab7fb54d4cdf31fdec4b2c8e Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 15:22:14 -0300 Subject: [PATCH 5/7] Removed debug statement --- islandora_basic_collection/includes/child_collection.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/islandora_basic_collection/includes/child_collection.inc b/islandora_basic_collection/includes/child_collection.inc index 669442c5..613b0a5d 100644 --- a/islandora_basic_collection/includes/child_collection.inc +++ b/islandora_basic_collection/includes/child_collection.inc @@ -16,7 +16,6 @@ function islandora_create_child_collection_form($form, &$form_state, $this_collection_pid) { module_load_include('inc', 'islandora', 'RestConnection'); $rest_connection = new RestConnection(); - var_dump(get_content_models_list($this_collection_pid)); $current_content_models = get_content_models_list($this_collection_pid); if (!in_array('islandora:collectionCModel', $current_content_models)) { $form['not_collection'] = array( From faaf0e86270ad6b59aba30ff794249622b5072dc Mon Sep 17 00:00:00 2001 From: rwincewicz Date: Thu, 31 May 2012 15:30:59 -0300 Subject: [PATCH 6/7] Added check for creating child collections to ensure the collectionCModel is present in the collection policy --- .../includes/child_collection.inc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/islandora_basic_collection/includes/child_collection.inc b/islandora_basic_collection/includes/child_collection.inc index 613b0a5d..763d30fd 100644 --- a/islandora_basic_collection/includes/child_collection.inc +++ b/islandora_basic_collection/includes/child_collection.inc @@ -15,12 +15,25 @@ */ function islandora_create_child_collection_form($form, &$form_state, $this_collection_pid) { module_load_include('inc', 'islandora', 'RestConnection'); + module_load_include('inc', 'islandora_basic_collection', 'includes/CollectionPolicy'); $rest_connection = new RestConnection(); - $current_content_models = get_content_models_list($this_collection_pid); - if (!in_array('islandora:collectionCModel', $current_content_models)) { + $collection_object = new FedoraObject($this_collection_pid, $rest_connection->repository); + $policy_datastream = $collection_object->getDatastream(variable_get('Islandora_Collection_Policy_DSID', 'COLLECTION_POLICY')); + $collection_policy = new CollectionPolicy($policy_datastream->content); + $current_content_models = $collection_policy->getContentModels(); + + $collection_content_model_exists = FALSE; + + foreach ($current_content_models as $current_content_model) { + if ($current_content_model['pid'] == 'islandora:collectionCModel') { + $collection_content_model_exists = TRUE; + } + } + + if (!$collection_content_model_exists) { $form['not_collection'] = array( '#type' => 'item', - '#title' => t("This object is not a collection and so can't contain child collections. To fix this add the islandora:collectionCModel to this object's collection policy"), + '#title' => t("This object can't contain child collections. To fix this add the islandora:collectionCModel to this object's collection policy"), ); return $form; } From d55c01c21266e3335ad8a6589642b6aacb23b744 Mon Sep 17 00:00:00 2001 From: krisbulman Date: Thu, 31 May 2012 15:45:59 -0300 Subject: [PATCH 7/7] template cleanup issets issets issets --- .../islandora-basic-image.tpl.php | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/islandora_basic_image/islandora-basic-image.tpl.php b/islandora_basic_image/islandora-basic-image.tpl.php index 74d183b0..fe548d6b 100644 --- a/islandora_basic_image/islandora-basic-image.tpl.php +++ b/islandora_basic_image/islandora-basic-image.tpl.php @@ -21,28 +21,34 @@ * along with the program. If not, see . */ ?> - + + +
TRUE)); ?> - - + + +
-

-

-

-
-

In Collections

-
    - $value): ?> -
  • - -
-
+ +

+

+ + +
+

In Collections

+
    + $value): ?> +
  • + +
+
+