def _populate_issue_json(obj_info, issue_json):
   """Populate issue json with parameters from request."""
   if obj_info.hotlist_ids:
     issue_json["hotlist_ids"] = obj_info.hotlist_ids
   if obj_info.component_id:
     issue_json["component_id"] = obj_info.component_id
   integration_utils.normalize_issue_tracker_info(issue_json)
def _update_issuetracker_issue(assessment, issue_tracker_info,
                               initial_assessment, initial_info, request):
    """Collects information and sends a request to update external issue."""
    # pylint: disable=too-many-locals
    issue_id = issue_tracker_info.get('issue_id')
    if not issue_id:
        return

    comments = []

    # Handle switching of 'enabled' property.
    enabled = issue_tracker_info.get('enabled', False)
    if initial_info.get('enabled', False) != enabled:
        # Add comment about toggling feature and process further.
        comments.append(_ENABLED_TMPL if enabled else _DISABLED_TMPL)
    elif not enabled:
        # If feature remains in the same status which is 'disabled'.
        return

    integration_utils.normalize_issue_tracker_info(issue_tracker_info)

    issue_params = _handle_basic_props(issue_tracker_info, initial_info)

    # Handle status update.
    status_value, status_comment = _build_status_comment(
        assessment, initial_assessment)
    if status_value:
        issue_params['status'] = status_value
        comments.append(status_comment)

    # Attach user comments if any.
    comment_text, comment_author = _get_added_comment_text(request)
    if comment_text is not None:
        comments.append(
            _COMMENT_TMPL %
            (comment_author, comment_text, _get_assessment_url(assessment)))

    if comments:
        issue_params['comment'] = '\n\n'.join(comments)

    # Handle hotlist ID update.
    hotlist_id = issue_tracker_info.get('hotlist_id')
    if hotlist_id is not None and hotlist_id != initial_info.get('hotlist_id'):
        issue_params['hotlist_ids'] = [hotlist_id] if hotlist_id else []

    # handle assignee and cc_list update
    assignee_email, cc_list = _collect_issue_emails(assessment)
    if assignee_email is not None:
        issue_tracker_info['assignee'] = assignee_email
        issue_params['assignee'] = assignee_email
        issue_params['verifier'] = assignee_email
        issue_params['ccs'] = cc_list

    if issue_params:
        # Resend all properties upon any change.
        issue_params = _fill_current_value(issue_params, assessment,
                                           initial_info)
        issues.Client().update_issue(issue_id, issue_params)
Exemple #3
0
 def test_normalize_info(self, info, expected, expected_error):
   """Test _normalize_issue_tracker_info function."""
   # pylint: disable=protected-access
   if expected_error:
     with self.assertRaises(expected_error):
       integration_utils.normalize_issue_tracker_info(info)
   else:
     integration_utils.normalize_issue_tracker_info(info)
     self.assertEqual(info, expected)
def _update_issuetracker_issue(assessment, issue_tracker_info,
                               initial_assessment, initial_info, request):
  """Collects information and sends a request to update external issue."""
  # pylint: disable=too-many-locals
  issue_id = issue_tracker_info.get('issue_id')
  if not issue_id:
    return

  comments = []

  # Handle switching of 'enabled' property.
  enabled = issue_tracker_info.get('enabled', False)
  if initial_info.get('enabled', False) != enabled:
    # Add comment about toggling feature and process further.
    comments.append(_ENABLED_TMPL if enabled else _DISABLED_TMPL)
  elif not enabled:
    # If feature remains in the same status which is 'disabled'.
    return

  integration_utils.normalize_issue_tracker_info(issue_tracker_info)

  issue_params = _handle_basic_props(issue_tracker_info, initial_info)

  # Handle status update.
  status_value, status_comment = _build_status_comment(
      assessment, initial_assessment)
  if status_value:
    issue_params['status'] = status_value
    comments.append(status_comment)

  # Attach user comments if any.
  comment_text, comment_author = _get_added_comment_text(request)
  if comment_text is not None:
    comments.append(
        _COMMENT_TMPL % (
            comment_author, comment_text, _get_assessment_url(assessment)))

  if comments:
    issue_params['comment'] = '\n\n'.join(comments)

  # Handle hotlist ID update.
  hotlist_id = issue_tracker_info.get('hotlist_id')
  if hotlist_id is not None and hotlist_id != initial_info.get('hotlist_id'):
    issue_params['hotlist_ids'] = [hotlist_id] if hotlist_id else []

  # handle assignee and cc_list update
  assignee_email, cc_list = _collect_issue_emails(assessment)
  if assignee_email is not None:
    issue_tracker_info['assignee'] = assignee_email
    issue_params['assignee'] = assignee_email
    issue_params['verifier'] = assignee_email
    issue_params['ccs'] = cc_list

  if issue_params:
    # Resend all properties upon any change.
    issue_params = _fill_current_value(issue_params, assessment, initial_info)
    issues.Client().update_issue(issue_id, issue_params)
Exemple #5
0
def prepare_issue_json(assessment, issue_tracker_info=None):
    """Create json that will be sent to IssueTracker.

  Args:
      assessment: Instance of Assessment.
      issue_tracker_info: Dict with IssueTracker info.

  Returns:
      Dict with IssueTracker issue info.
  """
    if not issue_tracker_info:
        issue_tracker_info = assessment.audit.issuetracker_issue.to_dict()
        issue_tracker_info['title'] = assessment.title
        issue_tracker_info['status'] = ASSESSMENT_STATUSES_MAPPING.get(
            assessment.status)

    integration_utils.normalize_issue_tracker_info(issue_tracker_info)

    assignee_email, cc_list = _collect_assessment_emails(assessment)
    if assignee_email is not None:
        issue_tracker_info['assignee'] = assignee_email
        issue_tracker_info['cc_list'] = cc_list

    hotlist_id = issue_tracker_info.get('hotlist_id')

    issue_params = {
        'component_id': issue_tracker_info['component_id'],
        'hotlist_ids': [hotlist_id] if hotlist_id else [],
        'title': issue_tracker_info['title'],
        'type': issue_tracker_info['issue_type'],
        'priority': issue_tracker_info['issue_priority'],
        'severity': issue_tracker_info['issue_severity'],
        'reporter': get_reporter_email(assessment),
        'assignee': '',
        'verifier': '',
        'status': issue_tracker_info['status'],
        'ccs': [],
        'comment': create_asmnt_comment(assessment),
    }

    assignee = issue_tracker_info.get('assignee')
    if assignee:
        if not issue_tracker_info['status']:
            issue_params['status'] = 'ASSIGNED'
        issue_params['assignee'] = assignee
        issue_params['verifier'] = assignee

    cc_list = issue_tracker_info.get('cc_list', [])
    audit_ccs = get_audit_ccs(assessment)
    grouped_ccs = group_cc_emails(audit_ccs, cc_list)

    if grouped_ccs:
        issue_params['ccs'] = grouped_ccs

    return issue_params
Exemple #6
0
def _create_issuetracker_issue(assessment, issue_tracker_info):
    """Collects information and sends a request to create external issue."""
    integration_utils.normalize_issue_tracker_info(issue_tracker_info)

    person, acl, acr = (all_models.Person, all_models.AccessControlList,
                        all_models.AccessControlRole)
    reporter_email = db.session.query(person.email, ).join(
        acl,
        person.id == acl.person_id,
    ).join(
        acr,
        sa.and_(
            acl.ac_role_id == acr.id,
            acr.name == "Audit Captains",
        ),
    ).filter(
        acl.object_id == assessment.audit_id,
        acl.object_type == all_models.Audit.__name__,
    ).order_by(person.email, ).first()

    if reporter_email:
        reporter_email = reporter_email.email

    comment = [_INITIAL_COMMENT_TMPL % _get_assessment_url(assessment)]
    test_plan = assessment.test_plan
    if test_plan:
        comment.extend([
            'Following is the assessment Requirements/Assessment Procedure '
            'from GGRC:',
            html2text.HTML2Text().handle(test_plan).strip('\n'),
        ])

    hotlist_id = issue_tracker_info.get('hotlist_id')

    issue_params = {
        'component_id': issue_tracker_info['component_id'],
        'hotlist_ids': [hotlist_id] if hotlist_id else [],
        'title': issue_tracker_info['title'],
        'type': issue_tracker_info['issue_type'],
        'priority': issue_tracker_info['issue_priority'],
        'severity': issue_tracker_info['issue_severity'],
        'reporter': reporter_email,
        'assignee': '',
        'verifier': '',
        'status': issue_tracker_info['status'],
        'ccs': [],
        'comment': '\n'.join(comment),
    }

    assignee = issue_tracker_info.get('assignee')
    if assignee:
        if not issue_tracker_info['status']:
            issue_params['status'] = 'ASSIGNED'
        issue_params['assignee'] = assignee
        issue_params['verifier'] = assignee

    cc_list = issue_tracker_info.get('cc_list')
    if cc_list is not None:
        issue_params['ccs'] = cc_list

    res = issues.Client().create_issue(issue_params)
    return res['issueId']
def _create_issuetracker_issue(assessment, issue_tracker_info):
  """Collects information and sends a request to create external issue."""
  integration_utils.normalize_issue_tracker_info(issue_tracker_info)

  person, acl, acr = (all_models.Person, all_models.AccessControlList,
                      all_models.AccessControlRole)
  reporter_email = db.session.query(
      person.email,
  ).join(
      acl,
      person.id == acl.person_id,
  ).join(
      acr,
      sa.and_(
          acl.ac_role_id == acr.id,
          acr.name == "Audit Captains",
      ),
  ).filter(
      acl.object_id == assessment.audit_id,
      acl.object_type == all_models.Audit.__name__,
  ).order_by(
      person.email,
  ).first()

  if reporter_email:
    reporter_email = reporter_email.email

  comment = [_INITIAL_COMMENT_TMPL % _get_assessment_url(assessment)]
  test_plan = assessment.test_plan
  if test_plan:
    comment.extend([
        'Following is the assessment Requirements/Assessment Procedure '
        'from GGRC:',
        html2text.HTML2Text().handle(test_plan).strip('\n'),
    ])

  hotlist_id = issue_tracker_info.get('hotlist_id')

  issue_params = {
      'component_id': issue_tracker_info['component_id'],
      'hotlist_ids': [hotlist_id] if hotlist_id else [],
      'title': issue_tracker_info['title'],
      'type': issue_tracker_info['issue_type'],
      'priority': issue_tracker_info['issue_priority'],
      'severity': issue_tracker_info['issue_severity'],
      'reporter': reporter_email,
      'assignee': '',
      'verifier': '',
      'status': issue_tracker_info['status'],
      'ccs': [],
      'comment': '\n'.join(comment),
  }

  assignee = issue_tracker_info.get('assignee')
  if assignee:
    if not issue_tracker_info['status']:
      issue_params['status'] = 'ASSIGNED'
    issue_params['assignee'] = assignee
    issue_params['verifier'] = assignee

  cc_list = issue_tracker_info.get('cc_list')
  if cc_list is not None:
    issue_params['ccs'] = cc_list

  res = issues.Client().create_issue(issue_params)
  return res['issueId']
def _update_issuetracker_issue(
        assessment,
        issue_tracker_info,  # noqa
        initial_assessment,
        initial_info,
        request):
    """Collects information and sends a request to update external issue."""
    # pylint: disable=too-many-locals
    issue_id = issue_tracker_info.get('issue_id')
    if not issue_id:
        return

    comments = []

    # Handle switching of 'enabled' property.
    enabled = issue_tracker_info.get('enabled', False)
    if initial_info.get('enabled', False) != enabled:
        # Add comment about toggling feature and process further.
        comments.append(_ENABLED_TMPL if enabled else _DISABLED_TMPL)
    elif not enabled:
        # If feature remains in the same status which is 'disabled'.
        return

    integration_utils.normalize_issue_tracker_info(issue_tracker_info)

    issue_params = _handle_basic_props(issue_tracker_info, initial_info)

    # Handle status update.
    status_value, status_comment = _build_status_comment(
        assessment, initial_assessment)
    if status_value:
        issue_params['status'] = status_value
        comments.append(status_comment)

    # Attach user comments if any.
    comment_text, comment_author = _get_added_comment_text(request)
    if comment_text is not None:
        builder = issue_tracker_params_builder.AssessmentParamsBuilder()
        comments.append(
            builder.COMMENT_TMPL.format(author=comment_author,
                                        comment=comment_text,
                                        model=_ASSESSMENT_MODEL_NAME,
                                        link=_get_assessment_url(assessment)))

    if comments:
        issue_params['comment'] = '\n\n'.join(comments)

    # Handle hotlist ID update.
    hotlist_id = issue_tracker_info.get('hotlist_id')
    if hotlist_id is not None and hotlist_id != initial_info.get('hotlist_id'):
        issue_params['hotlist_ids'] = [hotlist_id] if hotlist_id else []

    # handle assignee and cc_list update
    assignee_email, cc_list = _collect_assessment_emails(assessment)
    del cc_list

    if assignee_email is not None:
        issue_tracker_info['assignee'] = assignee_email
        issue_params['assignee'] = assignee_email
        issue_params['verifier'] = assignee_email

    custom_fields = []

    # handle due_date update
    due_date = issue_tracker_info.get('due_date')
    if due_date:
        custom_fields.append({
            "name": constants.CUSTOM_FIELDS_DUE_DATE,
            "value": due_date.strftime("%Y-%m-%d"),
            "type": "DATE",
            "display_string": constants.CUSTOM_FIELDS_DUE_DATE
        })

    if custom_fields:
        issue_params['custom_fields'] = custom_fields

    if issue_params:
        # Resend all properties upon any change.
        issue_params = _fill_current_value(issue_params, assessment,
                                           initial_info)
        issues.Client().update_issue(issue_id, issue_params)