From ebd8a5096b18dcc1dc529905c57ea0816e542e44 Mon Sep 17 00:00:00 2001 From: Alan Stanley Date: Wed, 28 Sep 2011 09:21:04 -0300 Subject: [PATCH] Added management tab to collections --- CollectionClass.inc | 297 +++++++++++++++++++++++---------------- CollectionManagement.inc | 276 ++++++++++++++++++++++++++++++++++++ ObjectHelper.inc | 22 +-- api/fedora_item.inc | 8 +- fedora_repository.module | 2 + 5 files changed, 474 insertions(+), 131 deletions(-) create mode 100644 CollectionManagement.inc diff --git a/CollectionClass.inc b/CollectionClass.inc index f9d906e8..f40aff4d 100644 --- a/CollectionClass.inc +++ b/CollectionClass.inc @@ -498,6 +498,7 @@ class CollectionClass { */ function showFieldSets($page_number) { module_load_include('inc', 'fedora_repository', 'api/fedora_item'); + module_load_include('inc', 'fedora_repository', 'CollectionManagement'); global $base_url; $tabset = array(); global $user; @@ -514,10 +515,15 @@ class CollectionClass { // Check the form post to see if we are in the middle of an ingest operation. $show_ingest_tab = (!empty($_POST['form_id']) && $_POST['form_id'] == 'fedora_repository_ingest_form'); $add_to_collection = $this->getIngestInterface(); + $show_batch_tab = TRUE; + $policy = CollectionPolicy::loadFromCollection($this->pid, TRUE); + $content_models = $policy->getContentModels(); + if (count($content_models) == 1 && $content_models[0]->pid == "islandora:collectionCModel") { + $show_batch_tab = FALSE; + } if (!$show_ingest_tab) { $view_selected = true; } - drupal_set_message(); $tabset['view_tab'] = array( @@ -534,14 +540,24 @@ class CollectionClass { // This will be the content of the tab. '#content' => $add_to_collection, ); - - $tabset['add_collection_tab'] = array( - // #type and #title are the minimum requirements. - '#type' => 'tabpage', - '#title' => t('Add Child Collection'), - // This will be the content of the tab. - '#content' => drupal_get_form('collection_creation_form', $this->pid), - ); + if (user_access('manage collections')) { + $tabset['add_collection_tab'] = array( + // #type and #title are the minimum requirements. + '#type' => 'tabpage', + '#title' => t('Manage This Collection'), + // This will be the content of the tab. + '#content' => drupal_get_form('collection_management_form', $this->pid, $content_models), + ); + } + if ($show_batch_tab) { + $tabset['batch_ingest_tab'] = array( + // #type and #title are the minimum requirements. + '#type' => 'tabpage', + '#title' => t('Batch Ingest'), + // This will be the content of the tab. + '#content' => drupal_get_form('batch_creation_form', $this->pid, $content_models), + ); + } return $tabset; } @@ -651,74 +667,55 @@ class CollectionClass { } -/** - * collection creation form ? - * @param type $form_state - * @param type $parent_collection_pid - * @return type - */ -function collection_creation_form(&$form_state, $parent_collection_pid) { +function batch_creation_form(&$form_state, $collection_pid, $content_models) { module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); - $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); - } + module_load_include('inc', 'fedora_repository', 'CollectionPolicy'); + $cm_options = array(); + $name_mappings = array(); + foreach ($content_models as $content_model) { + if ($content_model->pid != "islandora:collectionCModel") { + $cm_options[$content_model->pid] = $content_model->name; + $name_mappings[] = $content_model->pid . '^' . $content_model->pid_namespace; } } + $mappings = implode('~~~', $name_mappings); + $form['#attributes']['enctype'] = 'multipart/form-data'; - $content_models = get_content_models_as_option_array(); $form['titlebox'] = array( '#type' => 'item', - '#value' => t("Create New Child Collection within $collection_pid"), + '#value' => t("Batch ingest into $collection_pid"), ); - $form['collection_name'] = array( - '#title' => "Collection Name", - '#type' => 'textfield', - '#description' => t("Human readable name for this collection"), - ); - $form['collection_pid'] = array( - '#title' => "Collection PID", - '#type' => 'textfield', - '#size' => 15, - '#description' => t("Unique PID for this collection.
Pids take the general form of namespace:collection eg islandora:pamphlets"), - ); - if (!$restricted) { - $form['collection_namespace'] = array( - '#title' => "Collection Namespace", - '#type' => 'textfield', - '#size' => 15, - '#default_value' => 'default', - '#description' => t("Namespace for objects in this collection."), - ); - } - else { - $form['collection_namespace'] = array( - '#title' => "Collection Namespace", - '#type' => 'select', - '#options' => $allowed, - '#default_value' => 'default', - '#description' => t("Namespace for objects in this collection."), - ); - } $form['parent_collection'] = array( '#type' => 'hidden', - '#value' => $parent_collection_pid, + '#value' => $collection_pid, ); - - $form['content_models'] = array( - '#title' => "Choose allowable content models for this collection", - '#type' => 'checkboxes', - '#options' => $content_models, + $form['namespace_mappings'] = array( + '#type' => 'hidden', + '#value' => $mappings, + ); + $form['metadata_type'] = array( + '#title' => "Choose Metadata Type", + '#type' => 'radios', + '#options' => array('MODS' => 'MODS', "DC" => "DUBLIN CORE"), + '#required' => true, + '#description' => t("Select primary metadata schema"), + ); + $form['content_model'] = array( + '#title' => "Choose content model to be associated with objects ingested", + '#type' => 'select', + '#options' => $cm_options, '#required' => true, '#description' => t("Content models describe the behaviours of objects with which they are associated."), ); - + $form['indicator']['file-location'] = array( + '#type' => 'file', + '#title' => t('Upload zipped folder'), + '#size' => 48, + '#description' => t('The zipped folder should contain all files necessary to build objects.
+ Related files must have the same filename, but with diffening extensions to indicate mimetypes.
+ ie. myFile.xml and myFile.jpg'), + ); $form['submit'] = array( '#type' => 'submit', @@ -729,68 +726,130 @@ function collection_creation_form(&$form_state, $parent_collection_pid) { return($form); } -/** - * collection creation form validate ? - * @param type $form - * @param type $form_state - * @return type - */ -function collection_creation_form_validate($form, &$form_state) { - module_load_include('inc', 'fedora_repository', 'api/fedora_item'); - module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); - $pid = $form_state['values']['collection_pid']; - $item = new fedora_item($pid); - if ($item->exists()) { - form_set_error('', t("$pid already exists within your repository. the PID must be unique")); - return; +function batch_creation_form_validate($form, &$form_state) { + + $fieldName = 'file-location'; + if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name'][$fieldName])) { + $file = file_save_upload($fieldName); + if ($file->filemime != 'application/zip') { + form_set_error($fieldName, 'Input file must be a .zip file'); + return; + } + if (!$file) { + form_set_error($fieldName, 'Error uploading file.'); + return; + } + $form_state['values']['file'] = $file; } - if (!valid_pid($pid)){ - form_set_error('', t("$pid is not a valid identifier")); - return; + else { + // set error + form_set_error($fieldName, 'Error uploading file.'); + return; } } -/** - * collection creation form submit - * @global type $user - * @param type $form - * @param type $form_state - */ -function collection_creation_form_submit($form, &$form_state) { +function batch_creation_form_submit($form, &$form_state) { + module_load_include('inc', 'fedora_repository', 'ContentModel'); global $user; + $namespace_mappings = array(); + $content_model = $form_state['values']['content_model']; + $metadata = $form_state['values']['meta_data_type']; + $namespace_process = explode('~~~', $form_state['values']['namespace_mappings']); + foreach ($namespace_process as $line) { + $line_parts = explode('^', $line); + $namespace_mappings[$line_parts[0]] = $line_parts[1]; + } + $namespace = $namespace_mappings[$content_model]; + $dirName = "temp" . $user->uid; + $tmpDir = file_directory_path() . '/' . $dirName . '/'; + mkdir($tmpDir); + $file = $form_state['values']['file']; + $fileName = $file->filepath; + $file_list = array(); + $cmdString = "unzip -q -o -d $tmpDir \"$fileName\""; + system($cmdString, $retVal); + $dirs = array(); + $doNotAdd = array('.', '..', '__MACOSX'); + array_push($dirs, $tmpDir); + $files = scandir($tmpDir); + foreach ($files as $file) { + if (is_dir("$tmpDir/$file") & !in_array($file, $doNotAdd)) { + array_push($dirs, $tmpDir . $file); + } + } + + foreach ($dirs as $directory) { + if ($inputs = opendir($directory)) { + while (FALSE !== ($file_name = readdir($inputs))) { + if (!in_array($file_name, $doNotAdd)) { + $ext = strrchr($file_name, '.'); + $base = preg_replace("/$ext$/", '', $file_name); + $ext = substr($ext, 1); + $file_list[$base][$ext] = "$directory" . $file_name; + } + } + closedir($inputs); + } + } + + /** + * use the content model class to construct a class representing the selected content model + * call execIngestmethods on each mimetype passed in + */ + create_fedora_batch($file_list, $content_model, $metadata, $namespace); +} + +function create_fedora_batch($file_list, $content_model, $metadata, $namespace) { module_load_include('inc', 'fedora_repository', 'api/fedora_item'); - module_load_include('inc', 'fedora_repository', 'api/dublin_core'); - $module_path = drupal_get_path('module', 'fedora_repository'); - $thumbnail = drupal_get_path('module', 'Fedora_Repository') . '/images/Crystal_Clear_filesystem_folder_grey.png'; - $collection_pid = $form_state['values']['collection_pid']; - $new_collection_label = $form_state['values']['collection_name']; - $parent_collection = $form_state['values']['parent_collection']; - $pid_namespace = $form_state['values']['collection_namespace']; - $all_cModels = get_content_models_as_option_array(); - $collection_policy = ' - - - - - - - isMemberOfCollection -'; - $content_models = $form_state['values']['content_models']; - $collection_policy_xml = simplexml_load_string($collection_policy); - foreach ($content_models as $content_model) { - if ($content_model) { - $node = $collection_policy_xml->content_models->addChild('content_model'); - $node->addAttribute('dsid', 'ISLANDORACM'); - $node->addAttribute('name', $all_cModels[$content_model]); - $node->addAttribute('namespace', $pid_namespace . ':1'); - $node->addAttribute('pid', $content_model); + if (($cm = ContentModel::loadFromModel($content_model, 'ISLANDORACM')) !== FALSE) { + $allowedMimeTypes = $cm->getMimetypes(); + + if (!in_array($dformat, $allowedMimeTypes)) { + form_set_error('ingest-file-location', t('The uploaded file\'s mimetype (' . $dformat . ') is not associated with this Content Model. The allowed types are ' . + implode(' ', $allowedMimeTypes))); + return; } + elseif (!$cm->execIngestRules($file, $dformat)) { + drupal_set_message(t('Error following Content Model Rules'), 'error'); + foreach (ContentModel::$errors as $err) { + drupal_set_message($err, 'error'); + } + } + } + + $batch = array( + 'title' => 'Ingesting Objects', + 'operations' => array(), + 'file' => drupal_get_path('module', 'fedora_repository') . '/CollectionClass.inc', + ); + + + foreach ($file_list as $label => $object_files) { + + $batch['operations'][] = array('create_fedora_objects', array($label, $content_model, $object_files, $collection_pid, $metadata)); } - $item = fedora_item::ingest_new_item($collection_pid, 'A', $new_collection_label, $user->name); - $item->add_relationship('isMemberOfCollection', $parent_collection, RELS_EXT_URI); - $item->add_relationship('hasModel', 'islandora:collectionCModel', FEDORA_MODEL_URI); - $item->add_datastream_from_string($collection_policy_xml->saveXML(), 'COLLECTION_POLICY'); - $item->add_datastream_from_file($thumbnail, 'TN'); - drupal_goto("/fedora/repository/$collection_pid"); + + batch_set($batch); } + +function create_fedora_objects($lable, $content_model, $object_files, $collection_pid, $namespace, $metadata, $content_model) { + $namespace = preg_replace('/:.*/', '', $namespace); + $pid = fedora_item::get_next_PID_in_namespace($namespace); + module_load_include('inc', 'fedora_reppository', 'api/fedora_item'); + $item = Fedora_item::ingest_new_item($pid, 'A', $label, $owner); + $item->add_relationship('hasModel', $content_model, FEDORA_MODEL_URI); + if ($metadata == 'DC') { + $dc_xml = file_get_contents($object_files['xml']); + $object_files['xml'] = null; + $item->modify_datastream_by_value($dc_xml, 'DC', "Dublin Core", 'tex/xml'); + } + if ($metadata == 'MODS') { + $item->add_datastream_from_file($object_files['xml'], 'MODS'); + //add crosswalk to dc logic + } + + foreach ($object_files as $file) { + + } +} + diff --git a/CollectionManagement.inc b/CollectionManagement.inc new file mode 100644 index 00000000..aac1fc69 --- /dev/null +++ b/CollectionManagement.inc @@ -0,0 +1,276 @@ +objectProfile->objLabel; + $new_content_models = get_content_models_as_option_array(); + $cm_options = array(); + $name_mappings = array(); + foreach ($content_models as $content_model) { + if ($content_model->pid != "islandora:collectionCModel") { + $cm_options[$content_model->pid] = $content_model->name; + } + } + + $content_models = get_content_models_as_option_array(); + $form['child_creation'] = array( + '#title' => "Create Child Collection", + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + + $form['child_creation']['titlebox'] = array( + '#type' => 'item', + '#value' => t("Create New Child Collection within $parent_collection_pid"), + ); + + $form['child_creation']['collection_name'] = array( + '#title' => "Collection Name", + '#type' => 'textfield', + '#description' => t("Human readable name for this collection"), + ); + $form['child_creation']['new_collection_pid'] = array( + '#title' => "Collection PID", + '#type' => 'textfield', + '#size' => 15, + '#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' => 'default', + '#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['child_creation']['parent_collection'] = array( + '#type' => 'hidden', + '#value' => $parent_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_class' + ); + $form['change_cmodel'] = array( + '#title' => "Change Content Models", + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['change_cmodel']['titlebox'] = array( + '#type' => 'item', + '#value' => t("Change Content Models within $parent_collection_pid"), + ); + + $form['change_cmodel']['current_content_model'] = array( + '#title' => "Choose content model to be changed", + '#type' => 'select', + '#options' => $cm_options, + '#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' => $parent_collection_pid, + ); + $form['change_cmodel']['submit'] = array( + '#type' => 'submit', + '#value' => t('Change Content Model Associations'), + '#id' => 'change_model', + ); + if (user_access('delete entire collections')) { + $form['delete_collection'] = array( + '#title' => "Permanently Delete $collection_name", + '#type' => 'fieldset', + '#description' => t("Clicking this button will delete $collection_name and all objects within.
This action cannot be undone."), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['delete_collection']['confirm'] = array( + '#title' => "Are you sure?", + '#type' => 'fieldset', + '#description' => t('Clicking the delete button will permanantly remove all objects from this collection.
This action cannot be undone. '), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + + $form['delete_collection']['confirm']['submit'] = array( + '#type' => 'submit', + '#value' => t('Delete this collection'), + '#id' => 'delete_collection', + ); + } + return($form); +} + +/** + * collection creation form validate + * @param array $form + * @param array $form_state + */ +function collection_management_form_validate($form, &$form_state) { + if ($form_state['clicked_button']['#id'] == 'create_class') { + module_load_include('inc', 'fedora_repository', 'api/fedora_item'); + module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); + $pid = $form_state['values']['new_collection_pid']; + $item = new fedora_item($pid); + if ($item->exists()) { + form_set_error('', t("$pid already exists within your repository. the PID must be unique")); + return; + } + if (!valid_pid($pid)) { + form_set_error('', t("$pid is not a valid identifier")); + return; + } + } +} + +/** + * collection creation form submit + * @global type $user + * @param type $form + * @param type $form_state + */ +function collection_management_form_submit($form, &$form_state) { + module_load_include('inc', 'fedora_repository', 'api/fedora_collection'); + module_load_include('inc', 'fedora_repository', 'api/fedora_item'); + module_load_include('inc', 'fedora_repository', 'api/dublin_core'); + global $user; + $collection_pid = $form_state['values']['parent_collection']; + if ($form_state['clicked_button']['#id'] == 'create_class') { + $module_path = drupal_get_path('module', 'fedora_repository'); + $thumbnail = drupal_get_path('module', 'Fedora_Repository') . '/images/Crystal_Clear_filesystem_folder_grey.png'; + $new_collection_pid = $form_state['values']['new_collection_pid']; + $new_collection_label = $form_state['values']['collection_name']; + $pid_namespace = $form_state['values']['collection_namespace']; + $all_cModels = get_content_models_as_option_array(); + $collection_policy = ' + + + + + + + isMemberOfCollection +'; + $content_models = $form_state['values']['content_models']; + $collection_policy_xml = simplexml_load_string($collection_policy); + foreach ($content_models as $content_model) { + if ($content_model) { + $node = $collection_policy_xml->content_models->addChild('content_model'); + $node->addAttribute('dsid', 'ISLANDORACM'); + $node->addAttribute('name', $all_cModels[$content_model]); + $node->addAttribute('namespace', $pid_namespace . ':1'); + $node->addAttribute('pid', $content_model); + } + } + $item = fedora_item::ingest_new_item($new_collection_pid, 'A', $new_collection_label, $user->name); + $item->add_relationship('isMemberOfCollection', $collection_pid, RELS_EXT_URI); + $item->add_relationship('hasModel', 'islandora:collectionCModel', FEDORA_MODEL_URI); + $item->add_datastream_from_string($collection_policy_xml->saveXML(), 'COLLECTION_POLICY'); + $item->add_datastream_from_file($thumbnail, 'TN'); + drupal_goto("/fedora/repository/$new_collection_pid"); + } + + if ($form_state['clicked_button']['#id'] == 'change_model') { + $current_content_model = $form_state['values']['current_content_model']; + $new_content_model = $form_state['values']['new_content_model']; + $policy = CollectionPolicy::loadFromCollection($collection_pid, TRUE); + $add_to_policy = TRUE; + $policy_cms = $policy->getContentModels(); + foreach ($policy_cms as $policy_cm) { + if ($policy_cm->pid == $current_content_model) { + $namespace = $policy_cm->pid_namespace; + } + if ($policy_cm->pid == $new_content_model) { + $add_to_policy = FALSE; + } + } + if ($add_to_policy) { + $policy->addModel(ContentModel::loadFromModel($new_content_model), $namespace); + $policy->saveToFedora(); + } + $query = "select \$object from <#ri> + where (\$object + and \$object + and \$object )"; + $query = htmlentities(urlencode($query)); + $content = ''; + + $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); + $url .= "?type=tuples&flush=TRUE&format=csv&limit=$limit&offset=$offset&lang=itql&stream=on&query=" . $query; + $content .= do_curl($url); + $results = explode("\n", $content); + $object_pids = preg_replace('/^info:fedora\/|"object"/', '', $results); + $count = 0; + foreach ($object_pids as $object_pid) { + if (!$object_pid) { + continue; + } + $item = new fedora_item($object_pid); + $item->purge_relationship('hasModel', $current_content_model); + $item->add_relationship('hasModel', $new_content_model, FEDORA_MODEL_URI); + $count++; + } + drupal_set_message("$current_content_model changed to $new_content_model on $count objects"); + } + + if ($form_state['clicked_button']['#id'] == 'delete_collection') { + $name = $user->name; + $objects = get_related_items_as_array($collection_pid, $relationship); + $objects[] = $collection_pid; + foreach ($objects as $object) { + $item_to_delete = new Fedora_Item($object); + $item_to_delete->purge("$object purged by $name"); + } + drupal_goto('fedora/repository'); + } +} + diff --git a/ObjectHelper.inc b/ObjectHelper.inc index e575fb7d..eb7ccecf 100644 --- a/ObjectHelper.inc +++ b/ObjectHelper.inc @@ -19,6 +19,8 @@ class ObjectHelper { public static $INGEST_FEDORA_OBJECTS = 'ingest new fedora objects'; public static $EDIT_TAGS_DATASTREAM = 'edit tags datastream'; public static $VIEW_DETAILED_CONTENT_LIST = 'view detailed list of content'; + public static $MANAGE_COLLECTIONS = 'manage collections'; + public static $DELETE_ENTIRE_COLLECTIONS = 'delete entire collections'; public static $DISPLAY_ALWAYS = 0; public static $DISPLAY_NEVER = 1; public static $DISPLAY_NO_MODEL_OUTPUT = 2; @@ -160,7 +162,7 @@ class ObjectHelper { if ($asAttachment) { $suggestedFileName = "$label"; $pos = strpos($suggestedFileName, '.'); - + /* * Here we used to take an object of, say, type application/pdf with label, say, "My Document" * and we assemble the output filename extension based on the post-slash portion of the mimetype. @@ -300,8 +302,8 @@ class ObjectHelper { } if ($allow) { $purgeImage = 'purge datastream'; + $pid . '/' . $dataStreamValue->ID . '/' . $dataStreamValue->label . '">purge datastream'; } } else { @@ -329,7 +331,7 @@ class ObjectHelper { $mimeType = $dataStreamValue->MIMEType; $view = '' . t('View') . ''; + '" target="_blank" >' . t('View') . ''; $action = "$base_url/fedora/repository/object_download/" . drupal_urlencode($pid) . '/' . $id . '/' . drupal_urlencode(preg_replace('/\//i', '${1}_', $label)); // Necessary to handle the case of Datastream labels that contain slashes. Ugh. $downloadVersion = '
'; if (user_access(ObjectHelper :: $EDIT_FEDORA_METADATA)) { @@ -416,7 +418,7 @@ class ObjectHelper { if ($allow) { $output .= '
' . t('Edit Meta Data') . ''; + $dsid . '">' . t('Edit Meta Data') . ''; } } return $output; @@ -673,8 +675,8 @@ class ObjectHelper { if ($allow) { // $ingestObject = ' $collectionName, '!collection_pid' => $collection_pid)) . '" href="' . base_path() . - 'fedora/ingestObject/' . $collection_pid . '/' . $collectionName . '">' . t('Add a New Object') . ' ' . t('Add to this Collection'); + 'fedora/ingestObject/' . $collection_pid . '/' . $collectionName . '">' . t('Add a New Object') . ' ' . t('Add to this Collection'); } } } @@ -855,10 +857,10 @@ class ObjectHelper { // Get pid, title and description for children of object $pid $query_string = 'select $o $title from <#ri> ' . // $query_string = 'select $o $title $desc from <#ri> '. - 'where $s $o ' . - 'and $o $title ' . + 'where $s $o ' . + 'and $o $title ' . // 'and $o $desc '. - 'and ( '; + 'and ( '; foreach ($pids as $pid) { $query_string .= '$s or '; diff --git a/api/fedora_item.inc b/api/fedora_item.inc index 13f126aa..2625568b 100644 --- a/api/fedora_item.inc +++ b/api/fedora_item.inc @@ -76,10 +76,9 @@ class Fedora_Item { */ function add_datastream_from_file($datastream_file, $datastream_id, $datastream_label = NULL, $datastream_mimetype = '', $controlGroup = 'M', $logMessage = NULL) { module_load_include('inc', 'fedora_repository', 'MimeClass'); - if (!is_file($datastream_file)){ + if (!is_file($datastream_file)) { drupal_set_message("$datastream_file not found
", 'warning'); return; - } if (empty($datastream_mimetype)) { // Get mime type from the file extension. @@ -233,6 +232,11 @@ class Fedora_Item { $relationship = "isPartOf"; $namespaceURI = 'info:fedora/fedora-system:def/relations-external#'; break; + case "rel:hasModel": + case "hasModel": + $relationship = "hasModel"; + $namespaceURI = FEDORA_MODEL_URI; + break; } if (substr($object, 0, 12) != 'info:fedora/') { diff --git a/fedora_repository.module b/fedora_repository.module index 3ffb32ac..3f46f4b8 100644 --- a/fedora_repository.module +++ b/fedora_repository.module @@ -830,6 +830,8 @@ function fedora_repository_perm() { OBJECTHELPER::$INGEST_FEDORA_OBJECTS, OBJECTHELPER::$EDIT_TAGS_DATASTREAM, OBJECTHELPER::$VIEW_DETAILED_CONTENT_LIST, + OBJECTHELPER::$MANAGE_COLLECTIONS, + OBJECTHELPER::$DELETE_ENTIRE_COLLECTIONS, ); }