Exemple #1
0
    def render(self, plain_body: str, plain_signature: str, subject: str,
               order, position) -> str:
        body_md = markdown_compile_email(plain_body)
        htmlctx = {
            'site': settings.PRETIX_INSTANCE_NAME,
            'site_url': settings.SITE_URL,
            'body': body_md,
            'subject': str(subject),
            'color': '#8E44B3',
            'rtl': get_language() in settings.LANGUAGES_RTL
        }
        if self.event:
            htmlctx['event'] = self.event
            htmlctx['color'] = self.event.settings.primary_color

        if plain_signature:
            signature_md = plain_signature.replace('\n', '<br>\n')
            signature_md = markdown_compile_email(signature_md)
            htmlctx['signature'] = signature_md

        if order:
            htmlctx['order'] = order

        if position:
            htmlctx['position'] = position

        tpl = get_template(self.template_name)
        body_html = inline_css(tpl.render(htmlctx))
        return body_html
Exemple #2
0
    def render(self, plain_body: str, plain_signature: str, subject: str, order: Order, position: OrderPosition) -> str:
        body_md = markdown_compile_email(plain_body)
        htmlctx = {
            'site': settings.PRETIX_INSTANCE_NAME,
            'site_url': settings.SITE_URL,
            'body': body_md,
            'subject': str(subject),
            'color': '#8E44B3'
        }
        if self.event:
            htmlctx['event'] = self.event
            htmlctx['color'] = self.event.settings.primary_color

        if plain_signature:
            signature_md = plain_signature.replace('\n', '<br>\n')
            signature_md = markdown_compile_email(signature_md)
            htmlctx['signature'] = signature_md

        if order:
            htmlctx['order'] = order

        if position:
            htmlctx['position'] = position

        tpl = get_template(self.template_name)
        body_html = inline_css(tpl.render(htmlctx))
        return body_html
Exemple #3
0
    def render(self, plain_body: str, plain_signature: str, subject: str, order, position) -> str:
        body_md = markdown_compile_email(plain_body)
        htmlctx = {
            'site': settings.PRETIX_INSTANCE_NAME,
            'site_url': settings.SITE_URL,
            'body': body_md,
            'subject': str(subject),
            'color': settings.PRETIX_PRIMARY_COLOR,
            'rtl': get_language() in settings.LANGUAGES_RTL or get_language().split('-')[0] in settings.LANGUAGES_RTL,
        }
        if self.organizer:
            htmlctx['organizer'] = self.organizer

        if self.event:
            htmlctx['event'] = self.event
            htmlctx['color'] = self.event.settings.primary_color

        if plain_signature:
            signature_md = plain_signature.replace('\n', '<br>\n')
            signature_md = markdown_compile_email(signature_md)
            htmlctx['signature'] = signature_md

        if order:
            htmlctx['order'] = order
            positions = list(order.positions.select_related(
                'item', 'variation', 'subevent', 'addon_to'
            ).annotate(
                has_addons=Count('addons')
            ))
            htmlctx['cart'] = [(k, list(v)) for k, v in groupby(
                sorted(
                    positions,
                    key=lambda op: (
                        (op.addon_to.positionid if op.addon_to_id else op.positionid),
                        op.positionid
                    )
                ),
                key=lambda op: (
                    op.item,
                    op.variation,
                    op.subevent,
                    op.attendee_name,
                    op.addon_to_id,
                    (op.pk if op.has_addons else None)
                )
            )]

        if position:
            htmlctx['position'] = position
            htmlctx['ev'] = position.subevent or self.event

        tpl = get_template(self.template_name)
        body_html = tpl.render(htmlctx)

        inliner = css_inline.CSSInliner(remove_style_tags=True)
        body_html = inliner.inline(body_html)

        return body_html
Exemple #4
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        o = {}

        for lang in self.request.event.settings.locales:
            with language(lang, self.request.event.settings.region):
                placeholders = TolerantDict()
                for k, v in get_available_placeholders(self.request.event, ['event', 'order', 'position_or_address']).items():
                    placeholders[k] = '<span class="placeholder" title="{}">{}</span>'.format(
                        _('This value will be replaced based on dynamic parameters.'),
                        v.render_sample(self.request.event)
                    )

                subject = bleach.clean(self.object.subject.localize(lang), tags=[])
                preview_subject = subject.format_map(placeholders)
                template = self.object.template.localize(lang)
                preview_text = markdown_compile_email(template.format_map(placeholders))

                o[lang] = {
                    'subject': _('Subject: {subject}'.format(subject=preview_subject)),
                    'html': preview_text,
                }

        ctx['output'] = o

        return ctx
Exemple #5
0
    def form_valid(self, form):
        self.output = {}

        if self.request.POST.get("action") == "preview":
            for l in self.request.event.settings.locales:
                with language(l, self.request.event.settings.region):
                    context_dict = TolerantDict()
                    for k, v in get_available_placeholders(
                            self.request.event,
                        ['event', 'order', 'position_or_address']).items():
                        context_dict[
                            k] = '<span class="placeholder" title="{}">{}</span>'.format(
                                _('This value will be replaced based on dynamic parameters.'
                                  ), v.render_sample(self.request.event))

                    subject = bleach.clean(
                        form.cleaned_data['subject'].localize(l), tags=[])
                    preview_subject = subject.format_map(context_dict)
                    template = form.cleaned_data['template'].localize(l)
                    preview_text = markdown_compile_email(
                        template.format_map(context_dict))

                    self.output[l] = {
                        'subject':
                        _('Subject: {subject}').format(
                            subject=preview_subject),
                        'html':
                        preview_text,
                    }

            return self.get(self.request, *self.args, **self.kwargs)

        messages.success(self.request, _('Your rule has been created.'))

        form.instance.event = self.request.event

        self.object = form.save()

        return redirect(
            'plugins:sendmail:rule.update',
            event=self.request.event.slug,
            organizer=self.request.event.organizer.slug,
            rule=self.object.pk,
        )
Exemple #6
0
    def form_valid(self, form):
        qs = Order.objects.filter(event=self.request.event)
        statusq = Q(status__in=form.cleaned_data['sendto'])
        if 'overdue' in form.cleaned_data['sendto']:
            statusq |= Q(status=Order.STATUS_PENDING, expires__lt=now())
        orders = qs.filter(statusq)
        orders = orders.filter(all_positions__item_id__in=[i.pk for i in form.cleaned_data.get('items')],
                               all_positions__canceled=False)
        if form.cleaned_data.get('subevent'):
            orders = orders.filter(all_positions__subevent__in=(form.cleaned_data.get('subevent'),),
                                   all_positions__canceled=False)
        orders = orders.distinct()

        self.output = {}
        if not orders:
            messages.error(self.request, _('There are no orders matching this selection.'))
            return self.get(self.request, *self.args, **self.kwargs)

        if self.request.POST.get("action") == "preview":
            for l in self.request.event.settings.locales:

                with language(l):

                    context_dict = {
                        'code': 'ORDER1234',
                        'event': self.request.event.name,
                        'date': date_format(now(), 'SHORT_DATE_FORMAT'),
                        'expire_date': date_format(now() + timedelta(days=7), 'SHORT_DATE_FORMAT'),
                        'url': build_absolute_uri(self.request.event, 'presale:event.order.open', kwargs={
                            'order': 'ORDER1234',
                            'secret': 'longrandomsecretabcdef123456',
                            'hash': 'abcdef',
                        }),
                        'invoice_name': _('John Doe'),
                        'invoice_company': _('Sample Company LLC')
                    }

                    subject = form.cleaned_data['subject'].localize(l)
                    preview_subject = subject.format_map(context_dict)
                    message = form.cleaned_data['message'].localize(l)
                    preview_text = markdown_compile_email(message.format_map(context_dict))

                    self.output[l] = {
                        'subject': _('Subject: {subject}').format(subject=preview_subject),
                        'html': preview_text,
                    }

            return self.get(self.request, *self.args, **self.kwargs)

        send_mails.apply_async(
            kwargs={
                'recipients': form.cleaned_data['recipients'],
                'event': self.request.event.pk,
                'user': self.request.user.pk,
                'subject': form.cleaned_data['subject'].data,
                'message': form.cleaned_data['message'].data,
                'orders': [o.pk for o in orders],
                'items': [i.pk for i in form.cleaned_data.get('items')]
            }
        )
        self.request.event.log_action('pretix.plugins.sendmail.sent',
                                      user=self.request.user,
                                      data=dict(form.cleaned_data))
        messages.success(self.request, _('Your message has been queued and will be sent to the contact addresses of %d '
                                         'orders in the next minutes.') % len(orders))

        return redirect(
            'plugins:sendmail:send',
            event=self.request.event.slug,
            organizer=self.request.event.organizer.slug
        )
Exemple #7
0
    def form_valid(self, form):
        qs = Order.objects.filter(event=self.request.event)
        statusq = Q(status__in=form.cleaned_data['sendto'])
        if 'overdue' in form.cleaned_data['sendto']:
            statusq |= Q(status=Order.STATUS_PENDING, expires__lt=now())
        orders = qs.filter(statusq)

        opq = OrderPosition.objects.filter(
            order=OuterRef('pk'),
            canceled=False,
            item_id__in=[i.pk for i in form.cleaned_data.get('items')],
        )

        if form.cleaned_data.get('filter_checkins'):
            ql = []
            if form.cleaned_data.get('not_checked_in'):
                ql.append(Q(checkins__list_id=None))
            if form.cleaned_data.get('checkin_lists'):
                ql.append(
                    Q(checkins__list_id__in=[
                        i.pk
                        for i in form.cleaned_data.get('checkin_lists', [])
                    ], ))
            if len(ql) == 2:
                opq = opq.filter(ql[0] | ql[1])
            elif ql:
                opq = opq.filter(ql[0])
            else:
                opq = opq.none()

        if form.cleaned_data.get('subevent'):
            opq = opq.filter(subevent=form.cleaned_data.get('subevent'))

        orders = orders.annotate(match_pos=Exists(opq)).filter(
            match_pos=True).distinct()

        self.output = {}
        if not orders:
            messages.error(self.request,
                           _('There are no orders matching this selection.'))
            return self.get(self.request, *self.args, **self.kwargs)

        if self.request.POST.get("action") == "preview":
            for l in self.request.event.settings.locales:

                with language(l):
                    context_dict = TolerantDict()
                    for k, v in get_available_placeholders(
                            self.request.event,
                        ['event', 'order', 'position_or_address']).items():
                        context_dict[
                            k] = '<span class="placeholder" title="{}">{}</span>'.format(
                                _('This value will be replaced based on dynamic parameters.'
                                  ), v.render_sample(self.request.event))

                    subject = bleach.clean(
                        form.cleaned_data['subject'].localize(l), tags=[])
                    preview_subject = subject.format_map(context_dict)
                    message = form.cleaned_data['message'].localize(l)
                    preview_text = markdown_compile_email(
                        message.format_map(context_dict))

                    self.output[l] = {
                        'subject':
                        _('Subject: {subject}').format(
                            subject=preview_subject),
                        'html':
                        preview_text,
                    }

            return self.get(self.request, *self.args, **self.kwargs)

        send_mails.apply_async(
            kwargs={
                'recipients':
                form.cleaned_data['recipients'],
                'event':
                self.request.event.pk,
                'user':
                self.request.user.pk,
                'subject':
                form.cleaned_data['subject'].data,
                'message':
                form.cleaned_data['message'].data,
                'orders': [o.pk for o in orders],
                'items': [i.pk for i in form.cleaned_data.get('items')],
                'not_checked_in':
                form.cleaned_data.get('not_checked_in'),
                'checkin_lists':
                [i.pk for i in form.cleaned_data.get('checkin_lists')],
                'filter_checkins':
                form.cleaned_data.get('filter_checkins'),
            })
        self.request.event.log_action('pretix.plugins.sendmail.sent',
                                      user=self.request.user,
                                      data=dict(form.cleaned_data))
        messages.success(
            self.request,
            _('Your message has been queued and will be sent to the contact addresses of %d '
              'orders in the next minutes.') % len(orders))

        return redirect('plugins:sendmail:send',
                        event=self.request.event.slug,
                        organizer=self.request.event.organizer.slug)
Exemple #8
0
    def form_valid(self, form):
        qs = Order.objects.filter(event=self.request.event)
        statusq = Q(status__in=form.cleaned_data['sendto'])
        if 'overdue' in form.cleaned_data['sendto']:
            statusq |= Q(status=Order.STATUS_PENDING, expires__lt=now())
        orders = qs.filter(statusq)
        orders = orders.filter(all_positions__item_id__in=[
            i.pk for i in form.cleaned_data.get('items')
        ],
                               all_positions__canceled=False)
        if form.cleaned_data.get('subevent'):
            orders = orders.filter(all_positions__subevent__in=(
                form.cleaned_data.get('subevent'), ),
                                   all_positions__canceled=False)
        orders = orders.distinct()

        self.output = {}
        if not orders:
            messages.error(self.request,
                           _('There are no orders matching this selection.'))
            return self.get(self.request, *self.args, **self.kwargs)

        if self.request.POST.get("action") == "preview":
            for l in self.request.event.settings.locales:

                with language(l):

                    context_dict = {
                        'code':
                        'ORDER1234',
                        'event':
                        self.request.event.name,
                        'date':
                        date_format(now(), 'SHORT_DATE_FORMAT'),
                        'expire_date':
                        date_format(now() + timedelta(days=7),
                                    'SHORT_DATE_FORMAT'),
                        'url':
                        build_absolute_uri(self.request.event,
                                           'presale:event.order.open',
                                           kwargs={
                                               'order': 'ORDER1234',
                                               'secret':
                                               'longrandomsecretabcdef123456',
                                               'hash': 'abcdef',
                                           }),
                        'invoice_name':
                        _('John Doe'),
                        'invoice_company':
                        _('Sample Company LLC')
                    }

                    subject = form.cleaned_data['subject'].localize(l)
                    preview_subject = subject.format_map(context_dict)
                    message = form.cleaned_data['message'].localize(l)
                    preview_text = markdown_compile_email(
                        message.format_map(context_dict))

                    self.output[l] = {
                        'subject':
                        _('Subject: {subject}').format(
                            subject=preview_subject),
                        'html':
                        preview_text,
                    }

            return self.get(self.request, *self.args, **self.kwargs)

        send_mails.apply_async(
            kwargs={
                'recipients': form.cleaned_data['recipients'],
                'event': self.request.event.pk,
                'user': self.request.user.pk,
                'subject': form.cleaned_data['subject'].data,
                'message': form.cleaned_data['message'].data,
                'orders': [o.pk for o in orders],
                'items': [i.pk for i in form.cleaned_data.get('items')]
            })
        self.request.event.log_action('pretix.plugins.sendmail.sent',
                                      user=self.request.user,
                                      data=dict(form.cleaned_data))
        messages.success(
            self.request,
            _('Your message has been queued and will be sent to the contact addresses of %d '
              'orders in the next minutes.') % len(orders))

        return redirect('plugins:sendmail:send',
                        event=self.request.event.slug,
                        organizer=self.request.event.organizer.slug)
Exemple #9
0
def test_linkify_abs(link):
    input, output = link
    assert rich_text_snippet(input, safelinks=False) == output
    assert rich_text(input, safelinks=False) == f'<p>{output}</p>'
    assert markdown_compile_email(input) == f'<p>{output}</p>'
Exemple #10
0
    def form_valid(self, form):
        self.output = {}

        recipients = form.cleaned_data.get('recipients')

        if not recipients:
            messages.error(self.request,
                           _('You have not provided any recipients.'))
            return self.get(self.request, *self.args, **self.kwargs)

        # normalize voucher templates in subject and message
        i18n_subject = {}
        i18n_message = {}
        for l in self.request.event.settings.locales:
            with language(l):
                i18n_subject[l] = normalize_voucher_template(
                    str(form.cleaned_data['subject']))
                i18n_message[l] = normalize_voucher_template(
                    str(form.cleaned_data['message']))
        subject = LazyI18nString(i18n_subject)
        message = LazyI18nString(i18n_message)

        # generate preview
        if self.request.POST.get("action") == "preview":
            for l in self.request.event.settings.locales:
                with language(l):
                    try:
                        vouchers = build_voucher_template_dict(
                            self.request.event,
                            str(subject) + str(message))
                    except NoMatchingVoucher:
                        messages.error(
                            self.request,
                            _('There are not enough vouchers to fill the template.'
                              ))
                        return self.get(self.request, *self.args,
                                        **self.kwargs)

                    context_dict = {
                        'event': self.request.event.name,
                        'voucher': vouchers
                    }
                    preview_subject = str(subject).format_map(context_dict)
                    preview_text = markdown_compile_email(
                        str(message).format_map(context_dict))

                    self.output[l] = {
                        'subject':
                        _('Subject: {subject}').format(
                            subject=preview_subject),
                        'html':
                        preview_text,
                    }

            return self.get(self.request, *self.args, **self.kwargs)

        # collect vouchers
        vouchers = {l: [] for l in self.request.event.settings.locales}
        vouchers.update({None: []})
        try:
            with transaction.atomic():
                for r in recipients:
                    if isinstance(r, tuple):
                        locale, email_address = r
                    else:
                        locale = None
                        email_address = r
                    with language(locale):
                        v = build_voucher_template_dict(
                            self.request.event,
                            str(subject) + str(message),
                            how_shared=email_address)
                        vouchers[locale].append(v)
        except NoMatchingVoucher:
            messages.error(
                self.request,
                _('There are not enough vouchers to fill the template.'))
            return self.get(self.request, *self.args, **self.kwargs)

        # send e-mails
        send_mails.apply_async(
            kwargs={
                'recipients': recipients,
                'vouchers': vouchers,
                'event': self.request.event.pk,
                'user': self.request.user.pk,
                'subject': subject.data,
                'message': message.data,
            })
        self.request.event.log_action('pretix_send_vouchers.email.sent',
                                      user=self.request.user,
                                      data=dict(form.cleaned_data))
        messages.success(
            self.request,
            _('Your message has been queued and will be sent to the provided addresses in the next minutes.'
              ))

        return redirect('plugins:pretix_send_vouchers:send',
                        event=self.request.event.slug,
                        organizer=self.request.event.organizer.slug)