Skip to content

Commit 5e46673

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

File tree

5 files changed

+131
-0
lines changed

5 files changed

+131
-0
lines changed

web/problems/models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,15 @@ def copy_to(self, problem_set):
204204
part.copy_to(new_problem)
205205
return new_problem
206206

207+
# premakni problem nekam #preveri ce je prav
208+
def move_to(self, problem_set):
209+
# ne naredi kopije, ampak ga samo premakne
210+
# self.pk = None
211+
self.problem_set = problem_set
212+
self.save()
213+
# for part in self.parts.all():
214+
# part.move_to(new_problem)
215+
207216
def content_type(self):
208217
return self.MIMETYPES[self.language]
209218

@@ -266,6 +275,13 @@ def copy_to(self, problem):
266275
new_part.save()
267276
return new_part
268277

278+
# preveri ce je prav
279+
def move_to(self, problem):
280+
# self.pk = None
281+
self.problem = problem
282+
self.save()
283+
return self
284+
269285
def attempt_token(self, user):
270286
return signing.dumps(
271287
{

web/problems/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
views.problem_move,
3434
name="problem_move",
3535
),
36+
path("<int:problem_pk>/move_to/", views.move_to_form, name="problem_move_to"),
3637
path(
3738
"<int:problem_pk>/toggle_visible/",
3839
views.problem_toggle_visible,

web/problems/views.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,42 @@ def copy_form(request, problem_pk):
156156
)
157157

158158

159+
class MoveToProblemForm(Form):
160+
problem_set_id = IntegerField(label="Problem set id")
161+
162+
163+
def move_to_form(request, problem_pk):
164+
"""
165+
Show and react to MoveForm.
166+
"""
167+
problem = Problem.objects.get(pk=problem_pk)
168+
verify(request.user.can_edit_problem_set(problem.problem_set))
169+
if request.method == "POST":
170+
form = MoveToProblemForm(request.POST)
171+
if form.is_valid():
172+
problem_set_pk = form.cleaned_data["problem_set_id"]
173+
problem_set = ProblemSet.objects.get(pk=problem_set_pk)
174+
verify(request.user.can_edit_problem_set(problem_set))
175+
problem.move_to(problem_set)
176+
return redirect(problem_set)
177+
else:
178+
# TODO: handle errors
179+
response = HttpResponse("Please select a problem set.")
180+
return response
181+
else:
182+
form = MoveToProblemForm()
183+
courses = request.user.taught_courses.all()
184+
return render(
185+
request,
186+
"courses/problem_move_form.html",
187+
{
188+
"form": form,
189+
"courses": courses,
190+
"problem": problem,
191+
},
192+
)
193+
194+
159195
@login_required
160196
def problem_solution(request, problem_pk, user_pk):
161197
"""Show problem solution."""
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
@@ -154,6 +154,10 @@ <h5>{{ problem.title }}</h5>
154154
data-toggle="tooltip" title="{% trans 'Copy' %}" data-container="body">
155155
<i class="fa fa-copy" aria-hidden="true"></i>
156156
</a>
157+
<a class="btn btn-default btn-for-modal edit-btn" aria-label="Move" data-url="{% url 'problem_move_to' problem.id %}"
158+
data-toggle="tooltip" title="{% trans 'Move to' %}" data-container="body">
159+
<i class="fa fa-arrows-alt" aria-hidden="true"></i>
160+
</a>
157161
<a class="btn btn-default btn-for-modal edit-btn trash-btn" aria-label="Delete" data-url="{% url 'problem_delete' problem.id %}">
158162
<i class="fa fa-trash" aria-hidden="true"></i>
159163
</a>

0 commit comments

Comments
 (0)