| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Commit queue status.""" | 5 """Commit queue status.""" |
| 6 | 6 |
| 7 import cgi | 7 import cgi |
| 8 import datetime | 8 import datetime |
| 9 import json | 9 import json |
| 10 import logging | 10 import logging |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 if not self.user: | 308 if not self.user: |
| 309 user = None | 309 user = None |
| 310 else: | 310 else: |
| 311 user = self.user.email() | 311 user = self.user.email() |
| 312 return user | 312 return user |
| 313 | 313 |
| 314 | 314 |
| 315 class OwnerStats(object): | 315 class OwnerStats(object): |
| 316 """CQ usage statistics for a single user.""" | 316 """CQ usage statistics for a single user.""" |
| 317 def __init__(self, now, owner, last_day, last_week, last_month, forever): | 317 def __init__(self, now, owner, last_day, last_week, last_month, forever): |
| 318 # Since epoch in float. |
| 318 self.now = now | 319 self.now = now |
| 320 # User instance. |
| 319 self.owner = owner | 321 self.owner = owner |
| 322 assert all(isinstance(i, PendingCommit) for i in last_day) |
| 320 self.last_day = last_day | 323 self.last_day = last_day |
| 324 assert all(isinstance(i, PendingCommit) for i in last_week) |
| 321 self.last_week = last_week | 325 self.last_week = last_week |
| 326 assert isinstance(last_month, int) |
| 322 self.last_month = last_month | 327 self.last_month = last_month |
| 328 assert isinstance(forever, int) |
| 323 self.forever = forever | 329 self.forever = forever |
| 330 # Gamify ALL the things! |
| 331 self.points = ( |
| 332 len(self.last_day) * 10 + |
| 333 len(self.last_week) * 5 + |
| 334 self.last_month + 2 + |
| 335 self.forever) |
| 324 | 336 |
| 325 | 337 |
| 326 class OwnerQuery(object): | 338 class OwnerQuery(object): |
| 327 def __init__(self, owner_key, now): | 339 def __init__(self, owner_key, now): |
| 328 self.owner_key = owner_key | 340 self.owner_key = owner_key |
| 329 self.now = now | 341 self.now = now |
| 330 since = lambda x: now - datetime.timedelta(days=x) | 342 since = lambda x: now - datetime.timedelta(days=x) |
| 331 self._owner = db.get_async(owner_key) | 343 self._owner = db.get_async(owner_key) |
| 332 self._last_day = self._pendings().filter('created >=', since(1)).run() | 344 self._last_day = self._pendings().filter('created >=', since(1)).run() |
| 333 self._last_week = self._pendings().filter( | 345 self._last_week = self._pendings().filter( |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 'last_month': stats.last_month, | 407 'last_month': stats.last_month, |
| 396 'forever': stats.forever, | 408 'forever': stats.forever, |
| 397 } | 409 } |
| 398 owners.append(data) | 410 owners.append(data) |
| 399 owners.sort(key=lambda x: -x['last_month']) | 411 owners.sort(key=lambda x: -x['last_month']) |
| 400 template_values = self.InitializeTemplate(self.APP_NAME + ' Commit queue') | 412 template_values = self.InitializeTemplate(self.APP_NAME + ' Commit queue') |
| 401 template_values['data'] = owners | 413 template_values['data'] = owners |
| 402 self.DisplayTemplate('cq_owners.html', template_values, use_cache=True) | 414 self.DisplayTemplate('cq_owners.html', template_values, use_cache=True) |
| 403 | 415 |
| 404 | 416 |
| 417 class TopScore(CQBasePage): |
| 418 def _get_as_html(self, _): |
| 419 owners = [ |
| 420 { |
| 421 'name': stats.owner.email.split('@', 1)[0].upper(), |
| 422 'points': stats.points, |
| 423 } |
| 424 for stats in monthly_top_contributors() |
| 425 ] |
| 426 owners.sort(key=lambda x: -x['points']) |
| 427 for i in xrange(len(owners)): |
| 428 if i == 0: |
| 429 owners[i]['rank'] = '1st' |
| 430 elif i == 1: |
| 431 owners[i]['rank'] = '2nd' |
| 432 elif i == 2: |
| 433 owners[i]['rank'] = '3rd' |
| 434 else: |
| 435 owners[i]['rank'] = '%dth' % (i + 1) |
| 436 template_values = self.InitializeTemplate(self.APP_NAME + ' Commit queue') |
| 437 template_values['data'] = owners |
| 438 self.DisplayTemplate('cq_top_score.html', template_values, use_cache=True) |
| 439 |
| 440 |
| 405 class User(CQBasePage): | 441 class User(CQBasePage): |
| 406 def _get_as_html(self, query): | 442 def _get_as_html(self, query): |
| 407 pending_commits_events = {} | 443 pending_commits_events = {} |
| 408 pending_commits = {} | 444 pending_commits = {} |
| 409 for event in query.fetch(self._get_limit()): | 445 for event in query.fetch(self._get_limit()): |
| 410 # Implicitly find PendingCommit's. | 446 # Implicitly find PendingCommit's. |
| 411 pending_commit = event.parent() | 447 pending_commit = event.parent() |
| 412 if not pending_commit: | 448 if not pending_commit: |
| 413 logging.warn('Event %s is corrupted, can\'t find %s' % ( | 449 logging.warn('Event %s is corrupted, can\'t find %s' % ( |
| 414 event.key().id_or_name(), event.parent_key().id_or_name())) | 450 event.key().id_or_name(), event.parent_key().id_or_name())) |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 546 |
| 511 | 547 |
| 512 def bootstrap(): | 548 def bootstrap(): |
| 513 # Used by _parse_packet() to find the right model to use from the | 549 # Used by _parse_packet() to find the right model to use from the |
| 514 # 'verification' value of the packet. | 550 # 'verification' value of the packet. |
| 515 module = sys.modules[__name__] | 551 module = sys.modules[__name__] |
| 516 for i in dir(module): | 552 for i in dir(module): |
| 517 if i.endswith('Event') and i != 'VerificationEvent': | 553 if i.endswith('Event') and i != 'VerificationEvent': |
| 518 obj = getattr(module, i) | 554 obj = getattr(module, i) |
| 519 EVENT_MAP[obj.name] = obj | 555 EVENT_MAP[obj.name] = obj |
| OLD | NEW |