コード例 #1
0
ファイル: application.py プロジェクト: jdelStrother/itc.cli
    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)
コード例 #2
0
ファイル: application.py プロジェクト: jdelStrother/itc.cli
    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)
コード例 #3
0
ファイル: application.py プロジェクト: jdelStrother/itc.cli
    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)
コード例 #4
0
ファイル: application.py プロジェクト: wpsteak/itc.cli
    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)
コード例 #5
0
ファイル: application.py プロジェクト: wpsteak/itc.cli
    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)
コード例 #6
0
ファイル: application.py プロジェクト: jdelStrother/itc.cli
    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)
コード例 #7
0
ファイル: application.py プロジェクト: wpsteak/itc.cli
    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)
コード例 #8
0
ファイル: application.py プロジェクト: jdelStrother/itc.cli
    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)
コード例 #9
0
ファイル: server.py プロジェクト: HarshitDaftary/itc.cli
    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)
コード例 #10
0
ファイル: server.py プロジェクト: pingwinator-archive/itc.cli
    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)