app-MAIL-temp/app/dashboard/views/support.py

99 lines
3.6 KiB
Python
Raw Normal View History

import json
2022-02-09 12:00:48 +01:00
import urllib.parse
from typing import Union
import requests
from flask import render_template, request, flash, url_for, redirect
from flask_login import login_required, current_user
2022-02-09 12:00:48 +01:00
from werkzeug.datastructures import FileStorage
from app.dashboard.base import dashboard_bp
from app.log import LOG
2022-02-09 12:00:48 +01:00
from app.models import Mailbox
from app.config import ZENDESK_HOST
VALID_MIME_TYPES = ['text/plain', 'message/rfc822']
@dashboard_bp.route("/support", methods=["GET"])
@login_required
def show_support_dialog():
2022-02-09 16:20:55 +01:00
if not ZENDESK_HOST:
return render_template("dashboard/support_disabled.html")
2022-02-09 16:41:04 +01:00
return render_template("dashboard/support.html", ticket_email=current_user.email)
2022-02-09 16:20:55 +01:00
def check_zendesk_response_status(response_code: int) -> bool:
if response_code != 201:
if response_code in (401 or 422):
LOG.debug('Could not authenticate')
else:
LOG.debug('Problem with the request. Status {}'.format(response_code))
return False
return True
2022-02-09 12:00:48 +01:00
2022-02-09 16:41:04 +01:00
def upload_file_to_zendesk_and_get_upload_token(file: FileStorage) -> Union[None, str]:
2022-02-09 12:00:48 +01:00
if file.mimetype not in VALID_MIME_TYPES and not file.mimetype.startswith('image/'):
flash('File {} is not an image, text or an email'.format(file.filename), "warning")
2022-02-09 16:20:55 +01:00
return
2022-02-09 12:00:48 +01:00
escaped_filename = urllib.parse.urlencode({'filename': file.filename})
url = 'https://{}/api/v2/uploads?{}'.format(ZENDESK_HOST, escaped_filename)
headers = {'content-type': file.mimetype}
response = requests.post(url, headers=headers, data=file.stream)
2022-02-09 16:20:55 +01:00
if not check_zendesk_response_status(response.status_code):
return
2022-02-09 12:00:48 +01:00
data = response.json()
return data['upload']['token']
2022-02-09 16:41:04 +01:00
def create_zendesk_request(email: str, content: str, files: [FileStorage]) -> bool:
2022-02-09 12:00:48 +01:00
tokens = []
for file in files:
2022-02-09 16:41:04 +01:00
if not file.filename:
continue
token = upload_file_to_zendesk_and_get_upload_token(file)
2022-02-09 12:00:48 +01:00
if token is None:
return False
tokens.append(token)
data = {
'request': {
'subject': 'Ticket created for user {}'.format(current_user.id),
'comment': {
'type': 'Comment',
2022-02-09 16:41:04 +01:00
'body': content,
2022-02-09 12:00:48 +01:00
'uploads': tokens
},
'requester': {
'name': "SimpleLogin user {}".format(current_user.id),
'email': email
}
}
}
2022-02-09 12:00:48 +01:00
url = 'https://{}/api/v2/requests.json'.format(ZENDESK_HOST)
headers = {'content-type': 'application/json'}
2022-02-09 16:20:55 +01:00
response = requests.post(url, data=json.dumps(data), headers=headers)
if not check_zendesk_response_status(response.status_code):
return False
2022-02-09 12:00:48 +01:00
flash("Ticket was created. You should receive an email notification", "success")
LOG.debug('Ticket created')
return True
@dashboard_bp.route("/support", methods=["POST"])
@login_required
def process_support_dialog():
2022-02-09 16:20:55 +01:00
if not ZENDESK_HOST:
return render_template("dashboard/support_disabled.html")
2022-02-09 16:41:04 +01:00
content = request.form.get("ticket_content") or ""
email = request.form.get("ticket_email") or ""
if not content:
flash("Please add a description", "warning")
2022-02-09 16:41:04 +01:00
return render_template("dashboard/support.html", ticket_email=email)
if not email:
flash("Please add an email", "warning")
2022-02-09 16:41:04 +01:00
return render_template("dashboard/support.html", ticket_content=content)
if create_zendesk_request(email, content, request.files.getlist('ticket_files')):
return render_template("dashboard/support_ticket_created.html", ticket_email=email)
return render_template("dashboard/support.html", ticket_email=email, ticket_content=content)