OpenDroneMap-WebODM/coreplugins/tasknotification/plugin.py

114 wiersze
3.9 KiB
Python

from app.plugins import PluginBase, Menu, MountPoint
from app.models import Setting
from django.utils.translation import gettext as _
from django.shortcuts import render
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django import forms
from smtplib import SMTPAuthenticationError, SMTPConnectError, SMTPDataError
from . import email
from . import config
class ConfigurationForm(forms.Form):
notification_app_name = forms.CharField(
label='App name',
max_length=100,
required=True,
)
smtp_to_address = forms.EmailField(
label='Send Notification to Address',
max_length=100,
required=True
)
smtp_from_address = forms.EmailField(
label='From Address',
max_length=100,
required=True
)
smtp_server = forms.CharField(
label='SMTP Server',
max_length=100,
required=True
)
smtp_port = forms.IntegerField(
label='Port',
required=True
)
smtp_username = forms.CharField(
label='Username',
max_length=100,
required=True
)
smtp_password = forms.CharField(
label='Password',
max_length=100,
required=True
)
smtp_use_tls = forms.BooleanField(
label='Use Transport Layer Security (TLS)',
required=False,
)
notify_task_completed = forms.BooleanField(
label='Notify Task Completed',
required=False,
)
notify_task_failed = forms.BooleanField(
label='Notify Task Failed',
required=False,
)
notify_task_removed = forms.BooleanField(
label='Notify Task Removed',
required=False,
)
def test_settings(self, request):
try:
settings = Setting.objects.first()
email.send(f'{self.cleaned_data["notification_app_name"]} - Testing Notification', 'Hi, just testing if notification is working', self.cleaned_data)
messages.success(request, f"Email sent successfully, check your inbox at {self.cleaned_data.get('smtp_to_address')}")
except SMTPAuthenticationError as e:
messages.error(request, 'Invalid SMTP username or password')
except SMTPConnectError as e:
messages.error(request, 'Could not connect to the SMTP server')
except SMTPDataError as e:
messages.error(request, 'Error sending email. Please try again later')
except Exception as e:
messages.error(request, f'An error occured: {e}')
def save_settings(self):
config.save(self.cleaned_data)
class Plugin(PluginBase):
def main_menu(self):
return [Menu(_("Task Notification"), self.public_url(""), "fa fa-envelope fa-fw")]
def include_css_files(self):
return ['style.css']
def app_mount_points(self):
@login_required
def index(request):
if request.method == "POST":
form = ConfigurationForm(request.POST)
test_configuration = request.POST.get("test_configuration")
if form.is_valid() and test_configuration:
form.test_settings(request)
elif form.is_valid() and not test_configuration:
form.save_settings()
messages.success(request, "Notification settings applied successfully!")
else:
config_data = config.load()
# notification_app_name initial value should be whatever is defined in the settings
settings = Setting.objects.first()
config_data['notification_app_name'] = config_data['notification_app_name'] or settings.app_name
form = ConfigurationForm(initial=config_data)
return render(request, self.template_path('index.html'), {'form' : form, 'title' : 'Task Notification'})
return [
MountPoint('$', index),
]