def refresh_rankings_v2(): print "Refreshing the EXPA rankings" api = expaApi.ExpaApi(account='*****@*****.**', fail_attempts=5) mcs = Office.objects.filter(office_type="MC").order_by('expaID') programs = Program.objects.all() for mc in mcs: print "Cargando datos del MC %s" % mc.name for program in programs: #Loads the performance in the given program for the given MC try: performance = api.getCountryCurrentYearStats(program.name, mc.expaID) for officeID, values in performance.iteritems(): #Recorre todas las oficinas y sus logros para el programa dado #print "Office ID: %s" % officeID #print values #Si los logros de este programa ya existen, se actualizan en la base de datos. Si no existen (sucede cuando algún comité del mundo acaba de abrir un nuevo programa) se crean unos nuevos suboffices_loaded = False # This keeps track on whether suboffices have already been loaded at least once. If that's the case, then empty LCs will be ignored. try: logros, created = LogrosPrograma.objects.update_or_create(program=program, office_id=officeID, defaults=values) except IntegrityError as e: #Esto quiere decir que probablemente intentó cargar un LC que todavía no existe. Esto pasa cuando se crean nuevos LCs desde la última vez que se actualizó en ranking. print "Integrity error loading data of LC %s" % officeID print e if not suboffices_loaded: try: load_suboffices(mc.expaID, "LC", api) logros, created = LogrosPrograma.objects.update_or_create(program=program, office_id=officeID, defaults=values) except IntegrityError as e2: print "Error al intentar cargar los logros después de cargar las suboficinas. Probablemente el LC ya no existe. Ignorando..." print e2 except expaApi.APIUnavailableException as e: print "Error de EXPA cargando el país actual, continuando..." break
def loadMCPerformance(mcID, api): mc = MC.objects.get(expaID = mcID) print "Cargando datos de %s" % mc.nombre programs = ['ogcdp', 'igcdp', 'ogip', 'igip'] metrics = ['MA', 'RE'] allProgramsPerformance = {} for program in programs: print "cargando %s" % program performance = api.getCountryCurrentYearStats(program, mcID) allProgramsPerformance[program] = performance for lc in mc.lcs.all(): for program in programs: programPerformance = allProgramsPerformance[program] for metric in metrics: try: setattr(lc, program+metric, programPerformance[lc.expaID][metric]) except KeyError as e: break lc.save()
def refresh_rankings_v2(): print "Refreshing the EXPA rankings" api = expaApi.ExpaApi() mcs = Office.objects.filter(office_type="MC").order_by('expaID') programs = Program.objects.all() for mc in mcs: print "Cargando datos del MC %s" % mc.name for program in programs: print "Cargando %s" % program.name #Loads the performance in the given program for the given MC performance = api.getCountryCurrentYearStats(program.name, mc.expaID) for officeID, values in performance.iteritems(): #Recorre todas las oficinas y sus logros para el programa dado #print "Office ID: %s" % officeID #print values #Si los logros de este programa ya existen, se actualizan en la base de datos. Si no existen (sucede cuando algún comité del mundo acaba de abrir un nuevo programa) se crean unos nuevos try: logros, created = LogrosPrograma.objects.update_or_create(program=program, office_id=officeID, defaults=values) except IntegrityError as e: #Esto quiere decir que probablemente intentó cargar un LC que todavía no existe. Esto pasa cuando se crean nuevos LCs desde la última vez que se actualizó en ranking. print e load_suboffices(mc.expaID, "LC", api) logros, created = LogrosPrograma.objects.update_or_create(program=program, office_id=officeID, defaults=values)