blob: daf9b39fa827a6b0f39ccc41a876b7585750e804 [file]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Issue object for working with issue tracker issues"""
import copy
import re
from monorail_api.change_tracking_list import ChangeTrackingList
from monorail_api.customized_field import CustomizedField
from monorail_api.utils import parseDateTime
_LIST_FIELDS = ['blocked_on', 'blocking', 'cc',
'components', 'field_values', 'labels']
class Issue(object):
def __init__(self, issue_entry):
# Change these directly via __dict__ to avoid triggering __setattr_ below,
# which would immediately mark issue dirty again.
self.__dict__['_dirty'] = False
self.__dict__['_changed'] = set()
self.id = issue_entry.get('id')
self.blocked_on = ChangeTrackingList(
e['issueId'] for e in issue_entry.get('blockedOn', []))
self.blocking = ChangeTrackingList(
e['issueId'] for e in issue_entry.get('blocking', []))
self.merged_into = issue_entry.get('mergedInto', {}).get('issueId')
self.merged_into_project = (
issue_entry.get('mergedInto', {}).get('projectId'))
self.created = parseDateTime(issue_entry.get('published'))
self.updated = parseDateTime(issue_entry.get('updated'))
self.closed = parseDateTime(issue_entry.get('closed'))
self.summary = issue_entry.get('summary')
self.description = issue_entry.get('description')
self.reporter = issue_entry.get('author', {}).get('name')
self.owner = issue_entry.get('owner', {}).get('name')
self.status = issue_entry.get('status')
self.stars = issue_entry.get('stars')
self.open = issue_entry.get('state') == 'open'
self.labels = ChangeTrackingList(issue_entry.get('labels', []))
self.components = ChangeTrackingList(issue_entry.get('components', []))
self.cc = ChangeTrackingList([e['name'] for e in issue_entry.get('cc', [])])
self.project_id = issue_entry.get('projectId')
self.field_values = ChangeTrackingList(
[CustomizedField.ConvertFromDict(field)
for field in issue_entry.get('fieldValues', [])])
self.setClean()
@property
def dirty(self):
return (self.__dict__['_dirty'] or
any(self.__dict__[key].isChanged() for key in _LIST_FIELDS))
@property
def changed(self):
res = self.__dict__['_changed']
for key in _LIST_FIELDS:
if self.__dict__[key].isChanged():
res.add(key)
return res
def setClean(self):
for key in _LIST_FIELDS:
self.__dict__[key].reset()
self.__dict__['_changed'].clear()
self.__dict__['_dirty'] = False
def __setattr__(self, name, value):
self.__dict__[name] = value
self.__dict__['_dirty'] = True
self.__dict__['_changed'].add(name)