Exemplo n.º 1
0
def SortGridHeadings(col_name, heading_value_list, users_by_id, config,
                     asc_accessors):
    """Sort the grid headings according to well-known status and label order.

  Args:
    col_name: String column name that is used on that grid axis.
    heading_value_list: List of grid row or column heading values.
    users_by_id: Dict mapping user_ids to UserViews.
    config: ProjectIssueConfig PB for the current project.
    asc_accessors: Dict (col_name -> function()) for special columns.

  Returns:
    The same heading values, but sorted in a logical order.
  """
    decorated_list = []
    fd = tracker_bizobj.FindFieldDef(col_name, config)
    if fd and fd.field_type != tracker_pb2.FieldTypes.ENUM_TYPE:  # Handle fields.
        for value in heading_value_list:
            field_value = tracker_bizobj.GetFieldValueWithRawValue(
                fd.field_type, None, users_by_id, value)
            decorated_list.append([field_value, field_value])
    elif col_name == 'status':
        wk_statuses = [
            wks.status.lower() for wks in config.well_known_statuses
        ]
        decorated_list = [(_WKSortingValue(value.lower(), wk_statuses), value)
                          for value in heading_value_list]

    elif col_name in asc_accessors:  # Special cols still sort alphabetically.
        decorated_list = [(value, value) for value in heading_value_list]

    else:  # Anything else is assumed to be a label prefix
        col_name_dash = col_name + '-'
        wk_labels = []
        for wkl in config.well_known_labels:
            lab_lower = wkl.label.lower()
            if lab_lower.startswith(col_name_dash):
                wk_labels.append(lab_lower.split('-', 1)[-1])
        decorated_list = [(_WKSortingValue(value.lower(), wk_labels), value)
                          for value in heading_value_list]

    decorated_list.sort()
    result = [decorated_tuple[1] for decorated_tuple in decorated_list]
    logging.info('Headers for %s are: %r', col_name, result)
    return result
Exemplo n.º 2
0
def GetArtifactAttr(art,
                    attribute_name,
                    users_by_id,
                    label_attr_values_dict,
                    config,
                    related_issues,
                    hotlist_issue_context=None):
    """Return the requested attribute values of the given artifact.

  Args:
    art: a tracked artifact with labels, local_id, summary, stars, and owner.
    attribute_name: lowercase string name of attribute to get.
    users_by_id: dictionary of UserViews already created.
    label_attr_values_dict: dictionary {'key': [value, ...], }.
    config: ProjectIssueConfig PB for the current project.
    related_issues: dict {issue_id: issue} of pre-fetched related issues.
    hotlist_issue_context: dict of {hotlist_issue_field: field_value,..}

  Returns:
    A list of string attribute values, or [framework_constants.NO_VALUES]
    if the artifact has no value for that attribute.
  """
    if attribute_name == '--':
        return []
    if attribute_name == 'id':
        return [art.local_id]
    if attribute_name == 'summary':
        return [art.summary]
    if attribute_name == 'status':
        return [tracker_bizobj.GetStatus(art)]
    if attribute_name == 'stars':
        return [art.star_count]
    if attribute_name == 'attachments':
        return [art.attachment_count]
    # TODO(jrobbins): support blocking
    if attribute_name == 'project':
        return [art.project_name]
    if attribute_name == 'mergedinto':
        if art.merged_into and art.merged_into != 0:
            return [
                tracker_bizobj.FormatIssueRef(
                    (related_issues[art.merged_into].project_name,
                     related_issues[art.merged_into].local_id))
            ]
        else:
            return [framework_constants.NO_VALUES]
    if attribute_name == 'blocked':
        return ['Yes' if art.blocked_on_iids else 'No']
    if attribute_name == 'blockedon':
        if not art.blocked_on_iids:
            return [framework_constants.NO_VALUES]
        else:
            return [
                tracker_bizobj.FormatIssueRef(
                    (related_issues[blocked_on_iid].project_name,
                     related_issues[blocked_on_iid].local_id))
                for blocked_on_iid in art.blocked_on_iids
            ]
    if attribute_name == 'adder':
        if hotlist_issue_context:
            adder_id = hotlist_issue_context['adder_id']
            return [users_by_id[adder_id].display_name]
        else:
            return [framework_constants.NO_VALUES]
    if attribute_name == 'added':
        if hotlist_issue_context:
            return [hotlist_issue_context['date_added']]
        else:
            return [framework_constants.NO_VALUES]
    if attribute_name == 'reporter':
        return [users_by_id[art.reporter_id].display_name]
    if attribute_name == 'owner':
        owner_id = tracker_bizobj.GetOwnerId(art)
        if not owner_id:
            return [framework_constants.NO_VALUES]
        else:
            return [users_by_id[owner_id].display_name]
    if attribute_name == 'cc':
        cc_ids = tracker_bizobj.GetCcIds(art)
        if not cc_ids:
            return [framework_constants.NO_VALUES]
        else:
            return [users_by_id[cc_id].display_name for cc_id in cc_ids]
    if attribute_name == 'component':
        comp_ids = list(art.component_ids) + list(art.derived_component_ids)
        if not comp_ids:
            return [framework_constants.NO_VALUES]
        else:
            paths = []
            for comp_id in comp_ids:
                cd = tracker_bizobj.FindComponentDefByID(comp_id, config)
                if cd:
                    paths.append(cd.path)
            return paths

    # Check to see if it is a field. Process as field only if it is not an enum
    # type because enum types are stored as key-value labels.
    fd = tracker_bizobj.FindFieldDef(attribute_name, config)
    if fd and fd.field_type != tracker_pb2.FieldTypes.ENUM_TYPE:
        values = []
        for fv in art.field_values:
            if fv.field_id == fd.field_id:
                value = tracker_bizobj.GetFieldValueWithRawValue(
                    fd.field_type, fv, users_by_id, None)
                values.append(value)
        return values

    # Since it is not a built-in attribute or a field, it must be a key-value
    # label.
    return label_attr_values_dict.get(attribute_name,
                                      [framework_constants.NO_VALUES])
  def testGetFieldValueWithRawValue(self):
    class MockUser(object):
      def __init__(self):
        self.email = '*****@*****.**'
    users_by_id = {111: MockUser()}

    class MockFieldValue(object):
      def __init__(
          self, int_value=None, str_value=None, user_id=None, date_value=None):
        self.int_value = int_value
        self.str_value = str_value
        self.user_id = user_id
        self.date_value = date_value

    # Test user types.
    # Use user_id from the field_value and get user from users_by_id.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.USER_TYPE,
        users_by_id=users_by_id,
        field_value=MockFieldValue(user_id=111),
        raw_value=113,
    )
    self.assertEqual('*****@*****.**', val)
    # Specify user_id that does not exist in users_by_id.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.USER_TYPE,
        users_by_id=users_by_id,
        field_value=MockFieldValue(user_id=112),
        raw_value=113,
    )
    self.assertEqual(112, val)
    # Pass in empty users_by_id.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.USER_TYPE,
        users_by_id={},
        field_value=MockFieldValue(user_id=111),
        raw_value=113,
    )
    self.assertEqual(111, val)
    # Test different raw_values.
    raw_value_tests = (
        (111, '*****@*****.**'),
        (112, 112),
        (framework_constants.NO_USER_NAME, framework_constants.NO_USER_NAME))
    for (raw_value, expected_output) in raw_value_tests:
      val = tracker_bizobj.GetFieldValueWithRawValue(
          field_type=tracker_pb2.FieldTypes.USER_TYPE,
          users_by_id=users_by_id,
          field_value=None,
          raw_value=raw_value,
      )
      self.assertEqual(expected_output, val)

    # Test enum types.
    # The returned value should be the raw_value regardless of field_value being
    # specified.
    for field_value in (MockFieldValue(), None):
      val = tracker_bizobj.GetFieldValueWithRawValue(
          field_type=tracker_pb2.FieldTypes.ENUM_TYPE,
          users_by_id=users_by_id,
          field_value=field_value,
          raw_value='abc',
      )
      self.assertEqual('abc', val)

    # Test int type.
    # Use int_value from the field_value.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.INT_TYPE,
        users_by_id=users_by_id,
        field_value=MockFieldValue(int_value=100),
        raw_value=101,
    )
    self.assertEqual(100, val)
    # Use the raw_value when field_value is not specified.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.INT_TYPE,
        users_by_id=users_by_id,
        field_value=None,
        raw_value=101,
    )
    self.assertEqual(101, val)

    # Test str type.
    # Use str_value from the field_value.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.STR_TYPE,
        users_by_id=users_by_id,
        field_value=MockFieldValue(str_value='testing'),
        raw_value='test',
    )
    self.assertEqual('testing', val)
    # Use the raw_value when field_value is not specified.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.STR_TYPE,
        users_by_id=users_by_id,
        field_value=None,
        raw_value='test',
    )
    self.assertEqual('test', val)

    # Test date type.
    # Use date_value from the field_value.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.DATE_TYPE,
        users_by_id=users_by_id,
        field_value=MockFieldValue(date_value=1234567890),
        raw_value=2345678901,
    )
    self.assertEqual('2009-02-13', val)
    # Use the raw_value when field_value is not specified.
    val = tracker_bizobj.GetFieldValueWithRawValue(
        field_type=tracker_pb2.FieldTypes.DATE_TYPE,
        users_by_id=users_by_id,
        field_value=None,
        raw_value='2016-10-30',
    )
    self.assertEqual('2016-10-30', val)