diff options
Diffstat (limited to 'WebKitTools/QueueStatusServer/handlers')
4 files changed, 148 insertions, 7 deletions
diff --git a/WebKitTools/QueueStatusServer/handlers/dashboard.py b/WebKitTools/QueueStatusServer/handlers/dashboard.py index 80f30ec..bbb65b8 100644 --- a/WebKitTools/QueueStatusServer/handlers/dashboard.py +++ b/WebKitTools/QueueStatusServer/handlers/dashboard.py @@ -26,16 +26,55 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import operator + from google.appengine.ext import webapp from google.appengine.ext.webapp import template from model.attachment import Attachment +from model.queues import queues + class Dashboard(webapp.RequestHandler): - def get(self): - attachments = Attachment.recent(limit=25) + # FIXME: This list probably belongs as part of a Queue object in queues.py + # Arrays are bubble_name, queue_name + # FIXME: Can this be unified with StatusBubble._queues_to_display? + _queues_to_display = [ + ["Style", "style-queue"], + ["Cr-Linux", "chromium-ews"], + ["Cr-Win", "cr-win-ews"], + ["Qt", "qt-ews"], + ["Gtk", "gtk-ews"], + ["Mac", "mac-ews"], + ["Win", "win-ews"], + ["Commit", "commit-queue"], + ] + # Split the zipped list into component parts + _header_names, _ordered_queue_names = zip(*_queues_to_display) + + # This asserts that all of the queues listed above are valid queue names. + assert(reduce(operator.and_, map(lambda name: name in queues, _ordered_queue_names))) + + def _build_bubble(self, attachment, queue_name): + queue_status = attachment.status_for_queue(queue_name) + bubble = { + "status_class": attachment.state_from_queue_status(queue_status) if queue_status else "none", + "status_date": queue_status.date if queue_status else None, + } + return bubble + + def _build_row(self, attachment): + row = { + "bug_id": attachment.bug_id(), + "attachment_id": attachment.id, + "bubbles": [self._build_bubble(attachment, queue_name) for queue_name in self._ordered_queue_names], + } + return row + + def get(self): template_values = { - "summaries" : [attachment.summary() for attachment in attachments], + "headers": self._header_names, + "rows": [self._build_row(attachment) for attachment in Attachment.recent(limit=25)], } self.response.out.write(template.render("templates/dashboard.html", template_values)) diff --git a/WebKitTools/QueueStatusServer/handlers/statusbubble.py b/WebKitTools/QueueStatusServer/handlers/statusbubble.py index d52509f..0e2b8de 100644 --- a/WebKitTools/QueueStatusServer/handlers/statusbubble.py +++ b/WebKitTools/QueueStatusServer/handlers/statusbubble.py @@ -26,17 +26,50 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import operator + from google.appengine.ext import webapp from google.appengine.ext.webapp import template from model.attachment import Attachment +from model.workitems import WorkItems +from model.queues import queues, name_with_underscores class StatusBubble(webapp.RequestHandler): + # FIXME: This list probably belongs as part of a Queue object in queues.py + # Arrays are bubble_name, queue_name + _queues_to_display = [ + ["style", "style-queue"], + ["cr-linux", "chromium-ews"], + ["cr-win", "cr-win-ews"], + ["gtk", "gtk-ews"], + ["qt", "qt-ews"], + ["mac", "mac-ews"], + ["win", "win-ews"], + ] + + # This asserts that all of the queues listed above are valid queue names. + assert(reduce(operator.and_, map(lambda name_pair: name_pair[1] in queues, _queues_to_display))) + + def _build_bubble(self, queue_name_pair, attachment): + bubble_name = queue_name_pair[0] + queue_name = queue_name_pair[1] + + queue_status = attachment.status_for_queue(queue_name) + bubble = { + "name": bubble_name, + "attachment_id": attachment.id, + "queue_position": attachment.position_in_queue(queue_name), + "state": attachment.state_from_queue_status(queue_status) if queue_status else "none", + "status": queue_status, + } + return bubble + def get(self, attachment_id): attachment = Attachment(int(attachment_id)) - + bubbles = [self._build_bubble(name_pair, attachment) for name_pair in self._queues_to_display] template_values = { - "summary" : attachment.summary() + "bubbles": bubbles, } self.response.out.write(template.render("templates/statusbubble.html", template_values)) diff --git a/WebKitTools/QueueStatusServer/handlers/updatestatus.py b/WebKitTools/QueueStatusServer/handlers/updatestatus.py index 50d4b6e..5a93dbd 100644 --- a/WebKitTools/QueueStatusServer/handlers/updatestatus.py +++ b/WebKitTools/QueueStatusServer/handlers/updatestatus.py @@ -38,9 +38,10 @@ class UpdateStatus(UpdateBase): def get(self): self.response.out.write(template.render("templates/updatestatus.html", None)) - def post(self): + def _queue_status_from_request(self): queue_status = QueueStatus() + # FIXME: I think this can be removed, no one uses it. if users.get_current_user(): queue_status.author = users.get_current_user() @@ -53,6 +54,10 @@ class UpdateStatus(UpdateBase): queue_status.message = self.request.get("status") results_file = self.request.get("results_file") queue_status.results_file = db.Blob(str(results_file)) + return queue_status + + def post(self): + queue_status = self._queue_status_from_request() queue_status.put() - Attachment.dirty(patch_id) + Attachment.dirty(queue_status.active_patch_id) self.response.out.write(queue_status.key().id()) diff --git a/WebKitTools/QueueStatusServer/handlers/updateworkitems.py b/WebKitTools/QueueStatusServer/handlers/updateworkitems.py new file mode 100644 index 0000000..b58e743 --- /dev/null +++ b/WebKitTools/QueueStatusServer/handlers/updateworkitems.py @@ -0,0 +1,64 @@ +# Copyright (C) 2010 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from google.appengine.ext import webapp, db +from google.appengine.ext.webapp import template + +from handlers.updatebase import UpdateBase +from model.queues import queues +from model.workitems import WorkItems + +from datetime import datetime + + +class UpdateWorkItems(UpdateBase): + def get(self): + self.response.out.write(template.render("templates/updateworkitems.html", None)) + + def _work_items_for_queue(self, queue_name): + if queue_name not in queues: + self.response.set_status(500) + return + work_items = WorkItems.all().filter("queue_name =", queue_name).get() + if not work_items: + work_items = WorkItems() + work_items.queue_name = queue_name + return work_items + + def _work_items_from_request(self): + queue_name = self.request.get("queue_name") + work_items = self._work_items_for_queue(queue_name) + items_string = self.request.get("work_items") + # Our parsing could be much more robust. + work_items.item_ids = map(int, items_string.split(" ")) + work_items.date = datetime.now() + return work_items + + def post(self): + work_items = self._work_items_from_request() + work_items.put() |