Skip to content

Commit f06fd00

Browse files
committed
fix latin square
1 parent 202c15a commit f06fd00

File tree

10 files changed

+275
-174
lines changed

10 files changed

+275
-174
lines changed

.idea/inspectionProfiles/Project_Default.xml

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

+137-134
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

experiments/forms.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ def save_participant(self):
2626
latin_square_row.participant = participant
2727
latin_square_row.save()
2828
else:
29-
latin_square = LatinSquare.objects.create(experiment=experiment)
30-
GenerateLatinSquareRows(latin_square).call()
29+
latin_square = LatinSquare.objects.create_with_rows(experiment=experiment)
3130
latin_square.row1.participant = participant
3231
latin_square.row1.save()
3332

experiments/managers/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import random
4+
5+
from django.db import models
6+
7+
8+
class LatinSquareManager(models.Manager):
9+
10+
def create_with_rows(self, experiment):
11+
from experiments.models import LatinSquare
12+
latin_square = LatinSquare.objects.create(
13+
experiment=experiment,
14+
frame_sequence=self.__generate_frame_sequence()
15+
)
16+
from experiments.services.generate_latin_square_rows import GenerateLatinSquareRows
17+
GenerateLatinSquareRows(latin_square).call()
18+
19+
return latin_square
20+
21+
def __generate_frame_sequence(self):
22+
shuffled = [[1, 2], [3, 4]]
23+
random.shuffle(shuffled)
24+
return shuffled[0] + shuffled[1]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.16 on 2019-04-08 05:05
3+
from __future__ import unicode_literals
4+
5+
import django.contrib.postgres.fields
6+
from django.db import migrations, models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('experiments', '0021_task_correct_answer'),
13+
]
14+
15+
operations = [
16+
migrations.RemoveField(
17+
model_name='task',
18+
name='kind',
19+
),
20+
migrations.AddField(
21+
model_name='latinsquare',
22+
name='quadrant_sequence',
23+
field=django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), blank=True, default=[1, 2, 3, 4], null=True, size=None),
24+
),
25+
migrations.AddField(
26+
model_name='task',
27+
name='frame',
28+
field=models.IntegerField(blank=True, choices=[(1, 'Primeiro Quadrante'), (2, 'Segundo Quadrante'), (3, 'Terceiro Quadrante'), (4, 'Quarto Quadrante')], null=True),
29+
),
30+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.16 on 2019-04-08 06:17
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('experiments', '0022_auto_20190408_0505'),
12+
]
13+
14+
operations = [
15+
migrations.RenameField(
16+
model_name='latinsquare',
17+
old_name='quadrant_sequence',
18+
new_name='frame_sequence',
19+
),
20+
]

experiments/models.py

+20-7
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33

44
from datetime import datetime
55

6+
from django.contrib.postgres.fields import ArrayField
67
from django.db import models
78

9+
from experiments.managers.latin_square_manager import LatinSquareManager
10+
811

912
class Experiment(models.Model):
1013
description = models.CharField(max_length=200)
@@ -31,17 +34,22 @@ def __unicode__(self):
3134

3235

3336
class Task(models.Model):
34-
COMMON = 1
35-
SPECIAL = 2
36-
KIND_CHOICES = (
37-
(COMMON, 'Common'),
38-
(SPECIAL, 'Special'),
37+
FIRST_FRAME = 1
38+
SECOND_FRAME = 2
39+
THIRD_FRAME = 3
40+
FOURTH_FRAME = 4
41+
42+
FRAME_CHOICES = (
43+
(FIRST_FRAME, 'Primeiro Quadrante'),
44+
(SECOND_FRAME, 'Segundo Quadrante'),
45+
(THIRD_FRAME, 'Terceiro Quadrante'),
46+
(FOURTH_FRAME, 'Quarto Quadrante'),
3947
)
4048

4149
description = models.CharField(max_length=200)
4250
image = models.ImageField(upload_to='uploads/tasks')
4351
experiment = models.ForeignKey(Experiment, on_delete=models.CASCADE, blank=True, null=True)
44-
kind = models.IntegerField(choices=KIND_CHOICES, blank=True, null=True)
52+
frame = models.IntegerField(choices=FRAME_CHOICES, blank=True, null=True)
4553
correct_answer = models.CharField(max_length=500, default='')
4654
created_at = models.DateTimeField(auto_now_add=True)
4755
updated_at = models.DateTimeField(auto_now=True)
@@ -100,6 +108,9 @@ class LatinSquare(models.Model):
100108
related_name='row1_latin_square')
101109
row2 = models.ForeignKey(LatinSquareRow, on_delete=models.CASCADE, blank=True, null=True,
102110
related_name='row2_latin_square')
111+
frame_sequence = ArrayField(models.IntegerField(), null=True, blank=True, default=[1, 2, 3, 4])
112+
113+
objects = LatinSquareManager()
103114

104115
def __unicode__(self):
105116
return "%d" % self.id
@@ -115,13 +126,15 @@ def duration_in_seconds(self):
115126

116127
return duration.total_seconds()
117128

129+
def __unicode__(self):
130+
return "%d %d" % (self.id, self.duration_in_seconds())
131+
118132

119133
class Answer(models.Model):
120134
execution = models.ForeignKey(Execution, on_delete=models.CASCADE)
121135
answer = models.CharField(max_length=500)
122136
correct = models.BooleanField()
123137

124-
125138
# from django.db.models.signals import post_save
126139
#
127140
# post_save.connect(handlers.my_handler, sender=LatinSquare)

experiments/services/generate_latin_square_rows.py

+24-27
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,49 @@
77

88
class GenerateLatinSquareRows(object):
99
"""Generate Latin Square Rows"""
10+
1011
def __init__(self, latin_square):
1112
self.latin_square = latin_square
1213

1314
def call(self):
14-
"""Contructor"""
15+
"""Constructor"""
1516
if not self.latin_square.row1 or not self.latin_square.row2:
1617
self.__create_rows()
1718

1819
# PRIVATE METHODS
19-
def __random_tasks_by_kind(self, kind):
20-
"""Get tasks randomly based on task lind"""
21-
return Task.objects\
22-
.filter(kind=kind, experiment_id=self.latin_square.experiment.id)\
23-
.exclude(id__in=self.__tasks_to_exclude())\
24-
.order_by('?')[:self.latin_square.experiment.tasks_quantity_by_cell]
20+
def __random_tasks_for_frame(self, frame):
21+
"""Get tasks randomly based on frame"""
22+
return Task.objects \
23+
.filter(frame=frame, experiment_id=self.latin_square.experiment.id) \
24+
.exclude(id__in=self.__tasks_to_exclude())
2525

2626
def __create_rows(self):
2727
"""Create rows for current latin square"""
28-
first_row_cells = self.__create_cells()
29-
self.latin_square.row1 = LatinSquareRow.objects\
30-
.create(cell1=first_row_cells['common_cell'],
31-
cell2=first_row_cells['special_cell'])
28+
cells = self.__create_cells()
29+
30+
self.latin_square.row1 = LatinSquareRow.objects.create(
31+
cell1=cells[:2][0],
32+
cell2=cells[:2][1]
33+
)
3234

33-
second_row_cells = self.__create_cells()
34-
self.latin_square.row2 = LatinSquareRow.objects\
35-
.create(cell1=second_row_cells['special_cell'],
36-
cell2=second_row_cells['common_cell'])
35+
self.latin_square.row2 = LatinSquareRow.objects.create(
36+
cell1=cells[2:][0],
37+
cell2=cells[2:][1]
38+
)
3739

3840
self.latin_square.save()
3941

4042
def __create_cells(self):
4143
"""create cells to latin square"""
42-
common_cell = LatinSquareCell.objects.create()
43-
common_cell.tasks = self.__random_tasks_by_kind(Task.COMMON)
44-
common_cell.save()
45-
46-
special_cell = LatinSquareCell.objects.create()
44+
cells = []
4745

48-
# tasks_to_exclude = list(map(lambda x: x.id, common_cell.tasks.all()))
49-
special_cell.tasks = self.__random_tasks_by_kind(Task.SPECIAL)
50-
special_cell.save()
46+
for frame in self.latin_square.frame_sequence:
47+
cell = LatinSquareCell.objects.create()
48+
cell.tasks = self.__random_tasks_for_frame(frame)
49+
cell.save()
50+
cells.append(cell)
5151

52-
return {
53-
'common_cell': common_cell,
54-
'special_cell': special_cell
55-
}
52+
return cells
5653

5754
def __tasks_to_exclude(self):
5855
"""get all tasks already at the current latin square to not repeat then"""

experiments/templates/pause_execution.html

+7-4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
{% block content %}
66
<h1>Tarefa Pausada</h1>
77
<div>
8-
<a id="navigationButton" href="{% url 'experiments:previous_task' pause.execution.participant.id pause.execution.task.experiment.id %}"
8+
<a id="navigationButton"
9+
href="{% url 'experiments:previous_task' pause.execution.participant.id pause.execution.task.experiment.id %}"
910
class="btn btn-primary">Voltar para a tarefa</a>
10-
<button id="responseButton" href="#" class="btn btn-default" data-toggle="modal" data-target="#answerModal">Responder</button>
11+
<button id="responseButton" href="#" class="btn btn-default" data-toggle="modal" data-target="#answerModal">
12+
Responder
13+
</button>
1114
</div>
1215

1316
<!-- Modal -->
@@ -53,7 +56,7 @@ <h5 class="modal-title" id="exampleModalLabel">Qual a sua resposta?</h5>
5356
"{% url 'experiments:submit_answer' pause.execution.id %}",
5457
'csrfmiddlewaretoken={{ csrf_token }}&answer=' + userAnswer,
5558
function (data) {
56-
$("#submit_response").val('');
59+
$("#task_response").val('');
5760
$("#answerModal").modal('hide');
5861

5962
var result = JSON.parse(data);
@@ -64,7 +67,7 @@ <h5 class="modal-title" id="exampleModalLabel">Qual a sua resposta?</h5>
6467
hideResponseButton();
6568
} else {
6669
alert('Resposta incorreta!')
67-
$("#responseButton").html("Tentar Novamente");
70+
$("#responseButton").html("Digite outra Resposta");
6871
}
6972
}
7073
);

0 commit comments

Comments
 (0)