119 lines
3.3 KiB
Python
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)
|