def __createUpdateLanguage(self, localizationTree, langId, langVal, isEdit=False): langName = languages.languageNameForId(langId) localizationSaveAction = localizationTree.xpath('//div[@class="lcAjaxLightboxContents"]/@action')[0] languageSelect = None langSelectName = None langSelectValue = None langFormData = {} if isEdit == False: languageSelect = localizationTree.xpath('//select[@id="language-popup"]')[0] langSelectName = languageSelect.xpath('./@name')[0] langSelectValue = languageSelect.xpath('./option[.="' + langName + '"]/@value')[0] langFormData[langSelectName] = langSelectValue nameElementName = localizationTree.xpath('//div[@id="proposedDisplayName"]//input/@name')[0] descriptionElementName = localizationTree.xpath('//div[@id="proposedDescription"]//textarea/@name')[0] publicationName = localizationTree.xpath('//div[@id="proposedPublicationName"]//input/@name') if len(publicationName) > 0: publicationName = publicationName[0] langFormData[publicationName] = langVal['publication name'] langFormData[nameElementName] = langVal['name'] langFormData[descriptionElementName] = langVal['description'] langFormData['save'] = "true" postFormResponse = requests.post(ITUNESCONNECT_URL + localizationSaveAction, data = langFormData, cookies=cookie_jar) if postFormResponse.status_code != 200: raise 'Wrong response from iTunesConnect. Status code: ' + str(postFormResponse.status_code) if len(postFormResponse.text) > 0: logging.error("Save information failed. " + postFormResponse.text)
def __createUpdateLanguage(self, localizationTree, langId, langVal, isEdit=False): langName = languages.languageNameForId(langId) localizationSaveAction = localizationTree.xpath( '//div[@class="lcAjaxLightboxContents"]/@action')[0] languageSelect = None langSelectName = None langSelectValue = None langFormData = {} if isEdit == False: languageSelect = localizationTree.xpath( '//select[@id="language-popup"]')[0] langSelectName = languageSelect.xpath('./@name')[0] langSelectValue = languageSelect.xpath('./option[.="' + langName + '"]/@value')[0] langFormData[langSelectName] = langSelectValue nameElementName = localizationTree.xpath( '//div[@id="proposedDisplayName"]//input/@name')[0] descriptionElementName = localizationTree.xpath( '//div[@id="proposedDescription"]//textarea/@name')[0] publicationName = localizationTree.xpath( '//div[@id="proposedPublicationName"]//input/@name') if len(publicationName) > 0: publicationName = publicationName[0] langFormData[publicationName] = langVal['publication name'] langFormData[nameElementName] = langVal['name'] langFormData[descriptionElementName] = langVal['description'] langFormData['save'] = "true" postFormResponse = self._parser.requests_session.post( ITUNESCONNECT_URL + localizationSaveAction, data=langFormData, cookies=cookie_jar) if postFormResponse.status_code != 200: raise 'Wrong response from iTunesConnect. Status code: ' + str( postFormResponse.status_code) if len(postFormResponse.text) > 0: logging.error("Save information failed. " + postFormResponse.text)
def createNewApp(self, appDictionary=None, filename_format=None): if appDictionary == None or len(appDictionary) == 0 or 'new app' not in appDictionary: # no data to create app from return newAppMetadata = appDictionary['new app'] metadata = self._parser.parseFirstAppCreatePageForm() formData = {} formNames = metadata.formNames submitAction = metadata.submitAction formData[formNames['default language']] = metadata.languageIds[languages.languageNameForId(newAppMetadata['default language'])] formData[formNames['app name']] = newAppMetadata['name'] formData[formNames['sku number']] = newAppMetadata['sku number'] formData[formNames['bundle id suffix']] = newAppMetadata['bundle id suffix'] formData[formNames['bundle id']] = next(value for (key, value) in metadata.bundleIds.iteritems() if key.endswith(' - ' + newAppMetadata['bundle id'])) formData[formNames['continue action'] + '.x'] = "0" formData[formNames['continue action'] + '.y'] = "0" logging.debug(formData) secondPageTree = self._parser.parseTreeForURL(submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(secondPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error) return metadata = self._parser.parseSecondAppCreatePageForm(secondPageTree) formData = {} formNames = metadata.formNames submitAction = metadata.submitAction date = datetime.strptime(newAppMetadata['availability date'], '%b %d %Y') formData[formNames['date day']] = date.day - 1 formData[formNames['date month']] = date.month - 1 formData[formNames['date year']] = date.year - datetime.today().year formData[formNames['price tier']] = newAppMetadata['price tier'] if 'discount' in newAppMetadata and newAppMetadata['discount']: formData[formNames['discount']] = formNames['discount'] if 'countries' in newAppMetadata: self.__manageCountries(metadata.countries, newAppMetadata['countries'], formData) formData[formNames['continue action'] + '.x'] = "0" formData[formNames['continue action'] + '.y'] = "0" thirdPageTree = self._parser.parseTreeForURL(submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(thirdPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error) return metadata = self._parser.parseThirdAppCreatePageForm(thirdPageTree, fetchSubcategories=newAppMetadata['primary category']) formData = {} formNames = metadata.formNames iconUploadScreenshotForm = formNames['iconUploadScreenshotForm'] iphoneUploadScreenshotForm = formNames['iphoneUploadScreenshotForm'] iphone5UploadScreenshotForm = formNames['iphone5UploadScreenshotForm'] ipadUploadScreenshotForm = formNames['ipadUploadScreenshotForm'] tfUploadForm = formNames['tfUploadForm'] iconUploadScreenshotJS = iconUploadScreenshotForm.xpath('../following-sibling::script/text()')[0] iphoneUploadScreenshotJS = iphoneUploadScreenshotForm.xpath('../following-sibling::script/text()')[0] iphone5UploadScreenshotJS = iphone5UploadScreenshotForm.xpath('../following-sibling::script/text()')[0] ipadUploadScreenshotJS = ipadUploadScreenshotForm.xpath('../following-sibling::script/text()')[0] tfUploadJS = tfUploadForm.xpath('../following-sibling::script/text()')[0] self._uploadSessionData['icon'] = dict({'action': iconUploadScreenshotForm.attrib['action'] , 'key': iconUploadScreenshotForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseStatusURLSFromScript(iconUploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPhone] = dict({'action': iphoneUploadScreenshotForm.attrib['action'] , 'key': iphoneUploadScreenshotForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(iphoneUploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPhone5] = dict({'action': iphone5UploadScreenshotForm.attrib['action'] , 'key': iphone5UploadScreenshotForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(iphone5UploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPad] = dict({'action': ipadUploadScreenshotForm.attrib['action'] , 'key': ipadUploadScreenshotForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(ipadUploadScreenshotJS)) self._uploadSessionData['tf'] = dict({'action': tfUploadForm.attrib['action'] , 'key': tfUploadForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseStatusURLSFromScript(tfUploadJS)) self._uploadSessionId = iphoneUploadScreenshotForm.xpath('.//input[@name="uploadSessionID"]/@value')[0] for device_type in ['icon', DEVICE_TYPE.iPhone, DEVICE_TYPE.iPhone5, DEVICE_TYPE.iPad]: self._images[device_type] = self.imagesForDevice(device_type) logging.debug(self._images) #uploading icon self.uploadScreenshot('icon', newAppMetadata['large app icon']['file name format']) self._images['icon'] = self.imagesForDevice('icon') screenshots = newAppMetadata['screenshots'] replace_language = ALIASES.language_aliases.get(newAppMetadata['default language'], newAppMetadata['default language']) langImagePath = filename_format.replace('{language}', replace_language) for dType, indexes in screenshots.items(): device_type = None if dType.lower() == 'iphone': device_type = DEVICE_TYPE.iPhone elif dType.lower() == 'iphone 5': device_type = DEVICE_TYPE.iPhone5 elif dType.lower() == 'ipad': device_type = DEVICE_TYPE.iPad replace_device = ALIASES.device_type_aliases.get(dType.lower(), DEVICE_TYPE.deviceStrings[device_type]) imagePath = langImagePath.replace('{device_type}', replace_device) logging.info('Looking for images at ' + imagePath) for i in indexes: realImagePath = imagePath.replace("{index}", str(i)) self.uploadScreenshot(device_type, realImagePath) self._images[device_type] = self.imagesForDevice(device_type) formData[formNames['version number']] = newAppMetadata['version'] formData[formNames['copyright']] = newAppMetadata['copyright'] formData[formNames['primary category']] = metadata.categories[newAppMetadata['primary category']] if metadata.subcategories != None and len(metadata.subcategories) != 0: if 'primary subcategory 1' in newAppMetadata: formData[formNames['primary subcategory 1']] = metadata.subcategories[newAppMetadata['primary subcategory 1']] if 'primary subcategory 2' in newAppMetadata: formData[formNames['primary subcategory 2']] = metadata.subcategories[newAppMetadata['primary subcategory 2']] if 'secondary subcategory 1' in newAppMetadata: formData[formNames['secondary subcategory 1']] = metadata.subcategories[newAppMetadata['secondary subcategory 1']] if 'secondary subcategory 2' in newAppMetadata: formData[formNames['secondary subcategory 2']] = metadata.subcategories[newAppMetadata['secondary subcategory 2']] if 'secondary category' in newAppMetadata: formData[formNames['secondary category']] = metadata.categories[newAppMetadata['secondary category']] appRatings = metadata.appRatings for index, rating in enumerate(newAppMetadata['app rating']): formData[appRatings[index]['name']] = appRatings[index]['ratings'][rating] if 'eula text' in newAppMetadata: formData[formNames['eula text']] = dataFromStringOrFile(newAppMetadata['eula text']) if 'eula countries' in newAppMetadata: self.__manageCountries(metadata.eulaCountries, newAppMetadata['eula countries'], formData) formData[formNames['description']] = dataFromStringOrFile(newAppMetadata['description']) formData[formNames['keywords']] = dataFromStringOrFile(newAppMetadata['keywords']) formData[formNames['support url']] = newAppMetadata['support url'] formData[formNames['marketing url']] = newAppMetadata.get('marketing url') formData[formNames['privacy policy url']] = newAppMetadata.get('privacy policy url') appReviewInfo = appDictionary['app review information'] formData[formNames['first name']] = appReviewInfo['first name'] formData[formNames['last name']] = appReviewInfo['last name'] formData[formNames['email address']] = appReviewInfo['email address'] formData[formNames['phone number']] = appReviewInfo['phone number'] formData[formNames['review notes']] = dataFromStringOrFile(appReviewInfo.get('review notes')) formData[formNames['username']] = appReviewInfo.get('demo username') formData[formNames['password']] = appReviewInfo.get('demo password') finalPageTree = self._parser.parseTreeForURL(metadata.submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(finalPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error)
def createNewApp(self, appDictionary=None, filename_format=None): if appDictionary == None or len( appDictionary ) == 0 or 'new app' not in appDictionary: # no data to create app from return newAppMetadata = appDictionary['new app'] metadata = self._parser.parseFirstAppCreatePageForm() formData = {} formNames = metadata.formNames submitAction = metadata.submitAction formData[formNames['default language']] = metadata.languageIds[ languages.languageNameForId(newAppMetadata['default language'])] formData[formNames['app name']] = newAppMetadata['name'] formData[formNames['sku number']] = newAppMetadata['sku number'] formData[ formNames['bundle id suffix']] = newAppMetadata['bundle id suffix'] formData[formNames['bundle id']] = next( value for (key, value) in metadata.bundleIds.iteritems() if key.endswith(' - ' + newAppMetadata['bundle id'])) formData[formNames['continue action'] + '.x'] = "0" formData[formNames['continue action'] + '.y'] = "0" logging.debug(formData) secondPageTree = self._parser.parseTreeForURL(submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(secondPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error) return metadata = self._parser.parseSecondAppCreatePageForm(secondPageTree) formData = {} formNames = metadata.formNames submitAction = metadata.submitAction date = datetime.strptime(newAppMetadata['availability date'], '%b %d %Y') formData[formNames['date day']] = date.day - 1 formData[formNames['date month']] = date.month - 1 formData[formNames['date year']] = date.year - datetime.today().year formData[formNames['price tier']] = newAppMetadata['price tier'] if 'discount' in newAppMetadata and newAppMetadata['discount']: formData[formNames['discount']] = formNames['discount'] if 'countries' in newAppMetadata: self.__manageCountries(metadata.countries, newAppMetadata['countries'], formData) formData[formNames['continue action'] + '.x'] = "0" formData[formNames['continue action'] + '.y'] = "0" thirdPageTree = self._parser.parseTreeForURL(submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(thirdPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error) return metadata = self._parser.parseThirdAppCreatePageForm( thirdPageTree, fetchSubcategories=newAppMetadata['primary category']) formData = {} formNames = metadata.formNames iconUploadScreenshotForm = formNames['iconUploadScreenshotForm'] iphoneUploadScreenshotForm = formNames['iphoneUploadScreenshotForm'] iphone5UploadScreenshotForm = formNames['iphone5UploadScreenshotForm'] ipadUploadScreenshotForm = formNames['ipadUploadScreenshotForm'] tfUploadForm = formNames['tfUploadForm'] iconUploadScreenshotJS = iconUploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] iphoneUploadScreenshotJS = iphoneUploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] iphone5UploadScreenshotJS = iphone5UploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] ipadUploadScreenshotJS = ipadUploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] tfUploadJS = tfUploadForm.xpath( '../following-sibling::script/text()')[0] self._uploadSessionData['icon'] = dict( { 'action': iconUploadScreenshotForm.attrib['action'], 'key': iconUploadScreenshotForm.xpath( ".//input[@name='uploadKey']/@value")[0] }, **self.parseStatusURLSFromScript(iconUploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPhone] = dict( { 'action': iphoneUploadScreenshotForm.attrib['action'], 'key': iphoneUploadScreenshotForm.xpath( ".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(iphoneUploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPhone5] = dict( { 'action': iphone5UploadScreenshotForm.attrib['action'], 'key': iphone5UploadScreenshotForm.xpath( ".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(iphone5UploadScreenshotJS)) self._uploadSessionData[DEVICE_TYPE.iPad] = dict( { 'action': ipadUploadScreenshotForm.attrib['action'], 'key': ipadUploadScreenshotForm.xpath( ".//input[@name='uploadKey']/@value")[0] }, **self.parseURLSFromScript(ipadUploadScreenshotJS)) self._uploadSessionData['tf'] = dict( { 'action': tfUploadForm.attrib['action'], 'key': tfUploadForm.xpath(".//input[@name='uploadKey']/@value")[0] }, **self.parseStatusURLSFromScript(tfUploadJS)) self._uploadSessionId = iphoneUploadScreenshotForm.xpath( './/input[@name="uploadSessionID"]/@value')[0] for device_type in [ 'icon', DEVICE_TYPE.iPhone, DEVICE_TYPE.iPhone5, DEVICE_TYPE.iPad ]: self._images[device_type] = self.imagesForDevice(device_type) logging.debug(self._images) #uploading icon self.uploadScreenshot( 'icon', newAppMetadata['large app icon']['file name format']) self._images['icon'] = self.imagesForDevice('icon') screenshots = newAppMetadata['screenshots'] replace_language = ALIASES.language_aliases.get( newAppMetadata['default language'], newAppMetadata['default language']) langImagePath = filename_format.replace('{language}', replace_language) for dType, indexes in screenshots.items(): device_type = None if dType.lower() == 'iphone': device_type = DEVICE_TYPE.iPhone elif dType.lower() == 'iphone 5': device_type = DEVICE_TYPE.iPhone5 elif dType.lower() == 'ipad': device_type = DEVICE_TYPE.iPad replace_device = ALIASES.device_type_aliases.get( dType.lower(), DEVICE_TYPE.deviceStrings[device_type]) imagePath = langImagePath.replace('{device_type}', replace_device) logging.info('Looking for images at ' + imagePath) for i in indexes: realImagePath = imagePath.replace("{index}", str(i)) self.uploadScreenshot(device_type, realImagePath) self._images[device_type] = self.imagesForDevice(device_type) formData[formNames['version number']] = newAppMetadata['version'] formData[formNames['copyright']] = newAppMetadata['copyright'] formData[formNames['primary category']] = metadata.categories[ newAppMetadata['primary category']] if metadata.subcategories != None and len(metadata.subcategories) != 0: if 'primary subcategory 1' in newAppMetadata: formData[formNames[ 'primary subcategory 1']] = metadata.subcategories[ newAppMetadata['primary subcategory 1']] if 'primary subcategory 2' in newAppMetadata: formData[formNames[ 'primary subcategory 2']] = metadata.subcategories[ newAppMetadata['primary subcategory 2']] if 'secondary subcategory 1' in newAppMetadata: formData[formNames[ 'secondary subcategory 1']] = metadata.subcategories[ newAppMetadata['secondary subcategory 1']] if 'secondary subcategory 2' in newAppMetadata: formData[formNames[ 'secondary subcategory 2']] = metadata.subcategories[ newAppMetadata['secondary subcategory 2']] if 'secondary category' in newAppMetadata: formData[formNames['secondary category']] = metadata.categories[ newAppMetadata['secondary category']] appRatings = metadata.appRatings for index, rating in enumerate(newAppMetadata['app rating']): formData[appRatings[index] ['name']] = appRatings[index]['ratings'][rating] if 'eula text' in newAppMetadata: formData[formNames['eula text']] = dataFromStringOrFile( newAppMetadata['eula text']) if 'eula countries' in newAppMetadata: self.__manageCountries(metadata.eulaCountries, newAppMetadata['eula countries'], formData) formData[formNames['description']] = dataFromStringOrFile( newAppMetadata['description']) formData[formNames['keywords']] = dataFromStringOrFile( newAppMetadata['keywords']) formData[formNames['support url']] = newAppMetadata['support url'] formData[formNames['marketing url']] = newAppMetadata.get( 'marketing url') formData[formNames['privacy policy url']] = newAppMetadata.get( 'privacy policy url') appReviewInfo = appDictionary['app review information'] formData[formNames['first name']] = appReviewInfo['first name'] formData[formNames['last name']] = appReviewInfo['last name'] formData[formNames['email address']] = appReviewInfo['email address'] formData[formNames['phone number']] = appReviewInfo['phone number'] formData[formNames['review notes']] = dataFromStringOrFile( appReviewInfo.get('review notes')) formData[formNames['username']] = appReviewInfo.get('demo username') formData[formNames['password']] = appReviewInfo.get('demo password') finalPageTree = self._parser.parseTreeForURL(metadata.submitAction, method="POST", payload=formData) errors = self._parser.checkPageForErrors(finalPageTree) if errors != None and len(errors) != 0: for error in errors: logging.error(error)