Exemplo n.º 1
0
    def build_emails(self):
        result, user_qs = self.query.get_results()
        queryset = result.queryset.order_by('pk')

        if result.queryset.model is get_user_model():
            user_getter = lambda object: object
        else:
            user_getter = lambda object: get_attr_rec(object, result.aliases[
                'user'])

        html_enabled = self.template.html_enabled

        for object in queryset:
            context = {
                alias: get_attr_rec(object, field)
                for alias, field in result.aliases.items()
            }
            context[result.model_name] = object
            user = user_getter(object)
            yield BatchEmail(
                batch=self,
                user=user,
                to=user.email,
                subject=self.template.render(TemplateItem.subject, context),
                body=self.template.render(TemplateItem.plain, context),
                html_body=self.template.render(TemplateItem.html, context)
                if html_enabled else "",
            )
Exemplo n.º 2
0
    def build_emails(self):
        result, qs = self.query.get_results()
        queryset = result.queryset.order_by('pk')

        html_enabled = self.template.html_enabled

        for object in queryset:
            context = {
                alias: get_attr_rec(object, field)
                for alias, field in result.aliases.items()
            }
            context[result.model_name] = object
            email = getattr(object, result.aliases['email'])

            unsubscribe_url = ""
            if self.template.is_marketing and hasattr(object,
                                                      'get_unsubscribe_url'):
                unsubscribe_url = '<{}>'.format(
                    getattr(object, 'get_unsubscribe_url'))

            yield BatchEmail(
                batch=self,
                to=email,
                unsubscribe_url=unsubscribe_url,
                subject=self.template.render(TemplateItem.subject, context),
                body=self.template.render(TemplateItem.plain, context),
                html_body=self.template.render(TemplateItem.html, context)
                if html_enabled else "",
            )
Exemplo n.º 3
0
    def post(self, request, *args, **kwargs):
        # TODO: context from query builder
        data = {}

        if not request.user.has_perm('massmailer.view_query'):
            data['error'] = _(
                "You don't have the permission to view query results."
            )
            return JsonResponse(data)

        html_enabled = request.POST.get('html_enabled') == 'true'

        query = massmailer.models.Query.objects.get(pk=(request.POST['query']))
        page = int(request.POST['page'])

        template = massmailer.models.Template()
        template.subject = request.POST['subject']
        template.plain_body = request.POST['plain']
        template.language = request.POST['language']

        if html_enabled:
            if request.POST.get('use_markdown') == 'true':
                md = markdown.Markdown(extensions=[JinjaEscapeExtension()])
                html = data['html_template'] = md.convert(
                    bleach.clean(template.plain_body)
                )
            else:
                html = request.POST['html']
            template.html_body = html

        results, user_qs = query.get_results()
        qs = results.queryset
        count = qs.count()
        user_count = user_qs.count()
        data['query'] = {
            'count': count,
            'user_count': user_count,
            'page': min(count, page),
        }
        try:
            object = qs[page]
            context = {
                alias: get_attr_rec(object, field)
                for alias, field in results.aliases.items()
            }
            context[results.model_name] = object
            data['render'] = template.full_preview(context)
        except IndexError:
            data['render'] = ''
        return JsonResponse(data)
Exemplo n.º 4
0
    def post(self, request, *args, **kwargs):
        query = request.POST['query']
        page = int(request.POST['page'])
        try:
            # run the query
            result, user_qs = massmailer.models.Query.execute(query)
            qs = result.queryset
            count = qs.count()
            user_count = user_qs.count()
            instance = None
            if 0 <= page < count:
                obj = qs[page]
                instance = {result.model_name: self.serialize(obj)}
                for name, field in result.aliases.items():
                    serialized = self.serialize(get_attr_rec(obj, field))
                    if serialized:
                        instance[name] = serialized

            data = {
                'count': count,
                'user_count': user_count,
                'model': qs.model._meta.label,
                'model_name': result.model_name,
                'aliases': list(result.aliases.items()),
                'query': str(qs.query),
                'result': instance,
            }
        except Exception as e:
            if isinstance(e, (massmailer.query_parser.ParseError, FieldError)):
                error = str(e)
            elif isinstance(e, pyparsing.ParseException):
                error = _("Syntax error at position %(pos)s.") % {'pos': e.loc}
            else:
                error = traceback.format_exc(limit=2)
            data = {'error': error}
        return JsonResponse(data)