コード例 #1
0
    def testHandleRequest_IssueHasTwoArriveDates(self):
        _request, mr = testing_helpers.GetRequestObjects(
            path=urls.ISSUE_DATE_ACTION_TASK + '.do?issue_id=78901')

        now = int(time.time())
        date_str = timestr.TimestampToDateWidgetStr(now)
        issue = fake.MakeTestIssue(789,
                                   1,
                                   'summary',
                                   'New',
                                   111L,
                                   issue_id=78901)
        self.services.issue.TestAddIssue(issue)
        issue.field_values = [
            tracker_bizobj.MakeFieldValue(123, None, None, None, now, False),
            tracker_bizobj.MakeFieldValue(124, None, None, None, now, False),
            tracker_bizobj.MakeFieldValue(125, None, None, None, now, False),
        ]
        self.assertEqual(
            1, len(self.services.issue.GetCommentsForIssue(mr.cnxn, 78901)))
        self.SetUpEnqueueOutboundEmailTask(1)
        self.mox.ReplayAll()

        self.servlet.HandleRequest(mr)
        self.mox.VerifyAll()
        comments = self.services.issue.GetCommentsForIssue(mr.cnxn, 78901)
        self.assertEqual(2, len(comments))
        self.assertEqual(
            'The EoL date has arrived: %s\n'
            'The NextAction date has arrived: %s' % (date_str, date_str),
            comments[1].content)
コード例 #2
0
 def testParseFieldValues_Normal(self):
     fd_int = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                          tracker_pb2.FieldTypes.INT_TYPE,
                                          None, '', False, False, False,
                                          None, None, '', False, '', '',
                                          tracker_pb2.NotifyTriggers.NEVER,
                                          'no_action', 'doc', False)
     fd_date = tracker_bizobj.MakeFieldDef(124, 789, 'Deadline',
                                           tracker_pb2.FieldTypes.DATE_TYPE,
                                           None, '', False, False, False,
                                           None, None, '', False, '', '',
                                           tracker_pb2.NotifyTriggers.NEVER,
                                           'no_action', 'doc', False)
     self.config.field_defs.extend([fd_int, fd_date])
     field_val_strs = {123: ['80386', '68040'], 124: ['2009-02-13']}
     field_values = field_helpers.ParseFieldValues(self.mr.cnxn,
                                                   self.services.user,
                                                   field_val_strs,
                                                   self.config)
     fv1 = tracker_bizobj.MakeFieldValue(123, 80386, None, None, None,
                                         False)
     fv2 = tracker_bizobj.MakeFieldValue(123, 68040, None, None, None,
                                         False)
     fv3 = tracker_bizobj.MakeFieldValue(124, None, None, None, 1234483200,
                                         False)
     self.assertEqual([fv1, fv2, fv3], field_values)
コード例 #3
0
 def testConvertFieldValues_Normal(self):
   """The client wants to edit a custom field."""
   mar = mock.Mock()
   mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
   mar.config.field_defs = [
       tracker_bizobj.MakeFieldDef(
           1, 789, 'Priority', tracker_pb2.FieldTypes.ENUM_TYPE, None, None,
           False, False, False, None, None, None, False, None, None, None,
           None, 'doc', False),
       tracker_bizobj.MakeFieldDef(
           2, 789, 'EstDays', tracker_pb2.FieldTypes.INT_TYPE, None, None,
           False, False, False, 0, 99, None, False, None, None, None,
           None, 'doc', False),
       tracker_bizobj.MakeFieldDef(
           3, 789, 'Nickname', tracker_pb2.FieldTypes.STR_TYPE, None, None,
           False, False, False, None, None, None, False, None, None, None,
           None, 'doc', False),
       tracker_bizobj.MakeFieldDef(
           4, 789, 'Verifier', tracker_pb2.FieldTypes.USER_TYPE, None, None,
           False, False, False, None, None, None, False, None, None, None,
           None, 'doc', False),
       tracker_bizobj.MakeFieldDef(
           5, 789, 'Deadline', tracker_pb2.FieldTypes.DATE_TYPE, None, None,
           False, False, False, None, None, None, False, None, None, None,
           None, 'doc', False),
       tracker_bizobj.MakeFieldDef(
           6, 789, 'Homepage', tracker_pb2.FieldTypes.URL_TYPE, None, None,
           False, False, False, None, None, None, False, None, None, None,
           None, 'doc', False),
       ]
   field_values = [
       api_pb2_v1.FieldValue(fieldName='Priority', fieldValue='High'),
       api_pb2_v1.FieldValue(fieldName='EstDays', fieldValue='4'),
       api_pb2_v1.FieldValue(fieldName='Nickname', fieldValue='Scout'),
       api_pb2_v1.FieldValue(
           fieldName='Verifier', fieldValue='*****@*****.**'),
       api_pb2_v1.FieldValue(fieldName='Deadline', fieldValue='2017-12-06'),
       api_pb2_v1.FieldValue(
           fieldName='Homepage', fieldValue='http://example.com'),
       ]
   actual = api_pb2_v1_helpers.convert_field_values(
       field_values, mar, self.services)
   (fv_list_add, fv_list_remove, fv_list_clear,
    label_list_add, label_list_remove) = actual
   self.assertEquals(
     [tracker_bizobj.MakeFieldValue(2, 4, None, None, None, None, False),
      tracker_bizobj.MakeFieldValue(3, None, 'Scout', None, None, None, False),
      tracker_bizobj.MakeFieldValue(4, None, None, 111, None, None, False),
      tracker_bizobj.MakeFieldValue(
          5, None, None, None, 1512518400, None, False),
      tracker_bizobj.MakeFieldValue(
          6, None, None, None, None, 'http://example.com', False),
      ],
     fv_list_add)
   self.assertEquals([], fv_list_remove)
   self.assertEquals([], fv_list_clear)
   self.assertEquals(['Priority-High'], label_list_add)
   self.assertEquals([], label_list_remove)
コード例 #4
0
 def SetUpFieldValues(self, issue, now):
     issue.field_values = [
         tracker_bizobj.MakeFieldValue(123, None, None, None, now, None,
                                       False),
         tracker_bizobj.MakeFieldValue(124, None, None, None, now, None,
                                       False),
         tracker_bizobj.MakeFieldValue(125, None, None, None, now, None,
                                       False),
     ]
コード例 #5
0
  def testMergeFields_MultiValued(self):
    fd = tracker_pb2.FieldDef(
        field_id=1, field_name='foo', is_multivalued=True)
    fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False)
    fv2 = tracker_bizobj.MakeFieldValue(1, 43, None, None, None, False)
    fv3 = tracker_bizobj.MakeFieldValue(1, 44, None, None, None, False)
    fv4 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False)
    fv5 = tracker_bizobj.MakeFieldValue(1, 99, None, None, None, False)

    merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields(
        [fv1, fv2], [fv2, fv3], [fv4, fv5], [fd])
    self.assertEqual([fv2, fv3], merged_fvs)
    self.assertEqual([fv3], fvs_added)
    self.assertEqual([fv4], fvs_removed)
コード例 #6
0
    def testValidateCustomFields_NoErrors(self):
        fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                         tracker_pb2.FieldTypes.INT_TYPE, None,
                                         '', False, False, False, None, None,
                                         '', False, '', '',
                                         tracker_pb2.NotifyTriggers.NEVER,
                                         'no_action', 'doc', False)
        self.config.field_defs.append(fd)
        fv1 = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False)
        fv2 = tracker_bizobj.MakeFieldValue(123, 486, None, None, None, False)

        field_helpers.ValidateCustomFields(self.mr, self.services, [fv1, fv2],
                                           self.config, self.errors)
        self.assertFalse(self.errors.AnyErrors())
コード例 #7
0
def ConvertMLabels(labels, phases, m_target_id, m_approved_id, labels_re,
                   phase_map):
    field_values = []
    for label in labels:
        match = re.match(labels_re, label)
        if match:
            milestone = match.group('m')
            m_type = match.group('type')
            channel = match.group('channel')
            for phase in phases:
                # We know get(phase) will return something because
                # we're checking before ConvertMLabels, that all phases
                # exist in BROWSER_PHASE_MAP or OS_PHASE_MAP
                if phase_map.get(phase.name.lower()) == channel.lower():
                    field_id = m_target_id if (m_type.lower()
                                               == 'target') else m_approved_id
                    field_values.append(
                        tracker_bizobj.MakeFieldValue(field_id,
                                                      int(milestone),
                                                      None,
                                                      None,
                                                      None,
                                                      None,
                                                      False,
                                                      phase_id=phase.phase_id))
                    break  # exit phase loop if match is found.
    return field_values
コード例 #8
0
    def test_UrlType(self):
        fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                         tracker_pb2.FieldTypes.URL_TYPE, None,
                                         '', False, False, False, None, None,
                                         '', False, '', '',
                                         tracker_pb2.NotifyTriggers.NEVER,
                                         'no_action', 'doc', False)

        fv = tracker_bizobj.MakeFieldValue(123, None, None, None, None,
                                           'www.google.com', False)
        msg = field_helpers.ValidateCustomField(self.mr, self.mr.project,
                                                self.services, fd, fv)
        self.assertIsNone(msg)

        fv.url_value = 'go/puppies'
        msg = field_helpers.ValidateCustomField(self.mr, self.mr.project,
                                                self.services, fd, fv)
        self.assertIsNone(msg)

        fv.url_value = 'go/213'
        msg = field_helpers.ValidateCustomField(self.mr, self.mr.project,
                                                self.services, fd, fv)
        self.assertIsNone(msg)

        fv.url_value = 'puppies'
        msg = field_helpers.ValidateCustomField(self.mr, self.mr.project,
                                                self.services, fd, fv)
        self.assertEqual('Value must be a valid url', msg)
コード例 #9
0
 def testMergeFields_NoChange(self):
   fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False)
   merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields(
       [fv1], [], [], [])
   self.assertEqual([fv1], merged_fvs)
   self.assertEqual([], fvs_added)
   self.assertEqual([], fvs_removed)
コード例 #10
0
    def testIndexOrLexicalList_CustomFields(self):
        art = fake.MakeTestIssue(789, 1, 'sum 2', 'New', 111)
        art.labels = ['samename-value1']
        art.field_values = [
            tracker_bizobj.MakeFieldValue(3, 6078, None, None, None, None,
                                          False)
        ]

        all_field_defs = [
            tracker_bizobj.MakeFieldDef(3, 789, 'samename',
                                        tracker_pb2.FieldTypes.INT_TYPE, None,
                                        None, False, False, False, None, None,
                                        None, False, None, None, None, None,
                                        'cow spots', False),
            tracker_bizobj.MakeFieldDef(4, 788, 'samename',
                                        tracker_pb2.FieldTypes.APPROVAL_TYPE,
                                        None, None, False, False, False, None,
                                        None, None, False, None, None, None,
                                        None, 'cow spots', False),
            tracker_bizobj.MakeFieldDef(4, 788, 'notsamename',
                                        tracker_pb2.FieldTypes.APPROVAL_TYPE,
                                        None, None, False, False, False, None,
                                        None, None, False, None, None, None,
                                        None, 'should get filtered out', False)
        ]

        accessor = sorting._IndexOrLexicalList([], all_field_defs, 'samename',
                                               {})
        self.assertEqual([6078, 'value1'], accessor(art))
        neg_accessor = MakeDescending(accessor)
        self.assertEqual([sorting.DescendingValue('value1'), -6078],
                         neg_accessor(art))
コード例 #11
0
 def testPrecomputeInfoForValueViews_SomeValues(self):
     """We can precompute info needed for an issue with fields and labels."""
     labels = [
         'Priority-Low', 'GoodFirstBug', 'Feature-UI', 'Feature-Installer',
         'Launch-Milestone-66'
     ]
     derived_labels = ['OS-Windows', 'OS-Linux']
     field_values = [
         tracker_bizobj.MakeFieldValue(1, 5, None, None, None, None, False),
     ]
     phase_1 = tracker_pb2.Phase(phase_id=1, name='Stable')
     phase_2 = tracker_pb2.Phase(phase_id=2, name='Beta')
     phase_3 = tracker_pb2.Phase(phase_id=3, name='stable')
     precomp_view_info = tracker_views._PrecomputeInfoForValueViews(
         labels,
         derived_labels,
         field_values,
         self.config,
         phases=[phase_1, phase_2, phase_3])
     (labels_by_prefix, der_labels_by_prefix, field_values_by_id,
      _label_docs, phases_by_name) = precomp_view_info
     self.assertEqual(
         {
             'priority': ['Low'],
             'feature': ['UI', 'Installer'],
             'launch-milestone': ['66']
         }, labels_by_prefix)
     self.assertEqual({'os': ['Windows', 'Linux']}, der_labels_by_prefix)
     self.assertEqual({1: field_values}, field_values_by_id)
     self.assertEqual({
         'stable': [phase_1, phase_3],
         'beta': [phase_2]
     }, phases_by_name)
コード例 #12
0
  def setUp(self):
    self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
    self.config.field_defs = [
        tracker_bizobj.MakeFieldDef(
            1, 789, 'Goats', tracker_pb2.FieldTypes.INT_TYPE, None, None,
            False, False, False, None, None, None, False, None, None, None,
            None, 'Num of Goats in the season', False, is_phase_field=True),
        tracker_bizobj.MakeFieldDef(
            2, 789, 'DogNames', tracker_pb2.FieldTypes.STR_TYPE, None, None,
            False, False, False, None, None, None, False, None, None, None,
            None, 'good dog names', False),
        tracker_bizobj.MakeFieldDef(
            3, 789, 'Approval', tracker_pb2.FieldTypes.APPROVAL_TYPE,
            None, None, False, False, False, None, None, None, False, None,
            None, None, None, 'Tracks review from cows', False)
    ]
    self.config.approval_defs = [tracker_pb2.ApprovalDef(approval_id=3)]
    self.issue = MakeTestIssue(
        local_id=1, issue_id=100001, summary='One')
    self.issue.field_values = [
        tracker_bizobj.MakeFieldValue(
            1, 34, None, None, None, None, False, phase_id=23),
        tracker_bizobj.MakeFieldValue(
            1, 35, None, None, None, None, False, phase_id=24),
        tracker_bizobj.MakeFieldValue(
            2, None, 'Waffles', None, None, None, False),
    ]
    self.issue.phases = [
        tracker_pb2.Phase(phase_id=23, name='winter'),
        tracker_pb2.Phase(phase_id=24, name='summer')]
    self.issue.approval_values = [
        tracker_pb2.ApprovalValue(
            approval_id=3, approver_ids=[111, 222, 333])]
    self.users_by_id = {
        111: framework_views.StuffUserView(111, '*****@*****.**', False),
        222: framework_views.StuffUserView(222, '*****@*****.**', True),
    }

    self.summary_table_cell_kws = {
        'col': None,
        'users_by_id': {},
        'non_col_labels': [('lab', False)],
        'label_values': {},
        'related_issues': {},
        'config': 'fake_config',
        }
コード例 #13
0
ファイル: field_helpers.py プロジェクト: xinghun61/infra
def ParseOneFieldValue(cnxn, user_service, fd, val_str):
  """Make one FieldValue PB from the given user-supplied string."""
  if fd.field_type == tracker_pb2.FieldTypes.INT_TYPE:
    try:
      return tracker_bizobj.MakeFieldValue(
          fd.field_id, int(val_str), None, None, None, None, False)
    except ValueError:
      return None  # TODO(jrobbins): should bounce

  elif fd.field_type == tracker_pb2.FieldTypes.STR_TYPE:
    return tracker_bizobj.MakeFieldValue(
        fd.field_id, None, val_str, None, None, None, False)

  elif fd.field_type == tracker_pb2.FieldTypes.USER_TYPE:
    if val_str:
      try:
        user_id = user_service.LookupUserID(cnxn, val_str, autocreate=False)
      except exceptions.NoSuchUserException:
        # Set to invalid user ID to display error during the validation step.
        user_id = INVALID_USER_ID
      return tracker_bizobj.MakeFieldValue(
          fd.field_id, None, None, user_id, None, None, False)
    else:
      return None

  elif fd.field_type == tracker_pb2.FieldTypes.DATE_TYPE:
    try:
      timestamp = timestr.DateWidgetStrToTimestamp(val_str)
      return tracker_bizobj.MakeFieldValue(
          fd.field_id, None, None, None, timestamp, None, False)
    except ValueError:
      return None  # TODO(jrobbins): should bounce

  elif fd.field_type == tracker_pb2.FieldTypes.URL_TYPE:
    val_str = FormatUrlFieldValue(val_str)
    try:
      return tracker_bizobj.MakeFieldValue(
          fd.field_id, None, None, None, None, val_str, False)
    except ValueError:
      return None # TODO(jojwang): should bounce

  else:
    logging.error('Cant parse field with unexpected type %r', fd.field_type)
    return None
コード例 #14
0
  def testMergeFields_SingleValued(self):
    fd = tracker_pb2.FieldDef(field_id=1, field_name='foo')
    fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False)
    fv2 = tracker_bizobj.MakeFieldValue(1, 43, None, None, None, False)
    fv3 = tracker_bizobj.MakeFieldValue(1, 44, None, None, None, False)

    # Adding one replaces all values since the field is single-valued.
    merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields(
        [fv1, fv2], [fv3], [], [fd])
    self.assertEqual([fv3], merged_fvs)
    self.assertEqual([fv3], fvs_added)
    self.assertEqual([], fvs_removed)

    # Removing one just removes it, does not reset.
    merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields(
        [fv1, fv2], [], [fv2], [fd])
    self.assertEqual([fv1], merged_fvs)
    self.assertEqual([], fvs_added)
    self.assertEqual([fv2], fvs_removed)
コード例 #15
0
    def testValidateCustomFields_SomeErrors(self):
        fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                         tracker_pb2.FieldTypes.INT_TYPE, None,
                                         '', False, False, False, None, None,
                                         '', False, '', '',
                                         tracker_pb2.NotifyTriggers.NEVER,
                                         'no_action', 'doc', False)
        self.config.field_defs.append(fd)
        fv1 = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False)
        fv2 = tracker_bizobj.MakeFieldValue(123, 486, None, None, None, False)

        fd.min_value = 1
        fd.max_value = 999
        field_helpers.ValidateCustomFields(self.mr, self.services, [fv1, fv2],
                                           self.config, self.errors)
        self.assertTrue(self.errors.AnyErrors())
        self.assertEqual(1, len(self.errors.custom_fields))
        custom_field_error = self.errors.custom_fields[0]
        self.assertEqual(123, custom_field_error.field_id)
        self.assertEqual('Value must be <= 999', custom_field_error.message)
コード例 #16
0
 def testConvertFieldValues_ClearAndRemove(self):
     """The client wants to clear and remove some custom fields."""
     mar = mock.Mock()
     mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
     mar.config.field_defs = [
         tracker_bizobj.MakeFieldDef(1, 789, 'Priority',
                                     tracker_pb2.FieldTypes.ENUM_TYPE, None,
                                     None, False, False, False, None, None,
                                     None, False, None, None, None, None,
                                     'doc', False),
         tracker_bizobj.MakeFieldDef(11, 789, 'OS',
                                     tracker_pb2.FieldTypes.ENUM_TYPE, None,
                                     None, False, False, False, None, None,
                                     None, False, None, None, None, None,
                                     'doc', False),
         tracker_bizobj.MakeFieldDef(2, 789, 'EstDays',
                                     tracker_pb2.FieldTypes.INT_TYPE, None,
                                     None, False, False, False, 0, 99, None,
                                     False, None, None, None, None, 'doc',
                                     False),
         tracker_bizobj.MakeFieldDef(3, 789, 'Nickname',
                                     tracker_pb2.FieldTypes.STR_TYPE, None,
                                     None, False, False, False, None, None,
                                     None, False, None, None, None, None,
                                     'doc', False),
     ]
     field_values = [
         api_pb2_v1.FieldValue(
             fieldName='Priority',
             fieldValue='High',
             operator=api_pb2_v1.FieldValueOperator.remove),
         api_pb2_v1.FieldValue(
             fieldName='OS', operator=api_pb2_v1.FieldValueOperator.clear),
         api_pb2_v1.FieldValue(
             fieldName='EstDays',
             operator=api_pb2_v1.FieldValueOperator.clear),
         api_pb2_v1.FieldValue(
             fieldName='Nickname',
             fieldValue='Scout',
             operator=api_pb2_v1.FieldValueOperator.remove),
     ]
     actual = api_pb2_v1_helpers.convert_field_values(
         field_values, mar, self.services)
     (fv_list_add, fv_list_remove, fv_list_clear, label_list_add,
      label_list_remove) = actual
     self.assertEquals([], fv_list_add)
     self.assertEquals([
         tracker_bizobj.MakeFieldValue(3, None, 'Scout', None, None, None,
                                       False)
     ], fv_list_remove)
     self.assertEquals([11, 2], fv_list_clear)
     self.assertEquals([], label_list_add)
     self.assertEquals(['Priority-High'], label_list_remove)
コード例 #17
0
  def testMakeFieldValue(self):
    # Only the first value counts.
    fv = tracker_bizobj.MakeFieldValue(1, 42, 'yay', 111L, None, True)
    self.assertEqual(1, fv.field_id)
    self.assertEqual(42, fv.int_value)
    self.assertIsNone(fv.str_value)
    self.assertEqual(None, fv.user_id)

    fv = tracker_bizobj.MakeFieldValue(1, None, 'yay', 111L, None, True)
    self.assertEqual('yay', fv.str_value)
    self.assertEqual(None, fv.user_id)

    fv = tracker_bizobj.MakeFieldValue(1, None, None, 111L, None, True)
    self.assertEqual(111L, fv.user_id)
    self.assertEqual(True, fv.derived)

    fv = tracker_bizobj.MakeFieldValue(1, None, None, None, 1234567890, True)
    self.assertEqual(1234567890, fv.date_value)
    self.assertEqual(True, fv.derived)

    with self.assertRaises(ValueError):
      tracker_bizobj.MakeFieldValue(1, None, None, None, None, True)
コード例 #18
0
 def testValidateOneCustomField_OtherType(self):
     # There are currently no validation options for date-type custom fields.
     fd = tracker_bizobj.MakeFieldDef(123, 789, 'Deadline',
                                      tracker_pb2.FieldTypes.DATE_TYPE,
                                      None, '', False, False, False, None,
                                      None, '', False, '', '',
                                      tracker_pb2.NotifyTriggers.NEVER,
                                      'no_action', 'doc', False)
     fv = tracker_bizobj.MakeFieldValue(123, None, None, None, 1234567890,
                                        False)
     msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                 fv)
     self.assertIsNone(msg)
コード例 #19
0
    def testCreateIssueSearchDocuments_CustomFields(self):
        self.SetUpCreateIssueSearchDocuments()
        self.mox.ReplayAll()
        config = tracker_bizobj.MakeDefaultProjectIssueConfig(123)
        config_dict = {123: tracker_bizobj.MakeDefaultProjectIssueConfig(123)}
        int_field = tracker_bizobj.MakeFieldDef(
            1, 123, 'CustomInt', tracker_pb2.FieldTypes.INT_TYPE, None, False,
            False, False, None, None, None, None, False, None, None, None,
            'no_action', 'A custom int field', False)
        int_field_value = tracker_bizobj.MakeFieldValue(
            1, 42, None, None, False, None, None)
        str_field = tracker_bizobj.MakeFieldDef(
            2, 123, 'CustomStr', tracker_pb2.FieldTypes.STR_TYPE, None, False,
            False, False, None, None, None, None, False, None, None, None,
            'no_action', 'A custom string field', False)
        str_field_value = tracker_bizobj.MakeFieldValue(
            2, None, u'\xf0\x9f\x92\x96\xef\xb8\x8f', None, None, None, False)
        # TODO(jrobbins): user-type field 3
        date_field = tracker_bizobj.MakeFieldDef(
            4, 123, 'CustomDate', tracker_pb2.FieldTypes.DATE_TYPE, None,
            False, False, False, None, None, None, None, False, None, None,
            None, 'no_action', 'A custom date field', False)
        date_field_value = tracker_bizobj.MakeFieldValue(
            4, None, None, None, 1234567890, None, False)
        config.field_defs.extend([int_field, str_field, date_field])
        self.issue.field_values.extend(
            [int_field_value, str_field_value, date_field_value])

        tracker_fulltext._CreateIssueSearchDocuments(
            [self.issue], {self.issue.issue_id: [self.comment]},
            self.users_by_id, config_dict)
        self.mox.VerifyAll()
        self.assertEqual(1, len(self.docs))
        issue_doc = self.docs[0]
        metadata = issue_doc.fields[2]
        self.assertEqual(
            u'New [email protected] []  42 \xf0\x9f\x92\x96\xef\xb8\x8f 2009-02-13 ',
            metadata.value)
コード例 #20
0
    def testMakeEmailTasks(self):
        issue = fake.MakeTestIssue(789,
                                   1,
                                   'summary',
                                   'New',
                                   self.owner.user_id,
                                   issue_id=78901)
        self.services.issue.TestAddIssue(issue)
        now = int(time.time())
        issue.field_values = [
            tracker_bizobj.MakeFieldValue(123, None, None, None, now, False),
            tracker_bizobj.MakeFieldValue(124, None, None, None, now, False),
            tracker_bizobj.MakeFieldValue(125, None, None, None, now, False),
        ]
        issue.project_name = 'proj'
        comment = tracker_pb2.IssueComment()
        comment.project_id = self.project.project_id
        comment.user_id = self.date_action_user.user_id
        comment.content = 'Some date(s) arrived...'
        next_action_field_def = self.config.field_defs[0]
        pings = [(next_action_field_def, now)]
        users_by_id = framework_views.MakeAllUserViews(
            'fake cnxn', self.services.user,
            [self.owner.user_id, self.date_action_user.user_id])

        tasks = self.servlet._MakeEmailTasks('fake cnxn', issue, self.project,
                                             self.config, comment,
                                             'example-app.appspot.com',
                                             users_by_id, pings)
        self.assertEqual(1, len(tasks))
        notify_owner_task = tasks[0]
        self.assertEqual('*****@*****.**', notify_owner_task['to'])
        self.assertEqual('Follow up on issue 1 in proj: summary',
                         notify_owner_task['subject'])
        body = notify_owner_task['body']
        self.assertIn(comment.content, body)
        self.assertIn(next_action_field_def.docstring, body)
コード例 #21
0
 def CreateUserFieldValue(self, mr, ldap, field_id):
     if ldap is None:
         return None
     try:
         user_id = self.services.user.LookupUserID(mr.cnxn,
                                                   ldap + '@chromium.org')
     except exceptions.NoSuchUserException:
         try:
             user_id = self.services.user.LookupUserID(
                 mr.cnxn, ldap + '@google.com')
         except exceptions.NoSuchUserException:
             logging.info(
                 'No chromium.org or google.com accound found for %s', ldap)
             return None
     return tracker_bizobj.MakeFieldValue(field_id, None, None, user_id,
                                          None, None, False)
コード例 #22
0
    def testValidateOneCustomField_IntType(self):
        fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                         tracker_pb2.FieldTypes.INT_TYPE, None,
                                         '', False, False, False, None, None,
                                         '', False, '', '',
                                         tracker_pb2.NotifyTriggers.NEVER,
                                         'no_action', 'doc', False)
        fv = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False)
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertIsNone(msg)

        fd.min_value = 1
        fd.max_value = 999
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertEqual('Value must be <= 999', msg)

        fv.int_value = 0
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertEqual('Value must be >= 1', msg)
コード例 #23
0
    def testValidateOneCustomField_StrType(self):
        fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU',
                                         tracker_pb2.FieldTypes.STR_TYPE, None,
                                         '', False, False, False, None, None,
                                         '', False, '', '',
                                         tracker_pb2.NotifyTriggers.NEVER,
                                         'no_action', 'doc', False)
        fv = tracker_bizobj.MakeFieldValue(123, None, 'i386', None, None,
                                           False)
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertIsNone(msg)

        fd.regex = r'^\d*$'
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertEqual(r'Value must match regular expression: ^\d*$', msg)

        fv.str_value = '386'
        msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd,
                                                    fv)
        self.assertIsNone(msg)
コード例 #24
0
  def testConvertIssue(self):
    """Convert an internal Issue PB to an IssueWrapper API PB."""
    self.services.project.TestAddProject(
        'test-project', owner_ids=[2], project_id=12345)
    self.services.user.TestAddUser('*****@*****.**', 111)

    mar = mock.Mock()
    mar.cnxn = None
    mar.project_name = 'test-project'
    mar.project_id = 12345
    mar.auth.effective_ids = {111}
    mar.perms = permissions.READ_ONLY_PERMISSIONSET
    mar.profiler = profiler.Profiler()
    mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(12345)
    mar.config.field_defs = [
        tracker_bizobj.MakeFieldDef(
            1, 12345, 'EstDays', tracker_pb2.FieldTypes.INT_TYPE, None, None,
            False, False, False, None, None, None, False, None, None, None,
            None, 'doc', False, approval_id=2),
        tracker_bizobj.MakeFieldDef(
            2, 12345, 'DesignReview', tracker_pb2.FieldTypes.APPROVAL_TYPE,
            None, None, False, False, False, None, None, None, False, None,
            None, None, None, 'doc', False),
        tracker_bizobj.MakeFieldDef(
            3, 12345, 'StringField', tracker_pb2.FieldTypes.STR_TYPE, None,
            None, False, False, False, None, None, None, False, None, None,
            None, None, 'doc', False),
        tracker_bizobj.MakeFieldDef(
            4, 12345, 'DressReview', tracker_pb2.FieldTypes.APPROVAL_TYPE,
            None, None, False, False, False, None, None, None, False, None,
            None, None, None, 'doc', False),
        ]
    self.services.config.StoreConfig(mar.cnxn, mar.config)

    now = 1472067725
    now_dt = datetime.datetime.fromtimestamp(now)

    fvs = [
      tracker_bizobj.MakeFieldValue(
          1, 4, None, None, None, None, False, phase_id=4),
      tracker_bizobj.MakeFieldValue(
          3, None, 'string', None, None, None, False, phase_id=4),
      # missing phase
      tracker_bizobj.MakeFieldValue(
          3, None, u'\xe2\x9d\xa4\xef\xb8\x8f', None, None, None, False,
          phase_id=2),
    ]
    phases = [
        tracker_pb2.Phase(phase_id=3, name="JustAPhase", rank=4),
        tracker_pb2.Phase(phase_id=4, name="NotAPhase", rank=9)
        ]
    approval_values = [
        tracker_pb2.ApprovalValue(
            approval_id=2, phase_id=3, approver_ids=[111]),
        tracker_pb2.ApprovalValue(approval_id=4, approver_ids=[111])
    ]
    issue = fake.MakeTestIssue(
        12345, 1, 'one', 'New', 111, field_values=fvs,
        approval_values=approval_values, phases=phases)
    issue.opened_timestamp = now
    issue.owner_modified_timestamp = now
    issue.status_modified_timestamp = now
    issue.component_modified_timestamp = now
    # TODO(jrobbins): set up a lot more fields.

    for cls in [api_pb2_v1.IssueWrapper, api_pb2_v1.IssuesGetInsertResponse]:
      result = api_pb2_v1_helpers.convert_issue(cls, issue, mar, self.services)
      self.assertEquals(1, result.id)
      self.assertEquals('one', result.title)
      self.assertEquals('one', result.summary)
      self.assertEquals(now_dt, result.published)
      self.assertEquals(now_dt, result.owner_modified)
      self.assertEquals(now_dt, result.status_modified)
      self.assertEquals(now_dt, result.component_modified)
      self.assertEquals(
          result.fieldValues,
          [api_pb2_v1.FieldValue(
              fieldName='EstDays', fieldValue='4', approvalName='DesignReview',
              derived=False),
           api_pb2_v1.FieldValue(fieldName='StringField', fieldValue='string',
                                 phaseName="NotAPhase", derived=False),
           api_pb2_v1.FieldValue(fieldName='StringField',
                                 fieldValue=u'\xe2\x9d\xa4\xef\xb8\x8f',
                                 derived=False),
          ]
      )
      self.assertEqual(
          result.approvalValues,
          [api_pb2_v1.Approval(
            approvalName="DesignReview",
            approvers=[self.person_1],
            status=api_pb2_v1.ApprovalStatus.notSet,
            phaseName="JustAPhase",
          ),
           api_pb2_v1.Approval(
               approvalName="DressReview",
               approvers=[self.person_1],
               status=api_pb2_v1.ApprovalStatus.notSet,
           )]
      )
      self.assertEqual(
          result.phases,
          [api_pb2_v1.Phase(phaseName="JustAPhase", rank=4),
           api_pb2_v1.Phase(phaseName="NotAPhase", rank=9)
          ])
コード例 #25
0
    def testFetchItems_Normal(self):
        template_9_row = (9, 1, 'template-9', 'content', 'summary', False, 111,
                          'status', False, False, False)
        template_8_row = (8, 1, 'template-8', 'content', 'summary', False, 111,
                          'status', False, False, False)
        template_7_row = (7, 2, 'template-7', 'content', 'summary', False, 111,
                          'status', False, False, False)

        self.template_def_2lc.template_service.template_tbl.Select\
            .return_value = [template_7_row, template_8_row,
                template_9_row]
        self.template_def_2lc.template_service.template2label_tbl.Select\
            .return_value = [(9, 'label-1'), (7, 'label-2')]
        self.template_def_2lc.template_service.template2component_tbl.Select\
            .return_value = [(9, 13), (7, 14)]
        self.template_def_2lc.template_service.template2admin_tbl.Select\
            .return_value = [(9, 111), (7, 222)]

        fv1_row = (15, None, 'fv-1', None, None, None, False)
        fv2_row = (16, None, 'fv-2', None, None, None, False)
        fv1 = tracker_bizobj.MakeFieldValue(*fv1_row)
        fv2 = tracker_bizobj.MakeFieldValue(*fv2_row)
        self.template_def_2lc.template_service.template2fieldvalue_tbl.Select\
            .return_value = [((9,) + fv1_row[:-1]), ((7,) + fv2_row[:-1])]

        av1_row = (17, 9, 19, 'na')
        av2_row = (18, 7, 20, 'not_set')
        av1 = tracker_pb2.ApprovalValue(
            approval_id=17,
            phase_id=19,
            status=tracker_pb2.ApprovalStatus('NA'))
        av2 = tracker_pb2.ApprovalValue(
            approval_id=18,
            phase_id=20,
            status=tracker_pb2.ApprovalStatus('NOT_SET'))
        phase1_row = (19, 'phase-1', 1)
        phase2_row = (20, 'phase-2', 2)
        phase1 = tracker_pb2.Phase(phase_id=19, name='phase-1', rank=1)
        phase2 = tracker_pb2.Phase(phase_id=20, name='phase-2', rank=2)

        self.template_def_2lc.template_service.template2approvalvalue_tbl.Select\
            .return_value = [av1_row, av2_row]
        self.template_def_2lc.template_service.issuephasedef_tbl.Select\
            .return_value = [phase1_row, phase2_row]

        actual = self.template_def_2lc.FetchItems(cnxn=None, keys=[7, 8, 9])
        self.assertEqual(3, len(list(actual.keys())))
        self.assertTrue(isinstance(actual[7], tracker_pb2.TemplateDef))
        self.assertTrue(isinstance(actual[8], tracker_pb2.TemplateDef))
        self.assertTrue(isinstance(actual[9], tracker_pb2.TemplateDef))

        self.assertEqual(7, actual[7].template_id)
        self.assertEqual(8, actual[8].template_id)
        self.assertEqual(9, actual[9].template_id)

        self.assertEqual(['label-2'], actual[7].labels)
        self.assertEqual([], actual[8].labels)
        self.assertEqual(['label-1'], actual[9].labels)

        self.assertEqual([14], actual[7].component_ids)
        self.assertEqual([], actual[8].component_ids)
        self.assertEqual([13], actual[9].component_ids)

        self.assertEqual([222], actual[7].admin_ids)
        self.assertEqual([], actual[8].admin_ids)
        self.assertEqual([111], actual[9].admin_ids)

        self.assertEqual([fv2], actual[7].field_values)
        self.assertEqual([], actual[8].field_values)
        self.assertEqual([fv1], actual[9].field_values)

        self.assertEqual([phase2], actual[7].phases)
        self.assertEqual([], actual[8].phases)
        self.assertEqual([phase1], actual[9].phases)

        self.assertEqual([av2], actual[7].approval_values)
        self.assertEqual([], actual[8].approval_values)
        self.assertEqual([av1], actual[9].approval_values)
コード例 #26
0
 def testMakeAllFieldValueViews(self):
     labels = [
         'Priority-Low', 'GoodFirstBug', 'Feature-UI', 'Feature-Installer',
         'Launch-Milestone-66'
     ]
     derived_labels = ['OS-Windows', 'OS-Linux']
     self.config.field_defs.append(
         tracker_bizobj.MakeFieldDef(4,
                                     789,
                                     'UIMocks',
                                     tracker_pb2.FieldTypes.URL_TYPE,
                                     'Enhancement',
                                     None,
                                     False,
                                     False,
                                     False,
                                     None,
                                     None,
                                     None,
                                     False,
                                     None,
                                     None,
                                     None,
                                     'no_action',
                                     'descriptive docstring',
                                     False,
                                     approval_id=23,
                                     is_phase_field=False))
     self.config.field_defs.append(
         tracker_bizobj.MakeFieldDef(5,
                                     789,
                                     'LegalFAQs',
                                     tracker_pb2.FieldTypes.URL_TYPE,
                                     'Enhancement',
                                     None,
                                     False,
                                     False,
                                     False,
                                     None,
                                     None,
                                     None,
                                     False,
                                     None,
                                     None,
                                     None,
                                     'no_action',
                                     'descriptive docstring',
                                     False,
                                     approval_id=26,
                                     is_phase_field=False))
     self.config.field_defs.append(
         tracker_bizobj.MakeFieldDef(23,
                                     789,
                                     'Legal',
                                     tracker_pb2.FieldTypes.APPROVAL_TYPE,
                                     'Enhancement',
                                     None,
                                     False,
                                     False,
                                     False,
                                     None,
                                     None,
                                     None,
                                     False,
                                     None,
                                     None,
                                     None,
                                     'no_action',
                                     'descriptive docstring',
                                     False,
                                     approval_id=None,
                                     is_phase_field=False))
     self.config.field_defs.append(
         tracker_bizobj.MakeFieldDef(26,
                                     789,
                                     'UI',
                                     tracker_pb2.FieldTypes.APPROVAL_TYPE,
                                     'Enhancement',
                                     None,
                                     False,
                                     False,
                                     False,
                                     None,
                                     None,
                                     None,
                                     False,
                                     None,
                                     None,
                                     None,
                                     'no_action',
                                     'descriptive docstring',
                                     False,
                                     approval_id=None,
                                     is_phase_field=False))
     self.config.field_defs.append(
         tracker_bizobj.MakeFieldDef(27,
                                     789,
                                     'M-Target',
                                     tracker_pb2.FieldTypes.INT_TYPE,
                                     'Enhancement',
                                     None,
                                     False,
                                     False,
                                     False,
                                     None,
                                     None,
                                     None,
                                     False,
                                     None,
                                     None,
                                     None,
                                     'no_action',
                                     'descriptive docstring',
                                     False,
                                     approval_id=None,
                                     is_phase_field=True))
     field_values = [
         tracker_bizobj.MakeFieldValue(1, 5, None, None, None, None, False),
         tracker_bizobj.MakeFieldValue(27,
                                       74,
                                       None,
                                       None,
                                       None,
                                       None,
                                       False,
                                       phase_id=3),
         # phase_id=4 does not belong to any of the phases given below.
         # this field value should not show up in the views.
         tracker_bizobj.MakeFieldValue(27,
                                       79,
                                       None,
                                       None,
                                       None,
                                       None,
                                       False,
                                       phase_id=4),
     ]
     users_by_id = {}
     phase_1 = tracker_pb2.Phase(phase_id=1, name='Stable')
     phase_2 = tracker_pb2.Phase(phase_id=2, name='Beta')
     phase_3 = tracker_pb2.Phase(phase_id=3, name='stable')
     fvvs = tracker_views.MakeAllFieldValueViews(
         self.config,
         labels,
         derived_labels,
         field_values,
         users_by_id,
         parent_approval_ids=[23],
         phases=[phase_1, phase_2, phase_3])
     self.assertEqual(9, len(fvvs))
     # Values are sorted by (applicable_type, field_name).
     logging.info([fv.field_name for fv in fvvs])
     (estdays_fvv, launch_milestone_fvv, legal_fvv, legal_faq_fvv,
      beta_mtarget_fvv, stable_mtarget_fvv, os_fvv, ui_fvv,
      ui_mocks_fvv) = fvvs
     self.assertEqual('EstDays', estdays_fvv.field_name)
     self.assertEqual(1, len(estdays_fvv.values))
     self.assertEqual(0, len(estdays_fvv.derived_values))
     self.assertEqual('Launch-Milestone', launch_milestone_fvv.field_name)
     self.assertEqual(1, len(launch_milestone_fvv.values))
     self.assertEqual(0, len(launch_milestone_fvv.derived_values))
     self.assertEqual('OS', os_fvv.field_name)
     self.assertEqual(0, len(os_fvv.values))
     self.assertEqual(2, len(os_fvv.derived_values))
     self.assertEqual(ui_mocks_fvv.field_name, 'UIMocks')
     self.assertEqual(ui_mocks_fvv.phase_name, '')
     self.assertTrue(ui_mocks_fvv.applicable)
     self.assertEqual(legal_faq_fvv.field_name, 'LegalFAQs')
     self.assertFalse(legal_faq_fvv.applicable)
     self.assertFalse(legal_fvv.applicable)
     self.assertFalse(ui_fvv.applicable)
     self.assertEqual('M-Target', stable_mtarget_fvv.field_name)
     self.assertEqual('stable', stable_mtarget_fvv.phase_name)
     self.assertEqual(1, len(stable_mtarget_fvv.values))
     self.assertEqual(74, stable_mtarget_fvv.values[0].val)
     self.assertEqual(0, len(stable_mtarget_fvv.derived_values))
     self.assertEqual('M-Target', beta_mtarget_fvv.field_name)
     self.assertEqual('beta', beta_mtarget_fvv.phase_name)
     self.assertEqual(0, len(beta_mtarget_fvv.values))
     self.assertEqual(0, len(beta_mtarget_fvv.values))
コード例 #27
0
    def testCreateIssueTemplateDef(self):
        fv = tracker_bizobj.MakeFieldValue(1, None, 'somestring', None, None,
                                           None, False)
        av_23 = tracker_pb2.ApprovalValue(
            approval_id=23,
            phase_id=11,
            status=tracker_pb2.ApprovalStatus.NEEDS_REVIEW)
        av_24 = tracker_pb2.ApprovalValue(approval_id=24, phase_id=11)
        approval_values = [av_23, av_24]
        phases = [tracker_pb2.Phase(name='Canary', rank=11, phase_id=11)]

        actual_template_id = self.template_service.CreateIssueTemplateDef(
            self.cnxn,
            789,
            'template',
            'content',
            'summary',
            True,
            'Available',
            True,
            True,
            True,
            owner_id=111,
            labels=['label'],
            component_ids=[3],
            admin_ids=[222],
            field_values=[fv],
            phases=phases,
            approval_values=approval_values)

        self.assertEqual(1, actual_template_id)

        self.template_service.template_tbl.InsertRow\
            .assert_called_once_with(self.cnxn, project_id=789, name='template',
                content='content', summary='summary', summary_must_be_edited=True,
                owner_id=111, status='Available', members_only=True,
                owner_defaults_to_member=True, component_required=True,
                commit=False)
        self.template_service.template2label_tbl.InsertRows\
            .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2LABEL_COLS,
                [(1, 'label')], commit=False)
        self.template_service.template2component_tbl.InsertRows\
            .assert_called_once_with(self.cnxn,
                template_svc.TEMPLATE2COMPONENT_COLS,
                [(1, 3)], commit=False)
        self.template_service.template2admin_tbl.InsertRows\
            .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2ADMIN_COLS,
                [(1, 222)], commit=False)
        self.template_service.template2fieldvalue_tbl.InsertRows\
            .assert_called_once_with(self.cnxn,
                template_svc.TEMPLATE2FIELDVALUE_COLS,
                [(1, 1, None, 'somestring', None, None, None)], commit=False)
        self.template_service.issuephasedef_tbl.InsertRow\
            .assert_called_once_with(self.cnxn, name='Canary',
                rank=11, commit=False)
        self.template_service.template2approvalvalue_tbl.InsertRows\
            .assert_called_once_with(self.cnxn,
                template_svc.TEMPLATE2APPROVALVALUE_COLS,
                [(23, 1, 81, 'needs_review'), (24, 1, 81, 'not_set')], commit=False)
        self.cnxn.Commit.assert_called_once_with()
        self.template_service.template_set_2lc.InvalidateKeys\
            .assert_called_once_with(self.cnxn, [789])
コード例 #28
0
ファイル: template_svc.py プロジェクト: xinghun61/infra
  def FetchItems(self, cnxn, keys):
    """On RAM and memcache miss, hit the database.

    Args:
      cnxn: A MonorailConnection.
      keys: A list of template IDs (ints).

    Returns:
      A dict of {template_id: TemplateDef}.
    """
    template_dict = {}

    # Fetch template rows and relations.
    template_rows = self.template_service.template_tbl.Select(
        cnxn, cols=TEMPLATE_COLS, id=keys,
        order_by=[('name', [])])

    template2label_rows = self.template_service.\
        template2label_tbl.Select(
            cnxn, cols=TEMPLATE2LABEL_COLS, template_id=keys)
    template2component_rows = self.template_service.\
        template2component_tbl.Select(
            cnxn, cols=TEMPLATE2COMPONENT_COLS, template_id=keys)
    template2admin_rows = self.template_service.template2admin_tbl.Select(
        cnxn, cols=TEMPLATE2ADMIN_COLS, template_id=keys)
    template2fieldvalue_rows = self.template_service.\
        template2fieldvalue_tbl.Select(
            cnxn, cols=TEMPLATE2FIELDVALUE_COLS, template_id=keys)
    template2approvalvalue_rows = self.template_service.\
        template2approvalvalue_tbl.Select(
            cnxn, cols=TEMPLATE2APPROVALVALUE_COLS, template_id=keys)
    phase_ids = [av_row[2] for av_row in template2approvalvalue_rows]
    phase_rows = self.template_service.issuephasedef_tbl.Select(
        cnxn, cols=ISSUEPHASEDEF_COLS, id=list(set(phase_ids)))

    # Build TemplateDef with all related data.
    for template_row in template_rows:
      template = UnpackTemplate(template_row)
      template_dict[template.template_id] = template

    for template2label_row in template2label_rows:
      template_id, label = template2label_row
      template = template_dict.get(template_id)
      if template:
        template.labels.append(label)

    for template2component_row in template2component_rows:
      template_id, component_id = template2component_row
      template = template_dict.get(template_id)
      if template:
        template.component_ids.append(component_id)

    for template2admin_row in template2admin_rows:
      template_id, admin_id = template2admin_row
      template = template_dict.get(template_id)
      if template:
        template.admin_ids.append(admin_id)

    for fv_row in template2fieldvalue_rows:
      (template_id, field_id, int_value, str_value, user_id,
       date_value, url_value) = fv_row
      fv = tracker_bizobj.MakeFieldValue(
          field_id, int_value, str_value, user_id, date_value, url_value,
          False)
      template = template_dict.get(template_id)
      if template:
        template.field_values.append(fv)

    phases_by_id = {}
    for phase_row in phase_rows:
      (phase_id, name, rank) = phase_row
      phase = tracker_pb2.Phase(
          phase_id=phase_id, name=name, rank=rank)
      phases_by_id[phase_id] = phase

    # Note: there is no templateapproval2approver_tbl.
    for av_row in template2approvalvalue_rows:
      (approval_id, template_id, phase_id, status) = av_row
      approval_value = tracker_pb2.ApprovalValue(
          approval_id=approval_id, phase_id=phase_id,
          status=tracker_pb2.ApprovalStatus(status.upper()))
      template = template_dict.get(template_id)
      if template:
        template.approval_values.append(approval_value)
        phase = phases_by_id.get(phase_id)
        if phase and phase not in template.phases:
          template_dict.get(template_id).phases.append(phase)

    return template_dict
コード例 #29
0
ファイル: notify_test.py プロジェクト: xinghun61/infra
    def testNotifyApprovalChangeTask_Normal(self):
        config = self.services.config.GetProjectConfig('cnxn', 12345)
        config.field_defs = [
            # issue's User field with any_comment is notified.
            tracker_bizobj.MakeFieldDef(
                121, 12345, 'TL', tracker_pb2.FieldTypes.USER_TYPE, '', '',
                False, False, False, None, None, None, False, '', None,
                tracker_pb2.NotifyTriggers.ANY_COMMENT, 'no_action',
                'TL, notified on everything', False),
            # issue's User field with never is not notified.
            tracker_bizobj.MakeFieldDef(
                122, 12345, 'silentTL', tracker_pb2.FieldTypes.USER_TYPE, '',
                '', False, False, False, None, None, None, False, '', None,
                tracker_pb2.NotifyTriggers.NEVER, 'no_action',
                'TL, notified on nothing', False),
            # approval's User field with any_comment is notified.
            tracker_bizobj.MakeFieldDef(123,
                                        12345,
                                        'otherapprovalTL',
                                        tracker_pb2.FieldTypes.USER_TYPE,
                                        '',
                                        '',
                                        False,
                                        False,
                                        False,
                                        None,
                                        None,
                                        None,
                                        False,
                                        '',
                                        None,
                                        tracker_pb2.NotifyTriggers.ANY_COMMENT,
                                        'no_action',
                                        'TL on the approvers team',
                                        False,
                                        approval_id=3),
            # another approval's User field with any_comment is not notified.
            tracker_bizobj.MakeFieldDef(124,
                                        12345,
                                        'otherapprovalTL',
                                        tracker_pb2.FieldTypes.USER_TYPE,
                                        '',
                                        '',
                                        False,
                                        False,
                                        False,
                                        None,
                                        None,
                                        None,
                                        False,
                                        '',
                                        None,
                                        tracker_pb2.NotifyTriggers.ANY_COMMENT,
                                        'no_action',
                                        'TL on another approvers team',
                                        False,
                                        approval_id=4),
            tracker_bizobj.MakeFieldDef(3, 12345, 'Goat-Approval',
                                        tracker_pb2.FieldTypes.APPROVAL_TYPE,
                                        '', '', False, False, False, None,
                                        None, None, False, '', None,
                                        tracker_pb2.NotifyTriggers.NEVER,
                                        'no_action', 'Get Approval from Goats',
                                        False)
        ]
        self.services.config.StoreConfig('cnxn', config)

        # Custom user_type field TLs
        self.services.user.TestAddUser('*****@*****.**', 111)
        self.services.user.TestAddUser('*****@*****.**', 222)
        self.services.user.TestAddUser('*****@*****.**', 333)
        self.services.user.TestAddUser('*****@*****.**', 444)

        # Approvers
        self.services.user.TestAddUser('*****@*****.**', 777)
        self.services.user.TestAddUser('*****@*****.**', 888)
        self.services.user.TestAddUser('*****@*****.**', 999)
        self.services.user.TestAddUser('*****@*****.**', 666)
        self.services.user.TestAddUser('*****@*****.**', 661)
        self.services.user.TestAddUser('*****@*****.**', 662)
        self.services.user.TestAddUser('*****@*****.**', 663)
        self.services.usergroup.TestAddGroupSettings(
            666, '*****@*****.**')
        self.services.usergroup.TestAddMembers(666, [661, 662, 663])
        canary_phase = tracker_pb2.Phase(name='Canary', phase_id=1, rank=1)
        approval_values = [
            tracker_pb2.ApprovalValue(approval_id=3,
                                      approver_ids=[888, 999, 666, 661])
        ]
        approval_issue = MakeTestIssue(project_id=12345,
                                       local_id=2,
                                       owner_id=2,
                                       reporter_id=1,
                                       is_spam=True)
        approval_issue.phases = [canary_phase]
        approval_issue.approval_values = approval_values
        approval_issue.field_values = [
            tracker_bizobj.MakeFieldValue(121, None, None, 111, None, None,
                                          False),
            tracker_bizobj.MakeFieldValue(122, None, None, 222, None, None,
                                          False),
            tracker_bizobj.MakeFieldValue(123, None, None, 333, None, None,
                                          False),
            tracker_bizobj.MakeFieldValue(124, None, None, 444, None, None,
                                          False),
        ]
        self.services.issue.TestAddIssue(approval_issue)

        amend = tracker_bizobj.MakeApprovalApproversAmendment([888], [777])

        comment = tracker_pb2.IssueComment(project_id=12345,
                                           user_id=999,
                                           issue_id=approval_issue.issue_id,
                                           amendments=[amend],
                                           timestamp=1234567890,
                                           content='just a comment.')
        attach = tracker_pb2.Attachment(attachment_id=4567,
                                        filename='sploot.jpg',
                                        mimetype='image/png',
                                        gcs_object_id='/pid/attachments/abcd',
                                        filesize=(1024 * 1023))
        comment.attachments.append(attach)
        self.services.issue.TestAddComment(comment, approval_issue.local_id)
        self.services.issue.TestAddAttachment(attach, comment.id,
                                              approval_issue.issue_id)

        task = notify.NotifyApprovalChangeTask(request=None,
                                               response=None,
                                               services=self.services)
        params = {
            'send_email': 1,
            'issue_id': approval_issue.issue_id,
            'approval_id': 3,
            'comment_id': comment.id,
        }
        mr = testing_helpers.MakeMonorailRequest(user_info={'user_id': 1},
                                                 params=params,
                                                 method='POST',
                                                 services=self.services)
        result = task.HandleRequest(mr)
        self.assertTrue('just a comment' in result['tasks'][0]['body'])
        self.assertTrue('Approvers: -approver' in result['tasks'][0]['body'])
        self.assertTrue('sploot.jpg' in result['tasks'][0]['body'])
        self.assertTrue(
            '/issues/attachment?aid=4567' in result['tasks'][0]['body'])
        self.assertItemsEqual([
            '*****@*****.**', '*****@*****.**',
            '*****@*****.**', '*****@*****.**',
            '*****@*****.**', '*****@*****.**',
            '*****@*****.**', '*****@*****.**'
        ], result['notified'])

        # Test no approvers/groups notified
        # Status change to NEED_INFO does not email approvers.
        amend2 = tracker_bizobj.MakeApprovalStatusAmendment(
            tracker_pb2.ApprovalStatus.NEED_INFO)
        comment2 = tracker_pb2.IssueComment(project_id=12345,
                                            user_id=999,
                                            issue_id=approval_issue.issue_id,
                                            amendments=[amend2],
                                            timestamp=1234567891,
                                            content='')
        self.services.issue.TestAddComment(comment2, approval_issue.local_id)
        task = notify.NotifyApprovalChangeTask(request=None,
                                               response=None,
                                               services=self.services)
        params = {
            'send_email': 1,
            'issue_id': approval_issue.issue_id,
            'approval_id': 3,
            'comment_id': comment2.id,
        }
        mr = testing_helpers.MakeMonorailRequest(user_info={'user_id': 1},
                                                 params=params,
                                                 method='POST',
                                                 services=self.services)
        result = task.HandleRequest(mr)
        self.assertTrue('Status: need_info' in result['tasks'][0]['body'])
        self.assertItemsEqual(
            ['*****@*****.**', '*****@*****.**', '*****@*****.**'],
            result['notified'])
コード例 #30
0
  def testComputeUnshownColumns_FieldDefs(self):
    search_results = [
        fake.MakeTestIssue(
            789, 1, 'sum 1', 'New', 111,
            field_values=[
                tracker_bizobj.MakeFieldValue(
                    5, 74, None, None, None, None, False, phase_id=4),
                tracker_bizobj.MakeFieldValue(
                    6, 78, None, None, None, None, False, phase_id=5)],
            phases=[
                tracker_pb2.Phase(phase_id=4, name='goats'),
                tracker_pb2.Phase(phase_id=5, name='sheep')]),
        fake.MakeTestIssue(
            789, 2, 'sum 2', 'New', 111,
            field_values=[
                tracker_bizobj.MakeFieldValue(
                    5, 74, None, None, None, None, False, phase_id=3),
                tracker_bizobj.MakeFieldValue(
                    6, 77, None, None, None, None, False, phase_id=3)],
            phases=[
                tracker_pb2.Phase(phase_id=3, name='Goats'),
                tracker_pb2.Phase(phase_id=3, name='Goats-Exp')]),
    ]

    shown_cols = ['a', 'b', 'a1', 'a2-approver', 'f3', 'goats.g1', 'sheep.g2']
    config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
    config.default_col_spec = ''
    config.well_known_labels = []
    config.field_defs = [
      tracker_bizobj.MakeFieldDef(
          1, 789, 'a1', tracker_pb2.FieldTypes.APPROVAL_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'Tracks review from cows', False),
      tracker_bizobj.MakeFieldDef(
          2, 789, 'a2', tracker_pb2.FieldTypes.APPROVAL_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'Tracks review from chickens', False),
      tracker_bizobj.MakeFieldDef(
          3, 789, 'f3', tracker_pb2.FieldTypes.STR_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'cow names', False),
      tracker_bizobj.MakeFieldDef(
          4, 789, 'f4', tracker_pb2.FieldTypes.INT_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'chicken gobbles', False),
      tracker_bizobj.MakeFieldDef(
          5, 789, 'g1', tracker_pb2.FieldTypes.INT_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'fluff', False, is_phase_field=True),
      tracker_bizobj.MakeFieldDef(
          6, 789, 'g2', tracker_pb2.FieldTypes.INT_TYPE,
          None, None, False, False, False, None, None, None, False, None,
          None, None, None, 'poof', False, is_phase_field=True),
    ]
    builtin_cols = []

    unshown = table_view_helpers.ComputeUnshownColumns(
        search_results, shown_cols, config, builtin_cols)
    self.assertEqual(unshown, [
        'a1-approver', 'a2', 'f4',
        'goats-exp.g1', 'goats-exp.g2', 'goats.g2', 'sheep.g1'])