blob: 10c0f1fca46ed1595aa19705d076c236c04401f8 [file] [log] [blame]
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""All django views for the build_annotations app."""
from __future__ import print_function
from django import http
from django import shortcuts
from django.core import urlresolvers
from django.views import generic
from google.appengine.api import users
from build_annotations import build_row_controller
from build_annotations import models as ba_models
from build_annotations import forms as ba_forms
_DEFAULT_USERNAME = "SomeoneGotHereWithoutLoggingIn"
class ListBuildsView(generic.list.ListView):
"""The landing page view of the app. Lists requested builds."""
template_name = 'build_annotations/index.html'
def __init__(self, *args, **kwargs):
super(ListBuildsView, self).__init__(*args, **kwargs)
self._username = _DEFAULT_USERNAME
self._build_config = None
self._search_form = None
self._controller = None
self._session = None
self._builds_list = None
self._hist = None
def get_queryset(self):
self._EnsureSessionInitialized()
self._controller = build_row_controller.BuildRowController()
build_config_q = None
if self._build_config is not None:
build_config_q = self._controller.GetQRestrictToBuildConfig(
self._build_config)
self._builds_list = self._controller.GetStructuredBuilds(
latest_build_id=self._session['latest_build_id'],
num_builds=self._session['num_builds'],
extra_filter_q=build_config_q)
self._hist = self._controller.GetHandlingTimeHistogram(
latest_build_id=self._session['latest_build_id'],
num_builds=self._session['num_builds'],
extra_filter_q=build_config_q)
return self._builds_list
def get_context_object_name(self, _):
return 'builds_list'
def get_context_data(self, **kwargs):
context = super(ListBuildsView, self).get_context_data(**kwargs)
context['username'] = self._username
context['search_form'] = self._GetSearchForm()
context['latest_build_id_cached'] = self._GetLatestBuildId()
context['build_config'] = self._build_config
context['histogram_data'] = self._hist
return context
# pylint: disable=arguments-differ
def get(self, request, build_config=None):
# We're assured that a username exists in prod because our app sits behind
# appengine login. Not so when running from dev_appserver.
self._username = users.get_current_user()
self._session = request.session
self._build_config = build_config
return super(ListBuildsView, self).get(request)
def post(self, request, build_config):
self._session = request.session
form = ba_forms.SearchForm(request.POST)
self._search_form = form
if form.is_valid():
self._session['latest_build_id'] = form.cleaned_data['latest_build_id']
self._session['num_builds'] = form.cleaned_data['num_builds']
return self.get(request, build_config)
def put(self, *args, **kwargs):
return self.post(*args, **kwargs)
def _GetSearchForm(self):
if self._search_form is not None:
return self._search_form
return ba_forms.SearchForm(
{'latest_build_id': self._session['latest_build_id'],
'num_builds': self._session['num_builds']})
def _EnsureSessionInitialized(self):
latest_build_id = self._session.get('latest_build_id', None)
num_results = self._session.get('num_builds', None)
if latest_build_id is None or num_results is None:
# We don't have a valid search history in this session, obtain defaults.
controller = build_row_controller.BuildRowController()
controller.GetStructuredBuilds(num_builds=1)
self._session['latest_build_id'] = controller.latest_build_id
self._session['num_builds'] = controller.DEFAULT_NUM_BUILDS
def _GetLatestBuildId(self):
controller = build_row_controller.BuildRowController()
controller.GetStructuredBuilds(num_builds=1)
return controller.latest_build_id
class EditAnnotationsView(generic.base.View):
"""View that handles annotation editing page."""
template_name = 'build_annotations/edit_annotations.html'
def __init__(self, *args, **kwargs):
self._username = _DEFAULT_USERNAME
self._formset = None
self._context = {}
self._request = None
self._session = None
self._build_config = None
self._build_id = None
super(EditAnnotationsView, self).__init__(*args, **kwargs)
def get(self, request, build_config, build_id):
# We're assured that a username exists in prod because our app sits behind
# appengine login. Not so when running from dev_appserver.
self._username = users.get_current_user()
self._request = request
self._build_config = build_config
self._build_id = build_id
self._session = request.session
self._PopulateContext()
return shortcuts.render(request, self.template_name, self._context)
def post(self, request, build_config, build_id):
# We're assured that a username exists in prod because our app sits behind
# appengine login. Not so when running from dev_appserver.
self._username = users.get_current_user()
self._request = request
self._build_config = build_config
self._build_id = build_id
self._session = request.session
self._formset = ba_forms.AnnotationsFormSet(request.POST)
if self._formset.is_valid():
self._SaveAnnotations()
return http.HttpResponseRedirect(
urlresolvers.reverse('build_annotations:edit_annotations',
args=[self._build_config, self._build_id]))
else:
self._PopulateContext()
return shortcuts.render(request, self.template_name, self._context)
def _PopulateContext(self):
build_row = self._GetBuildRow()
if build_row is None:
raise http.Http404
self._context = {}
self._context['username'] = self._username
self._context['build_config'] = self._build_config
self._context['build_row'] = build_row
self._context['annotations_formset'] = self._GetAnnotationsFormSet()
def _GetBuildRow(self):
controller = build_row_controller.BuildRowController()
build_row_list = controller.GetStructuredBuilds(
latest_build_id=self._build_id,
num_builds=1)
if not build_row_list:
return None
return build_row_list[0]
def _GetAnnotationsFormSet(self):
if self._formset is None:
build_row = self._GetBuildRow()
if build_row is not None:
queryset = build_row.GetAnnotationsQS()
else:
queryset = ba_models.AnnotationsTable.objects.none()
self._formset = ba_forms.AnnotationsFormSet(queryset=queryset)
return self._formset
def _SaveAnnotations(self):
models_to_save = self._formset.save(commit=False)
build_row = self._GetBuildRow()
for model in models_to_save:
if not hasattr(model, 'build_id') or model.build_id is None:
model.build_id = build_row.build_entry
model.last_annotator = self._username
model.save()