use jinja for messages

This commit is contained in:
Clemens Klug 2018-10-17 19:39:49 +02:00
parent 21a046f537
commit 600b11b700
3 changed files with 25 additions and 16 deletions

View File

@ -18,11 +18,11 @@
} }
}, },
"RZ": { "RZ": {
"mail": "fachschaft.wiai@uni-bamberg.de", "mail": "clemens.klug@uni-bamberg.de",
"templates": { "templates": {
"Portsperre": "liebes RZ, Port {port} ist zu. das ist doof :(", "Portsperre": "liebes RZ, Port {{port}} ist zu. das ist doof :(",
"WLAN": "hallo RZ, in Raum {raum} funkt das WLAN {wlan} nicht. das ist doof :(", "WLAN": "hallo RZ, in Raum {{raum}} funkt das WLAN {{wlan}} nicht. das ist doof :(",
"test": "ich bin ein test mit einer zahl: {anzahl}" "test": "ich bin ein test mit einer zahl: {{anzahl}}"
} }
} }
} }

View File

@ -4,9 +4,11 @@ from string import Formatter
from flask import Flask, render_template, request from flask import Flask, render_template, request
from flask_mail import Mail, Message from flask_mail import Mail, Message
from jinja2 import Environment, meta, Template
Placeholder = namedtuple("Placeholder", ["name", "type", "desc", "default"]) Placeholder = namedtuple("Placeholder", ["name", "type", "desc", "default"])
env = Environment()
def load_config(conf="config.json"): def load_config(conf="config.json"):
config = json.load(open(conf)) config = json.load(open(conf))
@ -26,15 +28,17 @@ def load_config(conf="config.json"):
templates = [] templates = []
for issue_name in target["templates"]: for issue_name in target["templates"]:
text = target["templates"][issue_name] text = target["templates"][issue_name]
fields = [name for _, name, _, _ in Formatter().parse(text)] ast = env.parse(text)
fields = list(meta.find_undeclared_variables(ast))
#fields = [name for _, name, _, _ in Formatter().parse(text)]
name = f"{org}: {issue_name}" name = f"{org}: {issue_name}"
value = json.dumps({ value = {
"org": org, "org": org,
"name": issue_name, "name": issue_name,
"mail": config[org]["mail"], "mail": config[org]["mail"],
"text": text, "text": text,
"placeholders": [i._asdict() for i in placeholders if i.name in fields] "placeholders": [i._asdict() for i in placeholders if i.name in fields]
}) }
flat.append({"name": name, "value": value}) flat.append({"name": name, "value": value})
return flat return flat
@ -63,20 +67,25 @@ def send():
if all([field in request.form for field in ("text", "sender", "target")]): if all([field in request.form for field in ("text", "sender", "target")]):
text = request.form["text"] text = request.form["text"]
print("all fields present") print("all fields present")
fields = [name for _, name, _, _ in Formatter().parse(text)] ast = env.parse(text)
fields = list(meta.find_undeclared_variables(ast))
#fields = [name for _, name, _, _ in Formatter().parse(text)]
if None in fields: if None in fields:
fields.remove(None) fields.remove(None)
if all([field in request.form for field in fields]): if all([field in request.form for field in fields]):
values = {field: request.form[field] for field in fields} values = {field: request.form[field] for field in fields}
text = text.format(**values) text = Template(text).render(**values)
sender = request.form["sender"] sender = request.form["sender"]
recipients = [request.form["target"]] recipients = [request.form["target"]]
msg = Message("Störungsmeldung", body=text, sender=sender, recipients=recipients) msg = Message("Störungsmeldung", body=text, sender=sender, recipients=recipients)
print(msg) print(msg)
if not mail.send(msg) is None: result = mail.send(msg)
return "Success!" if result is None:
return f"Success! ({result})"
else:
return f"Fail :( ({result})"
print([(field,field in request.form) for field in fields]) print([(field,field in request.form) for field in fields])
return "2" return "2"
print([(field,field in request.form) for field in ("text", "sender", "target")]) print([(field,field in request.form) for field in ("text", "sender", "target")])
print(request.form) print(request.form)
return "1" return "1"

View File

@ -9,7 +9,7 @@
<option selected disabled="true">---</option> <option selected disabled="true">---</option>
{% for issue in issues %} {% for issue in issues %}
<option value="{{issue.value}}">{{ issue.name }}</option> <option value='{{issue.value|tojson}}'>{{ issue.name }}</option>
{% endfor %} {% endfor %}
</select> </select>
</p> </p>
@ -21,4 +21,4 @@
<div id="placeholders" ></div> <div id="placeholders" ></div>
<input type="submit"> <input type="submit">
</form> </form>
{% endblock %} {% endblock %}