def main(): os.umask(0077) if not os.path.exists(temp_dir): os.mkdir(temp_dir); args = __parse_options() logging.debug('Python %s' % sys.version) logging.debug('Running on %s' % platform.platform()) logging.debug('Temp path = %s' % temp_dir) logging.debug('Current Directory = %s' % os.getcwd()) logging.debug('args %s' % args) if options['--no-cookies'] or options['--store-password']: logging.debug('Deleting cookie file: ' + cookie_file) if os.path.exists(cookie_file): os.remove(cookie_file) cookie_jar.clear() logging.info('Removed authentication cookies') else: logging.debug('Cookie file doesn\'t exist') if options['--username'] == None: options['--username'] = raw_input('Username: '******'--delete-password']: keyring.delete_password(KEYRING_SERVICE_NAME, options['--username']) if options['--password'] == None: logging.debug('Looking for password in a secure storage. Username: '******'--username']) options['--password'] = keyring.get_password(KEYRING_SERVICE_NAME, options['--username']) server = ITCServer(options['--username'], options['--password']) if not server.isLoggedIn: if options['--password'] == None: options['--password'] = getpass.getpass() server.login(password = options['--password']) if server.isLoggedIn and options['--store-password']: keyring.set_password(KEYRING_SERVICE_NAME, options['--username'], options['--password']) if len(server.applications) == 0: server.fetchApplicationsList() if len(server.applications) == 0: logging.info('No applications found.') return logging.debug(server.applications) if options['--application-id']: options['--application-id'] = int(options['--application-id']) if options['generate']: if options['--application-id']: if options['--application-id'] in server.applications: applications = {} applications[options['--application-id']] = server.applications[options['--application-id']] else: logging.error('No application with id ' + str(options['--application-id'])) return else: applications = server.applications for applicationId, application in applications.items(): updatedApplication = server.getApplicationById(applicationId) updatedApplication.generateConfig(options['--application-version'], generateInapps = options['--generate-config-inapp']) return if options['promo']: if not options['--application-id'] in server.applications: logging.error("Provide correct application id (--application-id or -a option)") else: application = server.getApplicationById(options['--application-id']) promocodes = application.getPromocodes(options['<amount>']) if options['--output-file']: with open(options['--output-file'], 'a') as outFile: outFile.write(promocodes) else: # just print to console. Using print as we want to suppress silence option print promocodes return if options['reviews']: if not options['--application-id'] in server.applications: logging.error("Provide correct application id (--application-id or -a option)") else: application = server.getApplicationById(options['--application-id']) application.generateReviews(options['--latest-version'], options['--date-range'], options['--output-file']) return cfg = __parse_configuration_file() if len(cfg) == 0: logging.info('Nothing to do.') return applicationDict = cfg['application'] applicationId = applicationDict.get('id', -1) if options['--application-id']: applicationId = int(options['--application-id']) application = None commonActions = applicationDict.get('metadata', {}).get('general', {}) specificLangCommands = applicationDict.get('metadata', {}).get('languages', {}) langActions = {} filename_format = cfg.get('config', {}) \ .get('images', {}) \ .get('file name format', default_file_format) for lang in specificLangCommands: langActions[languages.languageNameForId(lang)] = dict_merge(commonActions, specificLangCommands[lang]) logging.debug(langActions) if applicationId not in server.applications and not options['create']: logging.warning('No application with id ' + str(applicationId)) choice = raw_input('Do you want to create a new one? [y/n]') options['create'] = True if choice.strip().lower() in ('y', 'yes', '') else False if options['create']: server.createNewApp(applicationDict, filename_format=filename_format) elif applicationId in server.applications: application = server.getApplicationById(applicationId) if options['version']: langActions['default'] = commonActions application.addVersion(applicationDict['version'], langActions) else: for lang in langActions: actions = langActions[lang] application.editVersion(actions, lang=lang, filename_format=filename_format) appReviewInfo = applicationDict.get('app review information', None) if appReviewInfo != None: application.editReviewInformation(appReviewInfo) for inappDict in applicationDict.get('inapps', {}): isIterable = inappDict['id'].find('{index}') != -1 iteratorDict = inappDict.get('index iterator') if isIterable and (iteratorDict == None): logging.error('Inapp id contains {index} keyword, but no index_iterator object found. Skipping inapp: ' + inappDict['id']) continue langsDict = inappDict['languages'] genericLangsDict = inappDict['general'] for langId in langsDict: langsDict[langId] = dict_merge(genericLangsDict, langsDict[langId]) inappDict['languages'] = langsDict del inappDict['general'] indexes = [-1] if (isIterable): indexes = iteratorDict.get('indexes') if indexes == None: indexes = range(iteratorDict.get('from', 1), iteratorDict['to'] + 1) if iteratorDict != None: del inappDict['index iterator'] for key, value in inappDict.items(): if (not key in ("index iterator", "general", "languages")) and isinstance(value, dict): flattenDictIndexes(value) for langKey, value in inappDict["languages"].items(): for innerLangKey, langValue in inappDict["languages"][langKey].items(): if isinstance(langValue, dict): flattenDictIndexes(langValue) realindex = 0 for index in indexes: inappIndexDict = deepcopy(inappDict) if isIterable: for key in inappIndexDict: if key in ("index iterator", "general", "languages"): continue if (isinstance(inappIndexDict[key], basestring)): inappIndexDict[key] = inappIndexDict[key].replace('{index}', str(index)) elif (isinstance(inappIndexDict[key], list)): inappIndexDict[key] = inappIndexDict[key][realindex] elif (isinstance(inappIndexDict[key], dict)): inappIndexDict[key] = inappIndexDict[key][index] langsDict = inappIndexDict['languages'] for langId, langDict in langsDict.items(): for langKey in langDict: if (isinstance(langDict[langKey], basestring)): langDict[langKey] = langDict[langKey].replace('{index}', str(index)) elif (isinstance(langDict[langKey], list)): langDict[langKey] = langDict[langKey][realindex] elif (isinstance(langDict[langKey], dict)): langDict[langKey] = langDict[langKey][index] inapp = application.getInappById(inappIndexDict['id']) if inapp == None: application.createInapp(inappIndexDict) else: inapp.update(inappIndexDict) realindex += 1 else: logging.error('No application with id ' + str(applicationId)) return
def main(): os.umask(0077) if not os.path.exists(temp_dir): os.mkdir(temp_dir); args = __parse_options() logging.debug('Python %s' % sys.version) logging.debug('Running on %s' % platform.platform()) logging.debug('Temp path = %s' % temp_dir) logging.debug('Current Directory = %s' % os.getcwd()) logging.debug('args %s' % args) if options['--no-cookies']: logging.debug('Deleting cookie file: ' + cookie_file) if os.path.exists(cookie_file): os.remove(cookie_file) logging.info('Removed authentication cookies') else: logging.debug('Cookie file doesn\'t exist') if options['--username'] == None: options['--username'] = raw_input('Username: '******'--username'], options['--password']) if not server.isLoggedIn: if options['--password'] == None: options['--password'] = getpass.getpass() server.login(password = options['--password']) if len(server.applications) == 0: server.fetchApplicationsList() if len(server.applications) == 0: logging.info('No applications found.') return logging.debug(server.applications) if options['--application-id']: options['--application-id'] = int(options['--application-id']) if options['generate']: if options['--application-id']: if options['--application-id'] in server.applications: applications = {} applications[options['--application-id']] = server.applications[options['--application-id']] else: logging.error('No application with id ' + str(options['--application-id'])) return else: applications = server.applications for applicationId, application in applications.items(): application.generateConfig(options['--application-version'], generateInapps = options['--generate-config-inapp']) return if options['promo']: if not options['--application-id'] in server.applications: logging.error("Provide correct application id (--application-id or -a option)") else: application = server.applications[options['--application-id']] promocodes = application.getPromocodes(options['<amount>']) if options['--output-file']: with open(options['--output-file'], 'a') as outFile: outFile.write(promocodes) else: # just print to console. Using print as we want to suppress silence option print promocodes return if options['reviews']: if not options['--application-id'] in server.applications: logging.error("Provide correct application id (--application-id or -a option)") else: application = server.applications[options['--application-id']] application.generateReviews(options['--latest-version'], options['--date-range'], options['--output-file']) return cfg = __parse_configuration_file() if len(cfg) == 0: logging.info('Nothing to do.') return applicationDict = cfg['application'] applicationId = applicationDict.get('id', -1) if options['--application-id']: applicationId = int(options['--application-id']) application = None commonActions = applicationDict.get('metadata', {}).get('general', {}) specificLangCommands = applicationDict.get('metadata', {}).get('languages', {}) langActions = {} filename_format = cfg.get('config', {}) \ .get('images', {}) \ .get('file name format', default_file_format) for lang in specificLangCommands: langActions[languages.languageNameForId(lang)] = dict_merge(commonActions, specificLangCommands[lang]) logging.debug(langActions) if applicationId not in server.applications and not options['create']: logging.warning('No application with id ' + str(applicationId)) choice = raw_input('Do you want to create a new one? [y/n]') options['create'] = True if choice.strip().lower() in ('y', 'yes', '') else False if options['create']: server.createNewApp(applicationDict, filename_format=filename_format) elif applicationId in server.applications: application = server.applications[applicationId] if options['version']: langActions['default'] = commonActions application.addVersion(applicationDict['version'], langActions) else: for lang in langActions: actions = langActions[lang] application.editVersion(actions, lang=lang, filename_format=filename_format) appReviewInfo = applicationDict.get('app review information', None) if appReviewInfo != None: application.editReviewInformation(appReviewInfo) for inappDict in applicationDict.get('inapps', {}): isIterable = inappDict['id'].find('{index}') != -1 iteratorDict = inappDict.get('index iterator') if isIterable and (iteratorDict == None): logging.error('Inapp id contains {index} keyword, but no index_iterator object found. Skipping inapp: ' + inappDict['id']) continue langsDict = inappDict['languages'] genericLangsDict = inappDict['general'] for langId in langsDict: langsDict[langId] = dict_merge(genericLangsDict, langsDict[langId]) inappDict['languages'] = langsDict del inappDict['general'] indexes = [-1] if (isIterable): indexes = iteratorDict.get('indexes') if indexes == None: indexes = range(iteratorDict.get('from', 1), iteratorDict['to'] + 1) del inappDict['index iterator'] for key, value in inappDict.items(): if (not key in ("index iterator", "general", "languages")) and isinstance(value, dict): flattenDictIndexes(value) for langKey, value in inappDict["languages"].items(): for innerLangKey, langValue in inappDict["languages"][langKey].items(): if isinstance(langValue, dict): flattenDictIndexes(langValue) realindex = 0 for index in indexes: inappIndexDict = deepcopy(inappDict) if isIterable: for key in inappIndexDict: if key in ("index iterator", "general", "languages"): continue if (isinstance(inappIndexDict[key], basestring)): inappIndexDict[key] = inappIndexDict[key].replace('{index}', str(index)) elif (isinstance(inappIndexDict[key], list)): inappIndexDict[key] = inappIndexDict[key][realindex] elif (isinstance(inappIndexDict[key], dict)): inappIndexDict[key] = inappIndexDict[key][index] langsDict = inappIndexDict['languages'] for langId, langDict in langsDict.items(): for langKey in langDict: if (isinstance(langDict[langKey], basestring)): langDict[langKey] = langDict[langKey].replace('{index}', str(index)) elif (isinstance(langDict[langKey], list)): langDict[langKey] = langDict[langKey][realindex] elif (isinstance(langDict[langKey], dict)): langDict[langKey] = langDict[langKey][index] inapp = application.getInappById(inappIndexDict['id']) if inapp == None: application.createInapp(inappIndexDict) else: inapp.update(inappIndexDict) realindex += 1 else: logging.error('No application with id ' + str(applicationId)) return