Example #1
0
    def mail(self, template, subject, context={}, to=[], request=None):
        from tcms.core.mailto import mailto

        if not to:
            to = self.author.email

        to = list(set(to))
        mailto(template, subject, to, context, request=request)
Example #2
0
    def test_also_send_mail_to_addresses_for_debug(self):
        with patch.object(settings, 'DEBUG', new=True):
            with patch.object(settings,
                              'EMAILS_FOR_DEBUG',
                              new=['cotester@localhost']):
                mailto('mail_template', 'Start Test', ['tester@localhost'])

        self.assertListEqual(['cotester@localhost', 'tester@localhost'],
                             sorted(mail.outbox[0].recipients()))
Example #3
0
    def _sendmail(self):
        mail_context = TestCase.mail_scene(objects=self._update_objects,
                                           field=self.target_field,
                                           value=self.new_value)
        if mail_context:
            from tcms.core.mailto import mailto

            mail_context['context']['user'] = self.request.user
            mailto(**mail_context)
Example #4
0
def email_plan_update(plan):
    recipients = get_plan_notification_recipients(plan)
    if len(recipients) == 0:
        return
    subject = 'TestPlan %s has been updated.' % plan.pk
    mailto(settings.PLAN_EMAIL_TEMPLATE,
           subject,
           recipients,
           context={'plan': plan})
Example #5
0
    def send_confirm_mail(self,
                          request,
                          active_key,
                          template_name='registration/confirm_email.html'):
        from django.urls import reverse
        from django.contrib.sites.models import Site
        from tcms.core.mailto import mailto
        from tcms.core.utils import request_host_link

        s = Site.objects.get_current()
        cu = '{}{}'.format(
            request_host_link(request, s.domain),
            reverse('nitrate-activation-confirm',
                    args=[active_key.activation_key]))
        mailto(template_name=template_name,
               recipients=self.cleaned_data['email'],
               subject='Your new %s account confirmation' % s.domain,
               context={
                   'user': self.instance,
                   'site': s,
                   'active_key': active_key,
                   'confirm_url': cu,
               })
Example #6
0
 def test_log_traceback_when_error_is_raised_from_send(
         self, logger, EmailMessage):
     EmailMessage.return_value.send.side_effect = smtplib.SMTPException
     mailto('mail_template', 'Start Test', ['tester@localhost'])
     logger.exception.assert_called_once()
Example #7
0
 def test_recipients_accept_non_sequence_value(self):
     mailto('mail_template', 'Start Test', 'tester@localhost')
     self.assertEqual('tester@localhost', mail.outbox[0].recipients()[0])
Example #8
0
 def test_send_mail(self):
     mailto('mail_template', 'Start Test', ['tester@localhost'])
     self.assertEqual('Start Test', mail.outbox[0].subject)
Example #9
0
def update_case_run_status(request):
    """Update Case Run status."""
    now = datetime.datetime.now()

    data = request.POST.copy()
    ctype = data.get("content_type")
    vtype = data.get('value_type', 'str')
    object_pk_str = data.get("object_pk")
    field = data.get('field')
    value = data.get('value')

    object_pk = [int(a) for a in object_pk_str.split(',')]

    if not field or not value or not object_pk or not ctype:
        return say_no('Following fields are required - content_type, '
                      'object_pk, field and value.')

    # Convert the value type
    # FIXME: Django bug here: update() keywords must be strings
    field = str(field)

    value, error = get_value_by_type(value, vtype)
    if error:
        return say_no(error)
    has_perms = check_permission(request, ctype)
    if not has_perms:
        return say_no('Permission Dinied.')

    model = utils.get_model(ctype)
    targets = model._default_manager.filter(pk__in=object_pk)

    if not targets:
        return say_no('No record found')
    if not hasattr(targets[0], field):
        return say_no(f'{ctype} has no field {field}')

    if hasattr(targets[0], 'log_action'):
        for t in targets:
            try:
                t.log_action(who=request.user,
                             field=field,
                             original_value=getattr(t, field),
                             new_value=TestCaseRunStatus.id_to_name(value))
            except (AttributeError, User.DoesNotExist):
                pass
    objects_update(targets, **{field: value})

    if hasattr(model, 'mail_scene'):
        from tcms.core.mailto import mailto

        mail_context = model.mail_scene(
            objects=targets,
            field=field,
            value=value,
            ctype=ctype,
            object_pk=object_pk,
        )
        if mail_context:
            mail_context['context']['user'] = request.user
            mailto(**mail_context)

    # Special hacking for updating test case run status
    if ctype == 'testruns.testcaserun' and field == 'case_run_status':
        for t in targets:
            field = 'close_date'
            t.log_action(who=request.user,
                         field=field,
                         original_value=getattr(t, field) or '',
                         new_value=now)
            if t.tested_by != request.user:
                field = 'tested_by'
                t.log_action(who=request.user,
                             field=field,
                             original_value=getattr(t, field) or '',
                             new_value=request.user)

            field = 'assignee'
            try:
                assignee = t.assginee
                if assignee != request.user:
                    t.log_action(who=request.user,
                                 field=field,
                                 original_value=getattr(t, field) or '',
                                 new_value=request.user)
                    # t.assignee = request.user
                t.save()
            except (AttributeError, User.DoesNotExist):
                pass
        targets.update(close_date=now, tested_by=request.user)

    return HttpResponse(json.dumps({'rc': 0, 'response': 'ok'}))
Example #10
0
def update(request):
    """Generic approach to update a model, based on contenttype."""
    now = datetime.datetime.now()

    data = request.POST.copy()
    ctype = data.get("content_type")
    vtype = data.get('value_type', 'str')
    object_pk_str = data.get("object_pk")
    field = data.get('field')
    value = data.get('value')

    object_pk = [int(a) for a in object_pk_str.split(',')]

    if not field or not value or not object_pk or not ctype:
        return JsonResponseBadRequest({
            'message':
            'Following fields are required - '
            'content_type, object_pk, field and value.'
        })

    # Convert the value type
    # FIXME: Django bug here: update() keywords must be strings
    field = str(field)

    value, error = get_value_by_type(value, vtype)
    if error:
        return JsonResponseBadRequest({'message': error})
    has_perms = check_permission(request, ctype)
    if not has_perms:
        return JsonResponseForbidden({'message': 'Permission Denied.'})

    model = utils.get_model(ctype)
    targets = model._default_manager.filter(pk__in=object_pk)

    if not targets:
        return JsonResponseBadRequest({'message': 'No record found'})
    if not hasattr(targets[0], field):
        return JsonResponseBadRequest(
            {'message': f'{ctype} has no field {field}'})

    if hasattr(targets[0], 'log_action'):
        for t in targets:
            try:
                log_info = {
                    'who': request.user,
                    'field': field,
                    'new_value': value,
                }
                original_value = getattr(t, field)
                if original_value is None:
                    log_info['original_value'] = 'None'
                t.log_action(**log_info)
            except (AttributeError, User.DoesNotExist):
                pass
    objects_update(targets, **{field: value})

    if hasattr(model, 'mail_scene'):
        mail_context = model.mail_scene(
            objects=targets,
            field=field,
            value=value,
            ctype=ctype,
            object_pk=object_pk,
        )
        if mail_context:
            from tcms.core.mailto import mailto

            mail_context['context']['user'] = request.user
            mailto(**mail_context)

    # Special hacking for updating test case run status
    if ctype == 'testruns.testcaserun' and field == 'case_run_status':
        for t in targets:
            field = 'close_date'
            t.log_action(who=request.user,
                         field=field,
                         original_value=getattr(t, field),
                         new_value=now)
            if t.tested_by != request.user:
                field = 'tested_by'
                t.log_action(who=request.user,
                             field=field,
                             original_value=getattr(t, field),
                             new_value=request.user)

            field = 'assignee'
            try:
                assignee = t.assginee
                if assignee != request.user:
                    t.log_action(who=request.user,
                                 field=field,
                                 original_value=getattr(t, field),
                                 new_value=request.user)
                    # t.assignee = request.user
                t.save()
            except (AttributeError, User.DoesNotExist):
                pass
        targets.update(close_date=now, tested_by=request.user)
    return JsonResponse({})
Example #11
0
def email_case_deletion(case):
    notify_recipients(
        case,
        f'TestCase {case.pk} has been deleted.',
        {'case': case},
    )


def notify_recipients(case, subject, context):
    recipients = get_case_notification_recipients(case)
    cc = case.emailing.get_cc_list()
    if len(recipients) == 0:
        return
    template = settings.CASE_EMAIL_TEMPLATE
    mailto(template, subject, recipients, context, cc=cc)


def get_case_notification_recipients(case):
    recipients = set()
    if case.emailing.auto_to_case_author:
        recipients.add(case.author.email)
    if case.emailing.auto_to_case_tester and case.default_tester:
        recipients.add(case.default_tester.email)
    if case.emailing.auto_to_run_manager:
        managers = case.case_run.values_list('run__manager__email', flat=True)
        recipients.update(managers)
    if case.emailing.auto_to_run_tester:
        run_testers = case.case_run.values_list('run__default_tester__email',
                                                flat=True)
        recipients.update(run_testers)
Example #12
0
    def mail(self, template, subject, context, to=[], request=None):
        from tcms.core.mailto import mailto

        to = self.get_notify_addrs()
        mailto(template, subject, to, context, request=request)