def test__mods_multiple_artists(self):
   """ Tests bell mods creation. """
   data_dict = json.loads( self.TEST_BELL_JSON_ENTRY_MULTIPLE_ARTISTS )
   mods_schema_path = os.path.abspath( './lib/mods-3-4.xsd' )
   expected = self.TEST_EXPECTED_MULTIPLE_ARTISTS_XML
   mods_maker = ModsBuilder()
   result = mods_maker.build_mods_object( data_dict, mods_schema_path, 'return_string' )
   self.assertEquals( expected, result['data'] )
 def create_fedora_metadata_object( self,
     FEDORA_ADMIN_URL, FEDORA_ADMIN_USERNAME, FEDORA_ADMIN_PASSWORD,
     COLLECTION_PID,
     item_data_dict, mods_schema_path, logger=None
     ):
     """ CONTROLLER
         Note: item_data_dict is a json entry from foundation/acc_num_to_data.py json """
     print 'starting try...'
     try:
         #Store logger if exists
         if logger:
             self.logger = logger
         #Store accession number
         self.accession_number = item_data_dict['calc_accession_id']  # for logging
         # print '- in fedora_metadata_only_builder.Task.create_fedora_metadata_object(); accession_number, %s' % self.accession_number
         #
         #Setup builders
         ir_builder = IRBuilder()
         mods_builder = ModsBuilder()
         rights_builder = RightsBuilder()
         #
         #Instantiate repo connection
         #Note: doesn't actually try to connect until it has to
         repo = Repository( root=FEDORA_ADMIN_URL, username=FEDORA_ADMIN_USERNAME, password=FEDORA_ADMIN_PASSWORD )
         print '- repo connection instantiated.'
         #
         #Instantiate new-obj
         #Purpose: this will be the object we'll build, then ingest
         new_obj = repo.get_object( type=CommonMetadataDO )
         print '- new_obj instantiated.'
         #
         #Instantiate collection object
         coll_obj = repo.get_object( pid=COLLECTION_PID )
         print '- coll_obj instantiated.'
         #
         #Get/reserve a pid
         #Note: after obtaining pid, new_obj.pid is a value, not a reference
         new_pid = new_obj.pid()
         new_obj.pid = new_pid
         print '- new_obj.pid obtained.'
         #
         #Assign collection object
         new_obj.owning_collection = coll_obj
         print '- collection object assigned'
         #
         #Build rights object
         #Note: builds via bdrxml
         rights_object = rights_builder.build_rights_object()
         print '- rights object built.'
         #
         #Assign rights object
         new_obj.rightsMD.content = rights_object
         print '- rights object assigned.'
         #
         #Build ir object
         ir_object = ir_builder.build_ir_object()
         print '- ir object built.'
         #
         #Assign ir object
         new_obj.irMD.content = ir_object
         print '- ir object assigned.'
         #
         #Build mods object
         #Example returned data: { 'data: mods_object, 'accession_number': accession_number }
         mods_object_dict = mods_builder.build_mods_object( item_data_dict, mods_schema_path, 'return_object' )  # or 'return_string'
         mods_object = mods_object_dict['data']
         print '- mods object built.'
         #
         #Assign mods object
         new_obj.mods.content = mods_object
         print '- mods object assigned.'
         #
         #Update default admin fields
         new_obj.label = mods_object.title
         new_obj.owner = 'Bell Gallery'
         print '- default admin fields updated.'
         #
         #Save to fedora
         self._save_to_fedora( new_obj )
         print '- saved to fedora.'
         #
         #Update logging
         print '- done.'
         self._update_task_tracker( message='new_pid:%s' % new_pid )
         #
         #Set next task
         task_manager.determine_next_task(
             unicode(sys._getframe().f_code.co_name),
             data={ 'item_data': item_data_dict, 'pid': new_pid },
             logger=logger
             )
         print '- next task set.'
     except Exception as e:
         error_message = 'in Task.create_fedora_metadata_object(); exception: %s' % unicode(repr(e))
         self.logger.info( error_message )
         raise Exception( error_message )
    def add_metadata_and_image(
        self,
        FEDORA_ADMIN_URL,
        FEDORA_ADMIN_USERNAME,
        FEDORA_ADMIN_PASSWORD,
        COLLECTION_PID,
        MASTER_IMAGES_DIR_PATH,
        MASTER_IMAGES_DIR_URL,
        JP2_IMAGES_DIR_PATH,
        JP2_IMAGES_DIR_URL,
        item_data_dict,
        mods_schema_path,
        logger=None,
    ):
        """ CONTROLLER
            Note: item_data_dict is a json entry from foundation/acc_num_to_data.py json """
        # print 'starting try...'
        # try:

        # Store logger if exists
        if logger:
            self.logger = logger
        # Store accession number
        self.accession_number = item_data_dict["calc_accession_id"]  # for logging
        #
        # Setup builders
        image_builder = ImageBuilder(logger)
        ir_builder = IRBuilder()
        mods_builder = ModsBuilder()
        rights_builder = RightsBuilder()
        #
        # Instantiate repo connection
        # Note: doesn't actually try to connect until it has to
        repo = Repository(root=FEDORA_ADMIN_URL, username=FEDORA_ADMIN_USERNAME, password=FEDORA_ADMIN_PASSWORD)
        print "- repo connection instantiated."
        #
        # Instantiate new-obj
        # Purpose: this will be the object we'll build, then ingest
        new_obj = repo.get_object(type=JP2Image)  # this image model _will_ handle either tiff or jpg
        print "- new_obj instantiated."
        #
        # Instantiate collection object
        coll_obj = repo.get_object(pid=COLLECTION_PID)
        print "- coll_obj instantiated."
        #
        # Get/reserve a pid
        # Note: after obtaining pid, new_obj.pid is a value, not a reference
        new_pid = new_obj.pid()
        new_obj.pid = new_pid
        print "- new_obj.pid obtained."
        #
        # Assign collection object
        new_obj.owning_collection = coll_obj
        print "- collection object assigned"
        #
        # Build rights object
        # Note: builds via bdrxml
        rights_object = rights_builder.build_rights_object()
        print "- rights object built."
        #
        # Assign rights object
        new_obj.rightsMD.content = rights_object
        print "- rights object assigned."
        #
        # Build ir object
        ir_object = ir_builder.build_ir_object()
        print "- ir object built."
        #
        # Assign ir object
        new_obj.irMD.content = ir_object
        print "- ir object assigned."
        #
        # Build mods object
        # Example returned data: { 'data: mods_object, 'accession_number': accession_number }
        mods_object_dict = mods_builder.build_mods_object(
            item_data_dict, mods_schema_path, "return_object"
        )  # or 'return_string'
        mods_object = mods_object_dict["data"]
        print "- mods object built."
        #
        # Assign mods object
        new_obj.mods.content = mods_object
        print "- mods object assigned."
        #
        # Update default admin fields
        new_obj.label = mods_object.title
        new_obj.owner = "Bell Gallery"
        print "- default admin fields updated."
        #
        #
        #
        # Update master datastream and rels-int
        master_filename = item_data_dict["object_image_scan_filename"]
        (file_url, dsID, mime_type) = image_builder.build_master_datastream_vars(
            filename=master_filename, image_dir_url=MASTER_IMAGES_DIR_URL
        )
        new_obj = image_builder.update_object_datastream(new_obj, dsID, file_url, mime_type)
        new_obj = image_builder.update_newobj_relsint(new_obj=new_obj, filename=master_filename, dsID=dsID)
        print "- master datastream and rels-int fields updated."
        #
        #
        #
        # Create jp2
        source_filepath = "%s/%s" % (MASTER_IMAGES_DIR_PATH, master_filename)
        self.logger.info(
            "in fedora_metadata_and_image_builder.add_metadata_and_image(); source_filepath, %s" % source_filepath
        )
        temp_jp2_filename = master_filename.replace(" ", "_")
        jp2_filename = temp_jp2_filename[0:-4] + ".jp2"
        destination_filepath = "%s/%s" % (JP2_IMAGES_DIR_PATH, jp2_filename)
        self.logger.info(
            "in fedora_metadata_and_image_builder.add_metadata_and_image(); destination_filepath, %s"
            % destination_filepath
        )
        image_builder.create_jp2(source_filepath, destination_filepath)
        print "- jp2 created."
        #
        #
        #
        # Update jp2 datastream and rels-int
        (file_url, dsID, mime_type) = image_builder.build_jp2_datastream_vars(
            filename=jp2_filename, image_dir_url=JP2_IMAGES_DIR_URL
        )
        new_obj = image_builder.update_object_datastream(new_obj, dsID, file_url, mime_type)
        new_obj = image_builder.update_newobj_relsint(new_obj=new_obj, filename=jp2_filename, dsID=dsID)
        print "- jp2 datastream and rels-int fields updated."
        #
        #
        #
        # Save to fedora
        self._save_to_fedora(new_obj)
        print "- saved to fedora."
        #
        # Update logging
        print "- done."
        self._update_task_tracker(message="new_pid:%s" % new_pid)
        #
        # Set next task
        task_manager.determine_next_task(
            unicode(sys._getframe().f_code.co_name), data={"item_data": item_data_dict, "pid": new_pid}, logger=logger
        )
        print "- next task set."
        return