def statistics(self, **kw): """Crea el formulario de estadisticas sobre entregas""" curso = self.get_curso_actual() cant_por_instancia = [] cant_por_dias_anticip = {} for e in curso.ejercicios: for i in e.instancias: cant_por_instancia += [(i.shortrepr(), len(i.entregas))] for entrega in i.entregas: anticip = (i.fin - entrega.fecha) dias_anticipacion = anticip.days if dias_anticipacion in cant_por_dias_anticip: cant_por_dias_anticip[dias_anticipacion] += 1 else: cant_por_dias_anticip[dias_anticipacion] = 1 items = cant_por_dias_anticip.items() items.sort() items.reverse() # Entregas colgadas, sólo admins q_data = None if identity.has_permission(Permiso.admin): q_data = Entrega.selectBy(inicio=None, fin=None).orderBy('fecha') for e in q_data: e.edad = (datetime.now() - e.fecha) e.suficientemente_viejo = e.edad > timedelta(minutes=5) return dict(cant_por_instancia=cant_por_instancia, q_data = q_data, cant_por_dias_anticip = [('%s dias' % dias, cant) for dias, cant in items])
def run(self): # {{{ entrega_id = self.queue.get() # blocking while entrega_id is not None: Entrega._connection.expireAll() entrega = Entrega.get(entrega_id) log.debug(_(u"Nueva entrega para probar en: %s: %s"), self.contexto_ejecucion, entrega) self.test(entrega) log.debug(_(u"Fin de pruebas de: %s"), entrega) entrega_id = self.queue.get() # blocking
def new(self, **kw): """Create new records in model""" curso = self.get_curso_actual() ejercicios = curso.ejercicios_activos q_score = Entrega.selectBy(inicio=None, fin=None, entregador=identity.current.user.get_inscripcion(curso)).count() if len(ejercicios) == 0: flash(_(u'Al momento, no hay ningún ejercicio con instancias de entrega abiertas.')) if q_score > 0: flash(_(u'Usted tiene un ejercicio en espera de ser aceptado. No envíe otro hasta tener la respuesta del primero.')) ejercicio_options = [(0, 'Seleccionar')] + [(e.id, e.shortrepr()) for e in ejercicios] return dict(name=name, namepl=namepl, form=form, values=kw, options=dict(ejercicio=ejercicio_options))
def get(self): while self.go_on: try: hub.begin() try: e = Entrega.selectBy(inicio=None).orderBy(Entrega.q.fecha)[0] e.inicio = datetime.now() finally: hub.commit() return e.id except IndexError: log.debug(_(u'No hay entregas pendientes')) time.sleep(10) # TODO config? except Exception, e: if isinstance(e, SystemExit): raise log.exception('Queue: ') time.sleep(10) # TODO config?
def create(self, archivo, ejercicio, **kw): """Save or create record to model""" curso = self.get_curso_actual() q_score = Entrega.selectBy(inicio=None, fin=None, entregador=identity.current.user.get_inscripcion(curso)).count() if q_score > 0: flash(_(u'No se acepta una nueva entrega si la anterior no fue procesada.')) raise redirect('list') archivo = archivo.file.read() try: zfile = ZipFile(StringIO(archivo), 'r') except BadZipfile: flash(_(u'El archivo ZIP no es válido')) raise redirect('list') if zfile.testzip() is not None: flash(_(u'El archivo ZIP tiene errores de CRC')) raise redirect('list') # por defecto el entregador es el user loggeado curso = self.get_curso_actual() entregador = identity.current.user.get_inscripcion(curso) grupo_id = kw['grupo'] del kw['grupo'] ejercicio = Ejercicio.get(int(ejercicio)) if ejercicio.grupal: # Como es grupal, tengo que hacer que la entrega la haga el grupo if not grupo_id: flash(_(u'No se puede realizar una entrega de un ejercicio grupal sin elegir el grupo.')) raise redirect('list') else: entregador = Grupo.get(int(grupo_id)) kw['archivos'] = archivo kw['entregador'] = entregador validate_new(kw) flash(_(u'Se creó una nueva %s.') % name) raise redirect('list')