Files
rzhd/src/optimizer/views.py
2018-11-12 15:50:56 +04:00

119 lines
3.3 KiB
Python

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)