def addVersion(self, version, langActions): if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' if self._addVersionLink == None: raise 'Can\'t find \'Add Version\' link.' logging.info('Parsing \'Add Version\' page') tree = self._parser.parseTreeForURL(self._addVersionLink) metadata = self._parser.parseAddVersionPageMetadata(tree) formData = { metadata.saveButton + '.x': 46, metadata.saveButton + '.y': 10 } formData[metadata.formNames['version']] = version defaultWhatsNew = langActions.get('default', {}).get('whats new', '') logging.debug('Default what\'s new: ' + defaultWhatsNew.__str__()) for lang, taName in metadata.formNames['languages'].items(): languageCode = languages.langCodeForLanguage(lang) whatsNew = langActions.get(lang, {}).get('whats new', defaultWhatsNew) if (isinstance(whatsNew, dict)): whatsNew = dataFromStringOrFile(whatsNew, languageCode) formData[taName] = whatsNew self._parser.requests_session.post(ITUNESCONNECT_URL + metadata.submitAction, data=formData, cookies=cookie_jar)
def editReviewInformation(self, appReviewInfo): if appReviewInfo == None or len( appReviewInfo) == 0: # nothing to change return if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' versionString = next( (versionString for versionString, version in self.versions.items() if version['editable']), None) if versionString == None: # Suppose there's one or less editable versions raise 'No editable version found' version = self.versions[versionString] if not version['editable']: raise 'Version ' + versionString + ' is not editable' metadata = self.__parseAppReviewInformation(version) formData = {} formNames = metadata.formNames submitAction = metadata.submitAction formData["save"] = "true" formData[formNames['first name']] = appReviewInfo.get( 'first name', metadata.formData['first name']) formData[formNames['last name']] = appReviewInfo.get( 'last name', metadata.formData['last name']) formData[formNames['email address']] = appReviewInfo.get( 'email address', metadata.formData['email address']) formData[formNames['phone number']] = appReviewInfo.get( 'phone number', metadata.formData['phone number']) formData[formNames['review notes']] = dataFromStringOrFile( appReviewInfo.get('review notes', metadata.formData['review notes'])) formData[formNames['username']] = appReviewInfo.get( 'username', metadata.formData['username']) formData[formNames['password']] = appReviewInfo.get( 'password', metadata.formData['password']) logging.debug(formData) postFormResponse = self._parser.requests_session.post( ITUNESCONNECT_URL + submitAction, data=formData, 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 editReviewInformation(self, appReviewInfo): if appReviewInfo == None or len(appReviewInfo) == 0: # nothing to change return if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise "Can't get application versions" versionString = next( (versionString for versionString, version in self.versions.items() if version["editable"]), None ) if versionString == None: # Suppose there's one or less editable versions raise "No editable version found" version = self.versions[versionString] if not version["editable"]: raise "Version " + versionString + " is not editable" metadata = self.__parseAppReviewInformation(version) formData = {} formNames = metadata.formNames submitAction = metadata.submitAction formData["save"] = "true" formData[formNames["first name"]] = appReviewInfo.get("first name", metadata.formData["first name"]) formData[formNames["last name"]] = appReviewInfo.get("last name", metadata.formData["last name"]) formData[formNames["email address"]] = appReviewInfo.get("email address", metadata.formData["email address"]) formData[formNames["phone number"]] = appReviewInfo.get("phone number", metadata.formData["phone number"]) formData[formNames["review notes"]] = dataFromStringOrFile( appReviewInfo.get("review notes", metadata.formData["review notes"]) ) formData[formNames["username"]] = appReviewInfo.get("username", metadata.formData["username"]) formData[formNames["password"]] = appReviewInfo.get("password", metadata.formData["password"]) logging.debug(formData) postFormResponse = self._parser.requests_session.post( ITUNESCONNECT_URL + submitAction, data=formData, 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 editReviewInformation(self, appReviewInfo): if appReviewInfo == None or len(appReviewInfo) == 0: # nothing to change return if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' versionString = next((versionString for versionString, version in self.versions.items() if version['editable']), None) if versionString == None: # Suppose there's one or less editable versions raise 'No editable version found' version = self.versions[versionString] if not version['editable']: raise 'Version ' + versionString + ' is not editable' metadata = self.__parseAppReviewInformation(version) formData = {} formNames = metadata.formNames submitAction = metadata.submitAction formData["save"] = "true" formData[formNames['first name']] = appReviewInfo.get('first name', metadata.formData['first name']) formData[formNames['last name']] = appReviewInfo.get('last name', metadata.formData['last name']) formData[formNames['email address']] = appReviewInfo.get('email address', metadata.formData['email address']) formData[formNames['phone number']] = appReviewInfo.get('phone number', metadata.formData['phone number']) formData[formNames['review notes']] = dataFromStringOrFile(appReviewInfo.get('review notes', metadata.formData['review notes'])) formData[formNames['username']] = appReviewInfo.get('username', metadata.formData['username']) formData[formNames['password']] = appReviewInfo.get('password', metadata.formData['password']) logging.debug(formData) postFormResponse = self._parser.requests_session.post(ITUNESCONNECT_URL + submitAction, data = formData, 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 addVersion(self, version, langActions): if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' if self._addVersionLink == None: raise 'Can\'t find \'Add Version\' link.' logging.info('Parsing \'Add Version\' page') tree = self._parser.parseTreeForURL(self._addVersionLink) metadata = self._parser.parseAddVersionPageMetadata(tree) formData = {metadata.saveButton + '.x': 46, metadata.saveButton + '.y': 10} formData[metadata.formNames['version']] = version defaultWhatsNew = langActions.get('default', {}).get('whats new', '') logging.debug('Default what\'s new: ' + defaultWhatsNew.__str__()) for lang, taName in metadata.formNames['languages'].items(): languageCode = languages.langCodeForLanguage(lang) whatsNew = langActions.get(lang, {}).get('whats new', defaultWhatsNew) if (isinstance(whatsNew, dict)): whatsNew = dataFromStringOrFile(whatsNew, languageCode) formData[taName] = whatsNew self._parser.requests_session.post(ITUNESCONNECT_URL + metadata.submitAction, data = formData, cookies=cookie_jar)
def addVersion(self, version, langActions): if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise "Can't get application versions" if self._addVersionLink == None: raise "Can't find 'Add Version' link." logging.info("Parsing 'Add Version' page") tree = self._parser.parseTreeForURL(self._addVersionLink) metadata = self._parser.parseAddVersionPageMetadata(tree) formData = {metadata.saveButton + ".x": 46, metadata.saveButton + ".y": 10} formData[metadata.formNames["version"]] = version defaultWhatsNew = langActions.get("default", {}).get("whats new", "") logging.debug("Default what's new: " + defaultWhatsNew.__str__()) for lang, taName in metadata.formNames["languages"].items(): languageCode = languages.langCodeForLanguage(lang) whatsNew = langActions.get(lang, {}).get("whats new", defaultWhatsNew) if isinstance(whatsNew, dict): whatsNew = dataFromStringOrFile(whatsNew, languageCode) formData[taName] = whatsNew self._parser.requests_session.post(ITUNESCONNECT_URL + metadata.submitAction, data=formData, cookies=cookie_jar)
def editVersion(self, dataDict, lang=None, versionString=None, filename_format=None): if dataDict == None or len(dataDict) == 0: # nothing to change return if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' if versionString == None: # Suppose there's one or less editable versions versionString = next((versionString for versionString, version in self.versions.items() if version['editable']), None) if versionString == None: # Suppose there's one or less editable versions raise 'No editable version found' version = self.versions[versionString] if not version['editable']: raise 'Version ' + versionString + ' is not editable' languageId = languages.appleLangIdForLanguage(lang) languageCode = languages.langCodeForLanguage(lang) metadata = self.__parseAppVersionMetadata(version, lang) # activatedLanguages = metadata.activatedLanguages # nonactivatedLanguages = metadata.nonactivatedLanguages formData = {} #metadata.formData[languageId] formNames = metadata.formNames[languageId] submitAction = metadata.submitActions[languageId] formData["save"] = "true" formData[formNames['appNameName']] = dataDict.get('name', metadata.formData[languageId]['appNameValue']) formData[formNames['descriptionName']] = dataFromStringOrFile(dataDict.get('description', metadata.formData[languageId]['descriptionValue']), languageCode) if 'whatsNewName' in formNames: formData[formNames['whatsNewName']] = dataFromStringOrFile(dataDict.get('whats new', metadata.formData[languageId]['whatsNewValue']), languageCode) formData[formNames['keywordsName']] = dataFromStringOrFile(dataDict.get('keywords', metadata.formData[languageId]['keywordsValue']), languageCode) formData[formNames['supportURLName']] = dataDict.get('support url', metadata.formData[languageId]['supportURLValue']) formData[formNames['marketingURLName']] = dataDict.get('marketing url', metadata.formData[languageId]['marketingURLValue']) formData[formNames['pPolicyURLName']] = dataDict.get('privacy policy url', metadata.formData[languageId]['pPolicyURLValue']) iphoneUploadScreenshotForm = formNames['iphoneUploadScreenshotForm'] iphone5UploadScreenshotForm = formNames['iphone5UploadScreenshotForm'] ipadUploadScreenshotForm = formNames['ipadUploadScreenshotForm'] iphoneUploadScreenshotJS = iphoneUploadScreenshotForm.xpath('../following-sibling::script/text()')[0] iphone5UploadScreenshotJS = iphone5UploadScreenshotForm.xpath('../following-sibling::script/text()')[0] ipadUploadScreenshotJS = ipadUploadScreenshotForm.xpath('../following-sibling::script/text()')[0] 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._uploadSessionId = iphoneUploadScreenshotForm.xpath('.//input[@name="uploadSessionID"]/@value')[0] # get all images for device_type in [DEVICE_TYPE.iPhone, DEVICE_TYPE.iPhone5, DEVICE_TYPE.iPad]: self._images[device_type] = self.imagesForDevice(device_type) logging.debug(self._images) # logging.debug(formData) if 'images' in dataDict: imagesActions = dataDict['images'] languageCode = languages.langCodeForLanguage(lang) for dType in imagesActions: 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 else: continue deviceImagesActions = imagesActions[dType] if deviceImagesActions == "": continue for imageAction in deviceImagesActions: imageAction.setdefault('cmd') imageAction.setdefault('indexes') cmd = imageAction['cmd'] indexes = imageAction['indexes'] replace_language = ALIASES.language_aliases.get(languageCode, languageCode) replace_device = ALIASES.device_type_aliases.get(dType.lower(), DEVICE_TYPE.deviceStrings[device_type]) imagePath = filename_format.replace('{language}', replace_language) \ .replace('{device_type}', replace_device) logging.debug('Looking for images at ' + imagePath) if (indexes == None) and ((cmd == 'u') or (cmd == 'r')): indexes = [] for i in range(0, 5): realImagePath = imagePath.replace("{index}", str(i + 1)) logging.debug('img path: ' + realImagePath) if os.path.exists(realImagePath): indexes.append(i + 1) logging.debug('indexes ' + indexes.__str__()) logging.debug('Processing command ' + imageAction.__str__()) if (cmd == 'd') or (cmd == 'r'): # delete or replace. To perform replace we need to delete images first deleteIndexes = [img['id'] for img in self._images[device_type]] if indexes != None: deleteIndexes = [deleteIndexes[idx - 1] for idx in indexes] logging.debug('deleting images ' + deleteIndexes.__str__()) for imageIndexToDelete in deleteIndexes: img = next(im for im in self._images[device_type] if im['id'] == imageIndexToDelete) self.deleteScreenshot(device_type, img['id']) self._images[device_type] = self.imagesForDevice(device_type) if (cmd == 'u') or (cmd == 'r'): # upload or replace currentIndexes = [img['id'] for img in self._images[device_type]] if indexes == None: continue indexes = sorted(indexes) for i in indexes: realImagePath = imagePath.replace("{index}", str(i)) if os.path.exists(realImagePath): self.uploadScreenshot(device_type, realImagePath) self._images[device_type] = self.imagesForDevice(device_type) if cmd == 'r': newIndexes = [img['id'] for img in self._images[device_type]][len(currentIndexes):] if len(newIndexes) == 0: continue for i in indexes: currentIndexes.insert(i - 1, newIndexes.pop(0)) self.sortScreenshots(device_type, currentIndexes) self._images[device_type] = self.imagesForDevice(device_type) if (cmd == 's'): # sort if indexes == None or len(indexes) != len(self._images[device_type]): continue newIndexes = [self._images[device_type][i - 1]['id'] for i in indexes] self.sortScreenshots(device_type, newIndexes) self._images[device_type] = self.imagesForDevice(device_type) formData['uploadSessionID'] = self._uploadSessionId logging.debug(formData) # formData['uploadKey'] = self._uploadSessionData[DEVICE_TYPE.iPhone5]['key'] postFormResponse = self._parser.requests_session.post(ITUNESCONNECT_URL + submitAction, data = formData, 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 editVersion(self, dataDict, lang=None, versionString=None, filename_format=None): if dataDict == None or len(dataDict) == 0: # nothing to change return if len(self.versions) == 0: self.getAppInfo() if len(self.versions) == 0: raise 'Can\'t get application versions' if versionString == None: # Suppose there's one or less editable versions versionString = next( (versionString for versionString, version in self.versions.items() if version['editable']), None) if versionString == None: # Suppose there's one or less editable versions raise 'No editable version found' version = self.versions[versionString] if not version['editable']: raise 'Version ' + versionString + ' is not editable' languageId = languages.appleLangIdForLanguage(lang) languageCode = languages.langCodeForLanguage(lang) metadata = self.__parseAppVersionMetadata(version, lang) # activatedLanguages = metadata.activatedLanguages # nonactivatedLanguages = metadata.nonactivatedLanguages formData = {} #metadata.formData[languageId] formNames = metadata.formNames[languageId] submitAction = metadata.submitActions[languageId] formData["save"] = "true" formData[formNames['appNameName']] = dataDict.get( 'name', metadata.formData[languageId]['appNameValue']) formData[formNames['descriptionName']] = dataFromStringOrFile( dataDict.get('description', metadata.formData[languageId]['descriptionValue']), languageCode) if 'whatsNewName' in formNames: formData[formNames['whatsNewName']] = dataFromStringOrFile( dataDict.get('whats new', metadata.formData[languageId]['whatsNewValue']), languageCode) formData[formNames['keywordsName']] = dataFromStringOrFile( dataDict.get('keywords', metadata.formData[languageId]['keywordsValue']), languageCode) formData[formNames['supportURLName']] = dataDict.get( 'support url', metadata.formData[languageId]['supportURLValue']) formData[formNames['marketingURLName']] = dataDict.get( 'marketing url', metadata.formData[languageId]['marketingURLValue']) formData[formNames['pPolicyURLName']] = dataDict.get( 'privacy policy url', metadata.formData[languageId]['pPolicyURLValue']) iphoneUploadScreenshotForm = formNames['iphoneUploadScreenshotForm'] iphone5UploadScreenshotForm = formNames['iphone5UploadScreenshotForm'] ipadUploadScreenshotForm = formNames['ipadUploadScreenshotForm'] iphoneUploadScreenshotJS = iphoneUploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] iphone5UploadScreenshotJS = iphone5UploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] ipadUploadScreenshotJS = ipadUploadScreenshotForm.xpath( '../following-sibling::script/text()')[0] 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._uploadSessionId = iphoneUploadScreenshotForm.xpath( './/input[@name="uploadSessionID"]/@value')[0] # get all images for device_type in [ DEVICE_TYPE.iPhone, DEVICE_TYPE.iPhone5, DEVICE_TYPE.iPad ]: self._images[device_type] = self.imagesForDevice(device_type) logging.debug(self._images) # logging.debug(formData) if 'images' in dataDict: imagesActions = dataDict['images'] languageCode = languages.langCodeForLanguage(lang) for dType in imagesActions: 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 else: continue deviceImagesActions = imagesActions[dType] if deviceImagesActions == "": continue for imageAction in deviceImagesActions: imageAction.setdefault('cmd') imageAction.setdefault('indexes') cmd = imageAction['cmd'] indexes = imageAction['indexes'] replace_language = ALIASES.language_aliases.get( languageCode, languageCode) replace_device = ALIASES.device_type_aliases.get( dType.lower(), DEVICE_TYPE.deviceStrings[device_type]) imagePath = filename_format.replace('{language}', replace_language) \ .replace('{device_type}', replace_device) logging.debug('Looking for images at ' + imagePath) if (indexes == None) and ((cmd == 'u') or (cmd == 'r')): indexes = [] for i in range(0, 5): realImagePath = imagePath.replace( "{index}", str(i + 1)) logging.debug('img path: ' + realImagePath) if os.path.exists(realImagePath): indexes.append(i + 1) logging.debug('indexes ' + indexes.__str__()) logging.debug('Processing command ' + imageAction.__str__()) if (cmd == 'd') or ( cmd == 'r' ): # delete or replace. To perform replace we need to delete images first deleteIndexes = [ img['id'] for img in self._images[device_type] ] if indexes != None: deleteIndexes = [ deleteIndexes[idx - 1] for idx in indexes ] logging.debug('deleting images ' + deleteIndexes.__str__()) for imageIndexToDelete in deleteIndexes: img = next(im for im in self._images[device_type] if im['id'] == imageIndexToDelete) self.deleteScreenshot(device_type, img['id']) self._images[device_type] = self.imagesForDevice( device_type) if (cmd == 'u') or (cmd == 'r'): # upload or replace currentIndexes = [ img['id'] for img in self._images[device_type] ] if indexes == None: continue indexes = sorted(indexes) for i in indexes: realImagePath = imagePath.replace( "{index}", str(i)) if os.path.exists(realImagePath): self.uploadScreenshot(device_type, realImagePath) self._images[device_type] = self.imagesForDevice( device_type) if cmd == 'r': newIndexes = [ img['id'] for img in self._images[device_type] ][len(currentIndexes):] if len(newIndexes) == 0: continue for i in indexes: currentIndexes.insert(i - 1, newIndexes.pop(0)) self.sortScreenshots(device_type, currentIndexes) self._images[device_type] = self.imagesForDevice( device_type) if (cmd == 's'): # sort if indexes == None or len(indexes) != len( self._images[device_type]): continue newIndexes = [ self._images[device_type][i - 1]['id'] for i in indexes ] self.sortScreenshots(device_type, newIndexes) self._images[device_type] = self.imagesForDevice( device_type) formData['uploadSessionID'] = self._uploadSessionId logging.debug(formData) # formData['uploadKey'] = self._uploadSessionData[DEVICE_TYPE.iPhone5]['key'] postFormResponse = self._parser.requests_session.post( ITUNESCONNECT_URL + submitAction, data=formData, 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)