estephany-up / Incentivos_parte_2

0 stars 1 forks source link

Asignación del puntaje #2

Open estephany-up opened 3 years ago

estephany-up commented 3 years ago

Hola! Recién me he percatado un problema que tenía en la parte para sacar el puntaje porque lo que hacía usualmente es llenar todas las respuestas de todas las rondas (estoy trabajando con 10 por ahora). Para el puntaje tengo tres variables: una que es el form que va en template (donde ingreso mi respuesta); otra que es la que toma el valor de uno si es que la primera variable coincide con la respuesta y cero d.o.m.; la tercera variable es la suma de la segunda variable en todas las rondas (está definida como sum([p.answer_correct for p in self.player.in_all_round]) ). Cuando lleno la respuesta en todas las rondas, si me sale un resultado. Sin embargo, cuando por ejemplo llenó sólo las respuestas hasta la ronda 6 y de ahí espero a que se termine el tiempo, el resultado que sale es None y eso es porque no se ha ingresado ninguna respuesta en la ronda 8,9 y 10. Entonces, mi consulta va a cómo podría solucionar este pequeño problema. PD: también he intentado poniendo initia=0 en el form, pero el problema persistía.

Sergio2405 commented 3 years ago

Podrias tratar añadiendo un if respuesta == None (si no se coloca nada dentro del forms) entonces que el valor de tu segunda variable sea igual a 0.

@estephany-up

estephany-up commented 3 years ago

También he intentado ayer con eso y acabo de intentar otra vez por si acaso y me sigue saliendo None. En la parte de data veo y siempre una ronda después de la ronda en la cual me quede, los datos que se encuentran están vacíos y no llena nada. Sólo estoy usando esto: def before_next_page(self): #esto va en class Tarea_conteo if self.player.answer_R1 == self.subsession.total_zeroes: self.player.answer_correct_R1 = 1 elif self.player.answer_R1 == None: ##esto lo agregué por lo que me aconsejaron self.player.answer_correct_R1 = 0 else: self.player.answer_correct_R1 = 0 player_in_all_rounds = self.player.in_all_rounds() self.player.total_answers_correct_R1 = sum([p.answer_correct_R1 for p in player_in_all_rounds]) return self.player.total_answers_correct_R1

class Ranking_conteo_R1(Page): def is_displayed(self): return self.round_number == Constants.num_rounds def vars_for_template(self): p_1=self.player.total_answers_correct_R1 return dict(p_1=p_1)

Y en models definí las variables de la siguiente forma: answer_R1 = models.IntegerField(verbose_name="""""") answer_correct_R1 = models.BooleanField() total_answers_correct_R1 = models.IntegerField()

Sergio2405 commented 3 years ago

Puede que siga saliendo None porque no estás llamando al método def before_next_page. Es decir ese te retorna el número de respuestas correctas. Pero cuando lo quieres usar (en vars for template de la clase Ranking_conteo_R1) podría funcionar si haces self.before_next_page() para que te retorne el valor de self.player.total_answers_correct_R1 @estephany-up

estephany-up commented 3 years ago

He estado intentado como lo has propuesto y también con otras variantes, pero sigue saliendo None. Sólo cuando llego a completar todas las rondas dentro del tiempo, sale el puntaje en la página de ranking. Pero, no siempre en la tarea, el participante debe completar la mayor cantidad de rondas posibles antes de que acabe el tiempo. Entonces, siempre habrá forms de las rondas no completadas vacías.

Sergio2405 commented 3 years ago

El problema puede radicar en que las variables que has definido como Fields (answer_correct_R1, total_answers_correct_R1) en verdad no hay un valor que sea ingresado directamente por el usuario por lo que se mantendrá en None. En cambio, answer_R1 si esta bien definida como Field porque el usuario si ingresara un valor para esa variable. Por lo que podrías tratar definiendo answer_correct_R1 = 0, total_answers_correct_R1 = 0 (da igual el valor que le asignes) pero deben estar definidas así, no como un Field (porque no se esta ingresando ningun valor ahi por el usuario). @estephany-up

estephany-up commented 3 years ago

Gracias! Trate de hacer como me dijiste, pero de igual manera no corría. Al final, encontré otra solución. Tuve que partir en dos lo que estaba haciendo y lo del puntaje total lo hice en un wait page. De esta manera, tomaba en cuenta todo el if que había definido en la tarea de conteo. Y se me hizo más fácil hacer el ranking.

Una pregunta, ¿cuál era el código para cambiar a la versión de otree que usaba el lab?

Sergio2405 commented 3 years ago

Si mas lo recuerdo esa vez que nos reunimos Grecia las ayudo a instalar la versión de otree que usamos en el laboratorio. En todo caso podrías verificar que versión de otree tienes. Abre el CMD y ahi dirigete a la carpeta en donde estas trabajando tu proyecto (cd direcciondetuproyecto). Una vez ahí escribe el siguiente comando: pip freeze, esto te botara una lista de paquetes que tengas instalados, ahí es donde te deberia aparecer la versión que usas de otree. @estephany-up