import django_rq from django.shortcuts import render, redirect, get_object_or_404 from django.utils import timezone from optimizer.forms import UploadProblemForm, CreateRunForm from optimizer.models import Problem, OptimizationRun, OptimizationRunStatus from optimizer.process.solver import run_solver from optimizer.process.xlsio import create_problem_from_xls from rzhdweb.zlogging import logger def view_index(request): return render(request, 'index.html', { 'latest_problems': Problem.objects.order_by('-created_at')[:5], 'latest_runs': OptimizationRun.objects.order_by('-created_at')[:5], 'upload_problem_form': UploadProblemForm() }) def view_upload_problem(request): form = UploadProblemForm(request.POST, request.FILES) if not form.is_valid(): return redirect('index') try: problem = create_problem_from_xls(form.files['file']) except Exception as e: logger.exception(e) return redirect('index') return redirect('problem', problem_id=problem.id) def view_problem(request, problem_id): problem = get_object_or_404(Problem, id=problem_id) return render(request, 'problem.html', { 'problem': problem, 'distances': problem.get_distances(), 'tasks': problem.get_tasks(), 'workers': problem.get_workers(), 'runs': problem.get_runs(), 'create_run_form': CreateRunForm(problem=problem), }) def view_problem_create_run(request, problem_id): problem = get_object_or_404(Problem, id=problem_id) form = CreateRunForm(request.POST, problem=problem) if not form.is_valid(): return render(request, 'problem.html', { 'problem': problem, 'distances': problem.get_distances(), 'tasks': problem.get_tasks(), 'workers': problem.get_workers(), 'runs': problem.get_runs(), 'create_run_form': form, }) run = OptimizationRun(problem=problem) param_set = form.get_param_set() critical_distances = form.get_critical_distances(problem) run.save() for param in param_set.all_params.values(): param.param_orm.run = run param_set.save() for i in critical_distances.values(): i.run = run i.save() run.save() return redirect('problem_run', problem_id=problem.id, run_id=run.id) def view_problem_run(request, problem_id, run_id): problem = get_object_or_404(Problem, id=problem_id) run = get_object_or_404(OptimizationRun, id=run_id) param_set = run.get_param_set() ctx = { 'problem': problem, 'run': run, 'param_set': param_set, 'critical_distances': run.get_critical_distances(), 'metrics': run.get_metrics() } if run.status == OptimizationRunStatus.IN_PROGRESS.value and run.started_at: started_at = run.started_at ctx['duration_total'] = param_set.solver_timeout.value ctx['duration_passed'] = min((timezone.now() - started_at).total_seconds(), ctx['duration_total']) return render(request, 'run.html', ctx) def view_problem_run_start(request, problem_id, run_id): problem = get_object_or_404(Problem, id=problem_id) run = get_object_or_404(OptimizationRun, id=run_id) if run.status == OptimizationRunStatus.NOT_STARTED.value: django_rq.enqueue(run_solver, problem=problem, run=run) run.status = OptimizationRunStatus.QUEUED.value run.save() else: logger.warn(f'Not starting run {run}') return redirect('problem_run', problem_id=problem.id, run_id=run.id)