Skip to content

Commit 61f57d8

Browse files
jureslakKarel Križnar
andcommitted
Support for moving problems.
Co-authored-by: Karel Križnar <karel.kriznar@student.fmf.uni-lj.si>
1 parent bba00aa commit 61f57d8

File tree

5 files changed

+129
-0
lines changed

5 files changed

+129
-0
lines changed

web/problems/models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,15 @@ def copy_to(self, problem_set):
151151
part.copy_to(new_problem)
152152
return new_problem
153153

154+
#premakni problem nekam #preveri ce je prav
155+
def move_to(self, problem_set):
156+
# ne naredi kopije, ampak ga samo premakne
157+
#self.pk = None
158+
self.problem_set = problem_set
159+
self.save()
160+
#for part in self.parts.all():
161+
# part.move_to(new_problem)
162+
154163
def content_type(self):
155164
return self.MIMETYPES[self.language]
156165

@@ -220,6 +229,13 @@ def copy_to(self, problem):
220229
new_part.save()
221230
return new_part
222231

232+
#preveri ce je prav
233+
def move_to(self, problem):
234+
#self.pk = None
235+
self.problem = problem
236+
self.save()
237+
return self
238+
223239
def attempt_token(self, user):
224240
return signing.dumps({
225241
'part': self.pk,

web/problems/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
url(r'^(?P<problem_pk>\d+)/move/(?P<shift>-?\d+)/$',
1717
views.problem_move,
1818
name='problem_move'),
19+
url(r'^(?P<problem_pk>\d+)/move_to/',
20+
views.move_to_form,
21+
name='problem_move_to'),
1922
url(r'^(?P<pk>\d+)/update/$',
2023
ProblemUpdate.as_view(),
2124
name='problem_update'),

web/problems/views.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,38 @@ def copy_form(request, problem_pk):
131131
}
132132
)
133133

134+
class MoveToProblemForm(Form):
135+
problem_set_id = IntegerField(label='Problem set id')
136+
137+
def move_to_form(request, problem_pk):
138+
"""
139+
Show and react to MoveForm.
140+
"""
141+
problem = Problem.objects.get(pk=problem_pk)
142+
verify(request.user.can_edit_problem_set(problem.problem_set))
143+
if request.method == 'POST':
144+
form = MoveToProblemForm(request.POST)
145+
if form.is_valid():
146+
problem_set_pk = form.cleaned_data['problem_set_id']
147+
problem_set = ProblemSet.objects.get(pk=problem_set_pk)
148+
verify(request.user.can_edit_problem_set(problem_set))
149+
problem.move_to(problem_set)
150+
return redirect(problem_set)
151+
else:
152+
# TODO: handle errors
153+
response = HttpResponse("Please select a problem set.")
154+
return response
155+
else:
156+
form = MoveToProblemForm()
157+
courses = request.user.taught_courses.all()
158+
return render(
159+
request, 'courses/problem_move_form.html',
160+
{
161+
'form': form,
162+
'courses': courses,
163+
'problem': problem,
164+
}
165+
)
134166

135167
@login_required
136168
def problem_solution(request, problem_pk, user_pk):
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{% load i18n %}
2+
3+
<div class="modal-header">
4+
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
5+
{# Translators: Title of move problem modal.#}
6+
<h4 class="modal-title">{% trans "Move problem" %} {{ problem.title }}</h4>
7+
</div>
8+
<div class="modal-body">
9+
{# Translators: Text of move problem modal.#}
10+
{% trans "Please choose a problem set to move this problem to:" %}
11+
12+
<form action="{% url 'problem_move_to' problem.id %}" method="post" id='move_problem_form'>
13+
{% csrf_token %}
14+
<input type="hidden" name="problem_set_id", id="problem_set_id">
15+
<div id='problem_list_tree'></div>
16+
</form>
17+
</div>
18+
<div class="modal-footer">
19+
<button class="btn btn-primary" id="button_move_confirm" disabled=true>
20+
{# Translators: Confirm moving a problem.#}
21+
{% trans "Move" %}
22+
</button>
23+
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Cancel" %}</button>
24+
</div>
25+
26+
<script>
27+
function moveButtonDisabled(state) {
28+
$button = $("#button_move_confirm");
29+
$button.attr("disabled", state);
30+
}
31+
32+
function nodeSelected() {
33+
moveButtonDisabled(false);
34+
}
35+
36+
function nodeUnselected() {
37+
moveButtonDisabled(true);
38+
}
39+
40+
$('#button_move_confirm').on('click', function () {
41+
selectedItem = $('#problem_list_tree').treeview('getSelected')[0];
42+
console.log("tada");
43+
console.log(selectedItem);
44+
console.log(selectedItem.id);
45+
$("#problem_set_id").val(selectedItem.id);
46+
$("#move_problem_form").submit();
47+
});
48+
49+
var data = [
50+
// Prepare data
51+
{% for course in courses %}
52+
{
53+
text: "{{ course.title }}",
54+
selectable: false,
55+
nodes: [
56+
{% for ps in course.problem_sets.all %}
57+
{
58+
text: "{{ ps.title }}",
59+
id: {{ ps.id }}
60+
},
61+
{% endfor %}
62+
]
63+
},
64+
{% endfor %}
65+
];
66+
problem_tree = $('#problem_list_tree');
67+
problem_tree.treeview(
68+
{
69+
data: data,
70+
levels: 1,
71+
onNodeSelected: nodeSelected,
72+
onNodeUnselected: nodeUnselected,
73+
});
74+
</script>

web/templates/courses/problem_set_detail.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ <h5>{{ problem.title }}</h5>
104104
data-toggle="tooltip" title="{% trans 'Copy' %}" data-container="body">
105105
<i class="fa fa-copy" aria-hidden="true"></i>
106106
</a>
107+
<a class="btn btn-default btn-for-modal edit-btn" aria-label="Move" data-url="{% url 'problem_move_to' problem.id %}"
108+
data-toggle="tooltip" title="{% trans 'Move to' %}" data-container="body">
109+
<i class="fa fa-arrows-alt" aria-hidden="true"></i>
110+
</a>
107111
<a class="btn btn-default btn-for-modal edit-btn trash-btn" aria-label="Delete" data-url="{% url 'problem_delete' problem.id %}">
108112
<i class="fa fa-trash" aria-hidden="true"></i>
109113
</a>

0 commit comments

Comments
 (0)