def delete_metadata(client, metadata={}): print '>>> attempting to delete: ', metadata tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) package_xml = util.get_package_xml_contents(metadata) util.put_package_xml_in_directory(tmp_unpackaged, package_xml, True) empty_package_xml = util.get_empty_package_xml_contents() util.put_empty_package_xml_in_directory(tmp_unpackaged, empty_package_xml) zip_file = util.zip_directory(tmp, tmp) delete_result = client.delete(zipFile=zip_file, rollbackOnError=True) util.delete_directory(tmp)
def listMetadataAdvanced(self, metadata_type): try: metadata_type_def = mm_util.get_meta_type_by_name(metadata_type) if metadata_type_def == None: return [] has_children_metadata = False if 'childXmlNames' in metadata_type_def and type(metadata_type_def['childXmlNames']) is list: has_children_metadata = True is_folder_metadata = metadata_type_def['inFolder'] if is_folder_metadata == True: metadata_request_type = self.__transformFolderMetadataNameForListRequest(metadata_type) else: metadata_request_type = metadata_type list_response = self.listMetadata(metadata_request_type, True, mm_util.SFDC_API_VERSION) debug('--------------->') debug(list_response) if type(list_response) is not list: list_response = [list_response] #print list_response object_hash = {} #=> {"Account" => [ {"fields" => ["foo", "bar"]}, "listviews" => ["foo", "bar"] ], "Contact" => ... } if has_children_metadata == True and len(list_response) > 0: #metadata objects like customobject, workflow, etc. request_names = [] for element in list_response: #if element['fullName'] != 'PersonAccount': request_names.append(element['fullName']) retrieve_result = self.retrieve(package={ metadata_request_type : request_names }) #print '>>>> ',retrieve_result tmp = mm_util.put_tmp_directory_on_disk() mm_util.extract_base64_encoded_zip(retrieve_result.zipFile, tmp) #iterate extracted directory for dirname, dirnames, filenames in os.walk(os.path.join(tmp,"unpackaged",metadata_type_def['directoryName'])): for f in filenames: #f => Account.object full_file_path = os.path.join(dirname, f) data = mm_util.parse_xml_from_file(full_file_path) c_hash = {} for child_type in metadata_type_def['childXmlNames']: child_type_def = mm_util.get_meta_type_by_name(child_type) if child_type_def == None: #TODO handle newer child types continue tag_name = child_type_def['tagName'] items = [] try: if tag_name in data[metadata_request_type]: if type(data[metadata_request_type][tag_name]) is not list: data[metadata_request_type][tag_name] = [data[metadata_request_type][tag_name]] for i, val in enumerate(data[metadata_request_type][tag_name]): items.append(val['fullName']) except BaseException, e: #print 'exception >>>> ', e.message pass c_hash[tag_name] = items base_name = f.split(".")[0] object_hash[base_name] = c_hash shutil.rmtree(tmp) #print '>>> ',object_hash return_elements = [] for element in list_response: if config.connection.get_plugin_client_setting('mm_ignore_managed_metadata') == True: if 'manageableState' in element and element["manageableState"] != "unmanaged": continue children = [] full_name = element['fullName'] #if full_name == "PersonAccount": # full_name = "Account" #print 'processing: ', element if has_children_metadata == True: if not full_name in object_hash: continue object_detail = object_hash[full_name] if object_detail == None: continue for child in metadata_type_def['childXmlNames']: child_type_def = mm_util.get_meta_type_by_name(child) if child_type_def == None: #TODO: handle more complex types continue tag_name = child_type_def['tagName'] if len(object_detail[tag_name]) > 0: gchildren = [] for gchild_el in object_detail[tag_name]: gchildren.append({ "text" : gchild_el, "isFolder" : False, "checked" : False, "level" : 4, "leaf" : True, "id" : metadata_type_def['xmlName']+"."+full_name+"."+tag_name+"."+gchild_el, "select" : False, "title" : gchild_el }) children = sorted(children, key=itemgetter('text')) children.append({ "text" : child_type_def['tagName'], "isFolder" : True, "cls" : "folder", "children" : gchildren, "checked" : False, "level" : 3, "id" : metadata_type_def['xmlName']+"."+full_name+"."+tag_name, "select" : False, "title" : child_type_def['tagName'] }) #if this type has folders, run queries to grab all metadata in the folders if is_folder_metadata == True: if element["manageableState"] != "unmanaged": continue #print element["fullName"] list_request = { "type" : metadata_type, "folder" : element["fullName"] } list_basic_response = self.listMetadata(list_request, True, config.connection.sfdc_api_version) if type(list_basic_response) is not list: list_basic_response = [list_basic_response] for folder_element in list_basic_response: children.append({ "text" : folder_element['fullName'].split("/")[1], "leaf" : True, "isFolder" : False, "checked" : False, "level" : 3, "id" : folder_element['fullName'].replace('/', '.'), "select" : False, "title" : folder_element['fullName'].split("/")[1] }) children = sorted(children, key=itemgetter('text')) is_leaf = True cls = '' if is_folder_metadata: is_leaf = False cls = 'folder' if has_children_metadata: is_leaf = False cls = 'folder' if metadata_type_def['xmlName'] == 'Workflow': is_leaf = True cls = '' #print '>>> ',element return_elements.append({ "text" : element['fullName'], "isFolder" : is_folder_metadata or has_children_metadata, "cls" : cls, "leaf" : is_leaf, "children" : children, "checked" : False, "level" : 2, "id" : metadata_type_def['xmlName']+'.'+full_name.replace(' ', ''), "select" : False, "title" : element['fullName'] }) return_elements = sorted(return_elements, key=itemgetter('text')) # if list_response == []: # return list_response # return list_response return return_elements