def execute(self): sfdc_client = config.sfdc_client empty_package_xml = util.get_empty_package_xml_contents() tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) util.put_empty_package_xml_in_directory(tmp_unpackaged, empty_package_xml) zip_file = util.zip_directory(tmp, tmp) deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True, "classes" : self.params.get('classes', []), "debug_categories" : self.params.get('debug_categories', []) } deploy_result = sfdc_client.deploy(deploy_params,is_test=True) #debug(deploy_result) d = xmltodict.parse(deploy_result,postprocessor=util.xmltodict_postprocessor) if int(float(util.SFDC_API_VERSION)) >= 29: result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result']['details']['runTestResult'] else: result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result']['runTestResult'] try: result['log'] = d["soapenv:Envelope"]["soapenv:Header"]["DebuggingInfo"]["debugLog"] except: result['log'] = 'Log not available.' shutil.rmtree(tmp) if self.args.respond_with_html: html = util.generate_html_response(self.args.operation, result, self.params) return util.generate_success_response(html, "html") else: return result
def execute(self): sfdc_client = config.sfdc_client empty_package_xml = util.get_empty_package_xml_contents() tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) util.put_empty_package_xml_in_directory(tmp_unpackaged, empty_package_xml) zip_file = util.zip_directory(tmp, tmp) deploy_params = { "zip_file": zip_file, "rollback_on_error": True, "ret_xml": True, "classes": self.params.get('classes', []), "debug_categories": self.params.get('debug_categories', []) } deploy_result = sfdc_client.deploy(deploy_params, is_test=True) #debug(deploy_result) d = xmltodict.parse(deploy_result, postprocessor=util.xmltodict_postprocessor) if int(float(util.SFDC_API_VERSION)) >= 29: result = d["soapenv:Envelope"]["soapenv:Body"][ 'checkDeployStatusResponse']['result']['details'][ 'runTestResult'] else: result = d["soapenv:Envelope"]["soapenv:Body"][ 'checkDeployStatusResponse']['result']['runTestResult'] try: result['log'] = d["soapenv:Envelope"]["soapenv:Header"][ "DebuggingInfo"]["debugLog"] except: result['log'] = 'Log not available.' shutil.rmtree(tmp) if self.args.respond_with_html: html = util.generate_html_response(self.args.operation, result, self.params) return util.generate_success_response(html, "html") else: return result
def execute(self): project = config.project sfdc_client = config.sfdc_client files = self.params.get('files', None) for f in files: if '-meta.xml' in f: corresponding_file = f.split('-meta.xml')[0] if corresponding_file not in files: files.append(corresponding_file) for f in files: if '-meta.xml' in f: continue file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type['metaFile'] == True: corresponding_file = f + '-meta.xml' if corresponding_file not in files: files.append(corresponding_file) metadata_package_dict = util.get_metadata_hash(files) tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) package_xml = util.get_package_xml_contents(metadata_package_dict) 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) purge_on_delete_setting = config.connection.get_plugin_client_setting("mm_purge_on_delete", False); if purge_on_delete_setting: describe_result = config.sfdc_client.describeMetadata(retXml=False) if describe_result.testRequired == True: purge_on_delete_setting = False deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True, "purge_on_delete" : purge_on_delete_setting } delete_result = sfdc_client.delete(deploy_params) d = xmltodict.parse(delete_result,postprocessor=util.xmltodict_postprocessor) shutil.rmtree(tmp) result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result'] if result['success'] == True: removed = [] for f in files: try: file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type == None or not 'directoryName' in metadata_type: continue; directory = metadata_type['directoryName'] filepath = os.path.join(project.location, "src", directory, f) metapath = os.path.join(project.location, "src", directory, f + '-meta.xml') os.remove(filepath) os.remove(metapath) # remove the entry in file properties project.conflict_manager.remove_from_local_store(f) removed.append(f) except Exception, e: print e.message return util.generate_success_response("Removed metadata files: " + (",".join(removed)))
def execute(self): project = config.project files = self.params.get('files', None) use_tooling_api = config.connection.get_plugin_client_setting('mm_compile_with_tooling_api', False) check_for_conflicts = config.connection.get_plugin_client_setting('mm_compile_check_conflicts', False) compiling_apex_metadata = True for f in files: if f.split('.')[-1] not in util.TOOLING_API_EXTENSIONS: #cannot use tooling api compiling_apex_metadata = False break #when compiling apex metadata, check to see if it is newer on the server if check_for_conflicts and compiling_apex_metadata: if 'action' not in self.params or self.params['action'] != 'overwrite': has_conflict, msg = config.project.conflict_manager.check_for_conflicts(files) if has_conflict: return msg #use tooling api here, if possible if use_tooling_api == True and compiling_apex_metadata and int(float(util.SFDC_API_VERSION)) >= 27: if 'metadata_container' not in project.settings or project.settings['metadata_container'] == None: container_id = project.sfdc_client.get_metadata_container_id() new_settings = project.settings new_settings['metadata_container'] = container_id project.put_settings_file(new_settings) else: container_id = project.settings['metadata_container'] file_ext = files[0].split('.')[-1] try: result = project.sfdc_client.compile_with_tooling_api(files, container_id) except MetadataContainerException as e: project.sfdc_client.delete_mavensmate_metadatacontainers_for_this_user() response = project.sfdc_client.new_metadatacontainer_for_this_user() project.update_setting("metadata_container",response["id"]) #return CompileSelectedMetadataCommand(params=self.params,args=self.args).execute() #ensure only a single retry result = project.sfdc_client.compile_with_tooling_api(files, response["id"]) if 'Id' in result and 'State' in result: if result['State'] == 'Completed': project.conflict_manager.refresh_local_store(files=files) return util.generate_response(result) #the user has either chosen not to use the tooling api, or it's non apex metadata else: try: for f in files: if '-meta.xml' in f: corresponding_file = f.split('-meta.xml')[0] if corresponding_file not in files: files.append(corresponding_file) for f in files: if '-meta.xml' in f: continue file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type == None: if sys.platform == "win32": dir_parts = f.split("\\") else: dir_parts = f.split("/") if 'documents' in dir_parts: metadata_type = util.get_meta_type_by_name("Document") if metadata_type != None and 'metaFile' in metadata_type and metadata_type['metaFile'] == True: corresponding_file = f + '-meta.xml' if corresponding_file not in files: files.append(corresponding_file) metadata_package_dict = util.get_metadata_hash(files) #debug(metadata_package_dict) tmp = util.put_tmp_directory_on_disk() os.makedirs(os.path.join(tmp,"unpackaged")) #copy files from project directory to tmp for full_file_path in files: if 'package.xml' in full_file_path: continue if config.is_windows: destination = os.path.join(tmp,'unpackaged',full_file_path.split('\src\\')[1]) else: destination = os.path.join(tmp,'unpackaged',full_file_path.split('/src/')[1]) destination_directory = os.path.dirname(destination) if not os.path.exists(destination_directory): os.makedirs(destination_directory) shutil.copy2(full_file_path, destination_directory) package_xml = util.get_package_xml_contents(metadata_package_dict) util.put_package_xml_in_directory(os.path.join(tmp,"unpackaged"), package_xml) zip_file = util.zip_directory(tmp, tmp) deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True } deploy_result = project.sfdc_client.deploy(deploy_params) d = xmltodict.parse(deploy_result,postprocessor=util.xmltodict_postprocessor) result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result'] shutil.rmtree(tmp) # Get new properties for the files we just compiled if result['success'] == True: project.conflict_manager.refresh_local_store(files=files) return json.dumps(result) except Exception, e: try: shutil.rmtree(tmp) except: pass return util.generate_error_response(e.message)
def execute(self): project = config.project sfdc_client = config.sfdc_client metadata_type = self.params.get('metadata_type', None) github_template = self.params.get('github_template', None) params = self.params.get('params', None) if params == None: raise MMException('The payload to create metadata has recently changed. If you are using Sublime Text, you likely need to update your MavensMate plugin to 3.4.8+') if "api_name" not in params or params["api_name"] == None: return util.generate_error_response("You must provide a name for the new metadata.") api_name = params.get('api_name') if sfdc_client.does_metadata_exist(object_type=metadata_type, name=api_name) == True: mt = util.get_meta_type_by_name(metadata_type) filepath = os.path.join(project.location, 'src', mt['directoryName'], api_name+'.'+mt['suffix']) fetched = "" if not os.path.exists(filepath): self.params['files'] = [filepath] RefreshSelectedMetadataCommand(params=self.params,args=self.args).execute() fetched = ", fetched metadata file from server" raise MMException("This API name is already in use in your org" + fetched + ".") tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) util.put_skeleton_files_on_disk(metadata_type, tmp_unpackaged, github_template, params) package_xml_body = util.get_package_xml_contents({metadata_type : [ api_name ]}) util.put_package_xml_in_directory(tmp_unpackaged, package_xml_body) zip_file = util.zip_directory(tmp, tmp) deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True } deploy_result = sfdc_client.deploy(deploy_params) d = xmltodict.parse(deploy_result,postprocessor=util.xmltodict_postprocessor) meta_dir = "" files = [] path = None for dirname, dirnames, filenames in os.walk(tmp_unpackaged): for filename in filenames: if 'package.xml' in filename: continue full_file_path = os.path.join(dirname, filename) if '-meta.xml' in filename: extension = filename.replace('-meta.xml','').split(".")[-1] else: extension = filename.split(".")[-1] mt = util.get_meta_type_by_suffix(extension) if mt != None: meta_dir = mt['directoryName'] path = os.path.join(project.location, 'src', meta_dir) if not os.path.exists(path): os.makedirs(path) files.append(os.path.join(path, filename)) elif extension != "xml": continue; # only apex files and meta.xml files should make it to here shutil.copy(full_file_path, path) shutil.rmtree(tmp) project.update_package_xml_with_metadata(metadata_type, api_name) project.conflict_manager.refresh_local_store(files=files) return json.dumps(d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result'])
def listMetadataAdvanced(self, metadata_type): try: metadata_type_def = 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 = 'inFolder' in metadata_type_def and 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, 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 = util.put_tmp_directory_on_disk() 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 = util.parse_xml_from_file(full_file_path) c_hash = {} for child_type in metadata_type_def['childXmlNames']: child_type_def = 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 = 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 config.connection.get_plugin_client_setting('mm_ignore_managed_metadata', True): if 'manageableState' in element and 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