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 "", )
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 "", )
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)
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)