cutelyst 3.9.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
viewemailtemplate.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2015-2022 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#include "viewemailtemplate_p.h"
6
7#include <Cutelyst/Context>
8#include <SimpleMail/emailaddress.h>
9#include <SimpleMail/mimemessage.h>
10#include <SimpleMail/mimetext.h>
11
12#include <QtCore/QLoggingCategory>
13
14Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAILTEMPLATE, "cutelyst.view.emailtemplate", QtWarningMsg)
15
16using namespace Cutelyst;
17
19 : ViewEmail(new ViewEmailTemplatePrivate, parent, name)
20{
22
23 d->defaultContentType = QByteArrayLiteral("text/html");
24}
25
27{
28 Q_D(const ViewEmailTemplate);
29 return d->templatePrefix;
30}
31
33{
35 d->templatePrefix = prefix;
36 Q_EMIT changedProp();
37}
38
40{
41 Q_D(const ViewEmailTemplate);
42 return d->defaultView;
43}
44
46{
48 d->defaultView = view;
49 Q_EMIT changedProp();
50}
51
52MimePart *generatePart(Context *c, const ViewEmailTemplatePrivate *d, const QVariantHash &partHash)
53{
54 const QString defaultView = d->defaultView;
55
56 View *view = nullptr;
57 auto viewIt = partHash.constFind(QStringLiteral("view"));
58 if (viewIt != partHash.constEnd() && !viewIt.value().toString().isEmpty()) {
59 // use the view specified for the email part
60 const QString viewString = viewIt.value().toString();
61 qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
62 << "Using specified view" << viewString << "for rendering.";
63 view = c->view(viewString);
64 } else if (!defaultView.isEmpty()) {
65 // if none specified use the configured default view
66 qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
67 << "Using default view" << defaultView << "for rendering.";
68 view = c->view(defaultView);
69 } else {
70 // else fallback to Cutelysts default view
71 qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Using Cutelysts default view for rendering.";
72 view = c->view(QString());
73 }
74
75 // validate the per template view
76 if (!view) {
77 c->error(QStringLiteral("Could not find a view to render"));
78 return nullptr;
79 }
80
81 QString templateString = partHash.value(QStringLiteral("template")).toString();
82 ;
83 // prefix with template_prefix if configured
84 if (!d->templatePrefix.isEmpty()) {
85 templateString = d->templatePrefix + QLatin1Char('/') + templateString;
86 }
87
88 // render the email part
89 const QVariantHash currentStash = c->stash();
90 c->stash(partHash);
91 c->setStash(QStringLiteral("template"), templateString);
92 QByteArray output = view->render(c);
93 if (c->error()) {
94 qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Errors" << c->errors();
95 }
96 c->stash() = currentStash;
97
98 MimePart *part = new MimePart();
99 part->setContent(output);
100
101 d->setupAttributes(part, partHash);
102
103 return part;
104}
105
107{
108 Q_D(const ViewEmailTemplate);
109
110 QByteArray ret;
111 QVariantHash email = c->stash(d->stashKey).toHash();
112 const QString templateName = email.value(QStringLiteral("template")).toString();
113 const QVariantList templateList = email.value(QStringLiteral("templates")).toList();
114 if (templateName.isEmpty() && templateList.isEmpty()) {
115 ret = ViewEmail::render(c);
116 return ret;
117 }
118
119 QVariantList parts = email.value(QStringLiteral("parts")).toList();
120 if (!templateList.isEmpty() && templateList.first().type() == QVariant::Hash) {
121 // multipart API
122 for (const QVariant &part : templateList) {
123 const QVariantHash partHash = part.toHash();
124 MimePart *partObj = generatePart(c, d, partHash);
125 parts.append(QVariant::fromValue(partObj));
126 }
127
128 } else if (!templateName.isEmpty()) {
129 // single part API
130 QVariantHash partArgs({
131 {QStringLiteral("template"), templateName},
132
133 });
134 auto contentTypeIt = email.constFind(QStringLiteral("content_type"));
135 if (contentTypeIt != email.constEnd() && !contentTypeIt.value().toString().isEmpty()) {
136 partArgs.insert(QStringLiteral("content_type"), contentTypeIt.value().toString());
137 }
138 MimePart *partObj = generatePart(c, d, partArgs);
139 parts.append(QVariant::fromValue(partObj));
140 }
141 email.insert(QStringLiteral("parts"), parts);
142 c->setStash(d->stashKey, email);
143
144 ret = ViewEmail::render(c);
145 return ret;
146}
147
148#include "moc_viewemailtemplate.cpp"
QString name() const
Definition component.cpp:33
The Cutelyst Context.
Definition context.h:39
QStringList errors() const noexcept
Returns a list of errors that were defined.
Definition context.cpp:66
void stash(const QVariantHash &unite)
Definition context.cpp:566
void setStash(const QString &key, const QVariant &value)
Definition context.cpp:217
View * view(const QString &name) const
Definition context.cpp:168
bool error() const noexcept
Returns true if an error was set.
Definition context.cpp:49
void setDefaultView(const QString &view)
virtual QByteArray render(Context *c) const override
ViewEmailTemplate(QObject *parent, const QString &name=QString())
Constructs a new ViewEmailTemplate object with the given parent and name.
void setTemplatePrefix(const QString &prefix)
ViewEmail(QObject *parent, const QString &name=QString())
Constructs a new ViewEmail object with the given parent and name.
Definition viewemail.cpp:22
virtual QByteArray render(Context *c) const override
Cutelyst View abstract view component
Definition view.h:22
virtual QByteArray render(Context *c) const =0
The Cutelyst namespace holds all public Cutelyst API.
Definition Mainpage.dox:8
Q_EMITQ_EMIT
QObject * parent() const const
QString & insert(int position, QChar ch)
bool isEmpty() const const
QVariant fromValue(const T &value)