TestPlatform
324 строки · 10.9 Кб
1import json2
3from django.contrib.auth.decorators import login_required4from django.http import JsonResponse, HttpResponse5from django.shortcuts import render, redirect6from django.template import loader7from django.urls import reverse8
9from editor.forms import CreationProjectForm, CreationTaskForm, EditTaskInfo, EditProjectInfo, CreationExerciseForm, \10CheckMarkDownForm, CreationStaticElementForm11
12from tests.models import Project, ProjectTask, ProjectTaskElement, BaseExercise, BaseStaticElement, \13ChronologyExercise, MatchExercise, InputExercise, AnswerExercise, RadioExercise, StatementsExercise, \14ImagesExercise, TitleElement, PictureElement, QuoteElement, DocumentElement, YandexMapsElement, \15MatchListExercise
16
17
18@login_required
19def editor_page(request):20template = loader.get_template('editor/tests_table.html')21
22columns = ['ID', 'Название', 'Заданий', 'Дата создания', 'Изменено']23published_tests_data = []24development_tests_data = []25
26projects = Project.objects.filter(author_id=request.user.id)27
28for project in projects:29if project.published:30published_tests_data.append(project.get_json())31else:32development_tests_data.append(project.get_json())33
34tests_context = {35'columns': columns,36'type': 'tests-list',37'class': 'development_tests'38}39
40context = {41'published_tests_table': template.render({**tests_context, 'rows': published_tests_data}),42'development_tests_table': template.render({**tests_context, 'rows': development_tests_data}),43'published_tests_exists': len(published_tests_data) != 0,44'development_tests_exists': len(development_tests_data) != 045}46
47return render(request, template_name='editor/editor.html', context=context)48
49
50@login_required
51def create_project(request):52if not request.POST:53return render(request, template_name='editor/creation_project.html')54
55project = Project(author=request.user)56form = CreationProjectForm(request.POST, request.FILES, instance=project)57
58project = Project.create(form)59
60if not project is None:61return redirect(reverse('editor:open_project', kwargs={'project_id': project.id}))62
63
64@login_required
65def remove_project(request, project_id):66if request.POST:67project = Project.objects.get(id=project_id)68if project.project_name == request.POST.get('input_projectname', None):69project.delete()70return redirect(reverse('editor:index'))71
72return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))73
74
75@login_required
76def open_project(request, project_id):77if request.POST:78data = json.loads(request.POST['json'])79if 'tasks_table' in data:80project = Project.objects.get(id=project_id)81if len(data['tasks_table']) == project.number_of_tasks:82for number, task_id in enumerate(data['tasks_table']):83task = ProjectTask.objects.get(id=task_id)84task.number = number + 185task.save()86
87template = loader.get_template('editor/tasks_table.html')88
89context_table = {90'type': 'tasks-list',91'class': 'tasks-list',92'columns': ['№', 'Название', 'Упражнений', 'Баллы'],93'rows': []94}95
96is_empty = True97
98for task in ProjectTask.objects.filter(project_id=project_id).order_by('number'):99context_table['rows'].append(task.get_json())100is_empty = False101
102context = {103'project': Project.objects.get(id=project_id),104'tasks_table': template.render(context_table),105'is_empty': is_empty106}107return render(request, 'editor/project/project_page.html', context)108
109
110@login_required
111def create_task(request, project_id):112if request.POST:113
114project = Project.objects.get(id=project_id)115task = ProjectTask(project=project)116
117form = CreationTaskForm(request.POST, instance=task)118
119if project.create_task(form):120project.number_of_tasks += 1121project.save()122return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task.id}))123
124return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))125
126
127@login_required
128def remove_task(request, project_id, task_id):129if request.POST:130selected_task = ProjectTask.objects.get(id=task_id)131number = selected_task.number132for task in ProjectTask.objects.filter(project_id=project_id, number__gt=number).order_by('number'):133task.number = number134task.save()135number += 1136selected_task.delete()137
138project = Project.objects.get(id=project_id)139project.number_of_tasks -= 1140project.save()141
142return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))143
144return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))145
146
147@login_required
148def edit_project(request, project_id):149if not request.POST:150context = {151'project': Project.objects.get(id=project_id)152}153return render(request, 'editor/project/project_edit.html', context)154
155project = Project.objects.get(id=project_id)156form = EditProjectInfo(request.POST, request.FILES, instance=project)157
158project.edit_info(form)159
160return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))161
162
163@login_required
164def publish_project(request, project_id):165project = Project.objects.get(id=project_id)166project.publish()167
168return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))169
170
171
172@login_required
173def editor_not_allowed(request):174return render(request, 'editor/editor_not_allowed.html')175
176
177@login_required
178def templates(request):179return render(request, 'develop_page.html')180
181
182@login_required
183def stats(request):184return render(request, 'develop_page.html')185
186
187@login_required
188def editor_modal_window(request):189return render(request, 'modal_window.html')190
191
192@login_required
193def edit_task(request, project_id, task_id):194if not request.POST:195context = {196'project': Project.objects.get(id=project_id),197'task': ProjectTask.objects.get(id=task_id)198}199return render(request, 'editor/project/task/task_edit.html', context)200
201task = ProjectTask.objects.get(id=task_id)202form = EditTaskInfo(request.POST, request.FILES, instance=task)203
204task.edit_info(form)205
206return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))207
208
209@login_required
210def open_task(request, project_id, task_id):211if request.POST:212data = json.loads(request.POST['json'])213if 'elements-ordering' in data:214number_of_elements = ProjectTaskElement.objects.filter(task_id=task_id).count()215print(number_of_elements)216if len(data['elements-ordering']) == number_of_elements:217for index, elem_id in enumerate(data['elements-ordering']):218element = ProjectTaskElement.objects.get(element_id=elem_id)219element.order = index + 1220element.save()221
222context = {223'project': Project.objects.get(id=project_id),224'task': ProjectTask.objects.get(id=task_id),225'elements': map(lambda x: x.get_child(), ProjectTaskElement.objects.filter(task_id=task_id).order_by('order')),226'creation_exercise_form': CreationExerciseForm(),227'creation_element_form': CreationStaticElementForm()228}229
230print(context['elements'])231
232return render(request, 'editor/project/task/task_page.html', context)233
234
235@login_required
236def upload_project_description(request, project_id):237
238form = CheckMarkDownForm(request.POST)239
240if form.is_valid():241project = Project.objects.get(id=project_id)242project.description_md = request.POST.get('markdown_field')243project.save()244
245# return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))246return JsonResponse({})247
248
249@login_required
250def upload_task_description(request, project_id, task_id):251
252form = CheckMarkDownForm(request.POST)253
254if form.is_valid():255task = ProjectTask.objects.get(id=task_id)256task.description_md = request.POST.get('markdown_field')257task.save()258
259return JsonResponse({})260
261
262@login_required
263def create_element(request, project_id, task_id):264if request.POST:265form = CreationStaticElementForm(request.POST)266
267task = ProjectTask.objects.get(id=task_id)268task.create_element(form)269
270return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))271
272
273@login_required
274def create_exercise(request, project_id, task_id):275if request.POST:276form = CreationExerciseForm(request.POST)277
278task = ProjectTask.objects.get(id=task_id)279task.create_exercise(form)280
281return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))282
283
284@login_required
285def remove_element(request, project_id, task_id):286if request.POST and request.POST.get('element_id', False):287elem_id = request.POST.get('element_id')288selected_element = ProjectTaskElement.objects.get(element_id=elem_id)289order = selected_element.order290for element in ProjectTaskElement.objects.filter(task_id=task_id, order__gt=order).order_by('order'):291element.order = order292element.save()293order += 1294selected_element.delete()295return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))296
297return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))298
299
300@login_required
301def change_element(request, project_id, task_id):302print(request.POST)303
304if request.POST and request.POST.get('element_id', False):305elem_id = request.POST.get('element_id')306selected_element = ProjectTaskElement.objects.get(element_id=elem_id).get_child()307
308if selected_element.element_type == 0:309
310if request.POST.get('title', False) or request.POST.get('title', False) == "":311selected_element.title = request.POST.get('title')312selected_element.save()313
314if request.POST.get('only_title', False):315return HttpResponse()316
317return JsonResponse(eval(f'{BaseExercise.CLASSES[selected_element.exercise_type]}.process_request(request, selected_element)'))318
319elif selected_element.element_type == 1:320return JsonResponse(eval(f'{BaseStaticElement.CLASSES[selected_element.static_element_type]}.process_request(request, selected_element)'))321
322return redirect(reverse('editor:open_project', kwargs={'project_id': project_id}))323
324return redirect(reverse('editor:open_task', kwargs={'project_id': project_id, 'task_id': task_id}))325
326
327