mirror of
https://github.com/dkmstr/openuds.git
synced 2024-12-24 21:34:41 +03:00
Added new admin interface supporting notifiers
This commit is contained in:
parent
d04068e19f
commit
1d62dbbacd
@ -76,7 +76,7 @@ class Notifiers(ModelHandler):
|
||||
raise self.invalidItemException()
|
||||
|
||||
field = self.addDefaultFields(
|
||||
notifier.guiDescription(), ['name', 'comments', 'tags', 'priority', 'networks']
|
||||
notifier.guiDescription(), ['name', 'comments', 'tags']
|
||||
)
|
||||
|
||||
return field
|
||||
|
@ -170,3 +170,21 @@ def validateMacRange(macRange: str) -> str:
|
||||
)
|
||||
|
||||
return macRange
|
||||
|
||||
def validateEmail(email: str) -> str:
|
||||
"""
|
||||
Validates that an email is valid
|
||||
:param email: email to validate
|
||||
:return: Raises Module.Validation exception if is invalid, else return the value "fixed"
|
||||
"""
|
||||
if len(email) > 254:
|
||||
raise Module.ValidationException(
|
||||
_('Email address is too long')
|
||||
)
|
||||
|
||||
if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
|
||||
raise Module.ValidationException(
|
||||
_('Email address is not valid')
|
||||
)
|
||||
|
||||
return email
|
@ -35,8 +35,10 @@ import logging
|
||||
import typing
|
||||
|
||||
from django.utils.translation import gettext_noop as _
|
||||
|
||||
from uds.core.messaging import Notifier
|
||||
from uds.core.ui import gui
|
||||
from uds.core.util import validators
|
||||
|
||||
|
||||
# Not imported at runtime, just for type checking
|
||||
@ -50,11 +52,11 @@ class EmailNotifier(Notifier):
|
||||
Email notifier
|
||||
"""
|
||||
|
||||
typeName = _('OpenStack Platform Provider')
|
||||
typeName = _('Email notifications')
|
||||
# : Type used internally to identify this provider
|
||||
typeType = 'openStackPlatformNew'
|
||||
typeType = 'emailNotifications'
|
||||
# : Description shown at administration interface for this provider
|
||||
typeDescription = _('OpenStack platform service provider')
|
||||
typeDescription = _('Email notifications')
|
||||
# : Icon file used as icon for this provider. This string will be translated
|
||||
# : BEFORE sending it to administration interface, so don't forget to
|
||||
# : mark it as _ (using gettext_noop)
|
||||
@ -69,7 +71,7 @@ class EmailNotifier(Notifier):
|
||||
# but used for sample purposes
|
||||
# If we don't indicate an order, the output order of fields will be
|
||||
# "random"
|
||||
host = gui.TextField(
|
||||
hostname = gui.TextField(
|
||||
length=128,
|
||||
label=_('SMTP Host'),
|
||||
order=1,
|
||||
@ -79,6 +81,7 @@ class EmailNotifier(Notifier):
|
||||
'smtp.gmail.com:587'
|
||||
),
|
||||
required=True,
|
||||
tab=_('SMTP Server'),
|
||||
)
|
||||
|
||||
security = gui.ChoiceField(
|
||||
@ -91,21 +94,25 @@ class EmailNotifier(Notifier):
|
||||
],
|
||||
order=2,
|
||||
required=True,
|
||||
tab=_('SMTP Server'),
|
||||
)
|
||||
username = gui.TextField(
|
||||
length=128,
|
||||
label=_('Username'),
|
||||
order=9,
|
||||
tooltip=_('User with valid privileges on OpenStack'),
|
||||
tooltip=_('User with access to SMTP server'),
|
||||
required=True,
|
||||
defvalue='admin',
|
||||
defvalue='',
|
||||
tab=_('SMTP Server'),
|
||||
)
|
||||
password = gui.PasswordField(
|
||||
lenth=128,
|
||||
label=_('Password'),
|
||||
order=10,
|
||||
tooltip=_('Password of the user of OpenStack'),
|
||||
tooltip=_('Password of the user with access to SMTP server'),
|
||||
required=True,
|
||||
defvalue='',
|
||||
tab=_('SMTP Server'),
|
||||
)
|
||||
|
||||
fromEmail = gui.TextField(
|
||||
@ -114,6 +121,7 @@ class EmailNotifier(Notifier):
|
||||
order=11,
|
||||
tooltip=_('Email address that will be used as sender'),
|
||||
required=True,
|
||||
tab=_('Config'),
|
||||
)
|
||||
|
||||
toEmail = gui.TextField(
|
||||
@ -122,6 +130,7 @@ class EmailNotifier(Notifier):
|
||||
order=12,
|
||||
tooltip=_('Email address that will be used as recipient'),
|
||||
required=True,
|
||||
tab=_('Config'),
|
||||
)
|
||||
|
||||
enableHTML = gui.CheckBoxField(
|
||||
@ -129,11 +138,34 @@ class EmailNotifier(Notifier):
|
||||
order=13,
|
||||
tooltip=_('Enable HTML in emails'),
|
||||
defvalue=True,
|
||||
tab=_('Config'),
|
||||
)
|
||||
|
||||
def initialize(self, values: 'Module.ValuesType' = None):
|
||||
"""
|
||||
We will use the "autosave" feature for form fields
|
||||
"""
|
||||
pass
|
||||
if not values:
|
||||
return
|
||||
|
||||
# check hostname for stmp server si valid and is in the right format
|
||||
# that is a hostname or ip address with optional port
|
||||
# if hostname is not valid, we will raise an exception
|
||||
hostname = self.hostname.cleanStr()
|
||||
if not hostname:
|
||||
raise Notifier.ValidationException(_('Invalid SMTP hostname'))
|
||||
|
||||
# Now check is valid format
|
||||
if ':' in hostname:
|
||||
host, port = validators.validateHostPortPair(hostname)
|
||||
self.hostname.value = '{}:{}'.format(host, port)
|
||||
else:
|
||||
host = self.hostname.cleanStr()
|
||||
self.hostname.value = validators.validateHostname(host, 128, asPattern=False)
|
||||
|
||||
# now check from email and to email
|
||||
self.fromEmail.value = validators.validateEmail(self.fromEmail.value)
|
||||
self.toEmail.value = validators.validateEmail(self.toEmail.value)
|
||||
|
||||
# Done
|
||||
|
||||
|
@ -1,28 +1,3 @@
|
||||
@angular-devkit/build-angular
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2017 Google, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
@angular/animations
|
||||
MIT
|
||||
|
||||
@ -30,7 +5,7 @@ MIT
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2021 Google LLC.
|
||||
Copyright (c) 2022 Google LLC.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -64,7 +39,7 @@ MIT
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2021 Google LLC.
|
||||
Copyright (c) 2022 Google LLC.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -119,7 +94,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
core-js
|
||||
MIT
|
||||
Copyright (c) 2014-2021 Denis Pushkarev
|
||||
Copyright (c) 2014-2022 Denis Pushkarev
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -431,31 +406,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
resize-observer-polyfill
|
||||
MIT
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Denis Rul
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
rxjs
|
||||
Apache-2.0
|
||||
Apache License
|
||||
@ -677,14 +627,11 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
web-animations-js
|
||||
Apache-2.0
|
||||
|
||||
zone.js
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2010-2020 Google LLC. https://angular.io/license
|
||||
Copyright (c) 2010-2022 Google LLC. https://angular.io/license
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
BIN
server/src/uds/static/admin/img/icons/notifiers.png
Normal file
BIN
server/src/uds/static/admin/img/icons/notifiers.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
!function(){"use strict";var e,s={},d={};function r(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return s[e].call(n.exports,n,n.exports,r),n.exports}r.m=s,e=[],r.O=function(t,n,a,f){if(!n){var c=1/0;for(u=0;u<e.length;u++){n=e[u][0],a=e[u][1],f=e[u][2];for(var l=!0,o=0;o<n.length;o++)(!1&f||c>=f)&&Object.keys(r.O).every(function(b){return r.O[b](n[o])})?n.splice(o--,1):(l=!1,f<c&&(c=f));if(l){e.splice(u--,1);var i=a();void 0!==i&&(t=i)}}return t}f=f||0;for(var u=e.length;u>0&&e[u-1][2]>f;u--)e[u]=e[u-1];e[u]=[n,a,f]},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e={666:0};r.O.j=function(a){return 0===e[a]};var t=function(a,f){var o,i,u=f[0],c=f[1],l=f[2],v=0;for(o in c)r.o(c,o)&&(r.m[o]=c[o]);if(l)var _=l(r);for(a&&a(f);v<u.length;v++)r.o(e,i=u[v])&&e[i]&&e[i][0](),e[u[v]]=0;return r.O(_)},n=self.webpackChunkuds_admin=self.webpackChunkuds_admin||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}()}();
|
||||
!function(){"use strict";var e,s={},d={};function r(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return s[e].call(n.exports,n,n.exports,r),n.exports}r.m=s,e=[],r.O=function(t,n,c,f){if(!n){var i=1/0;for(u=0;u<e.length;u++){n=e[u][0],c=e[u][1],f=e[u][2];for(var l=!0,o=0;o<n.length;o++)(!1&f||i>=f)&&Object.keys(r.O).every(function(p){return r.O[p](n[o])})?n.splice(o--,1):(l=!1,f<i&&(i=f));if(l){e.splice(u--,1);var a=c();void 0!==a&&(t=a)}}return t}f=f||0;for(var u=e.length;u>0&&e[u-1][2]>f;u--)e[u]=e[u-1];e[u]=[n,c,f]},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e={666:0};r.O.j=function(c){return 0===e[c]};var t=function(c,f){var o,a,u=f[0],i=f[1],l=f[2],v=0;if(u.some(function(_){return 0!==e[_]})){for(o in i)r.o(i,o)&&(r.m[o]=i[o]);if(l)var b=l(r)}for(c&&c(f);v<u.length;v++)r.o(e,a=u[v])&&e[a]&&e[a][0](),e[a]=0;return r.O(b)},n=self.webpackChunkuds=self.webpackChunkuds||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))}()}();
|
File diff suppressed because one or more lines are too long
@ -111,15 +111,6 @@ gettext("Delete group");
|
||||
gettext("New Authenticator");
|
||||
gettext("Edit Authenticator");
|
||||
gettext("Delete Authenticator");
|
||||
gettext("New Network");
|
||||
gettext("Edit Network");
|
||||
gettext("Delete Network");
|
||||
gettext("New Proxy");
|
||||
gettext("Edit Proxy");
|
||||
gettext("Delete Proxy");
|
||||
gettext("New Transport");
|
||||
gettext("Edit Transport");
|
||||
gettext("Delete Transport");
|
||||
gettext("New OS Manager");
|
||||
gettext("Edit OS Manager");
|
||||
gettext("Delete OS Manager");
|
||||
@ -266,6 +257,15 @@ gettext("Report finished");
|
||||
gettext("dismiss");
|
||||
gettext("Generate report");
|
||||
gettext("Delete tunnel token - USE WITH EXTREME CAUTION!!!");
|
||||
gettext("New Notifier");
|
||||
gettext("Edit Notifier");
|
||||
gettext("Delete actor token - USE WITH EXTREME CAUTION!!!");
|
||||
gettext("New Network");
|
||||
gettext("Edit Network");
|
||||
gettext("Delete Network");
|
||||
gettext("New Transport");
|
||||
gettext("Edit Transport");
|
||||
gettext("Delete Transport");
|
||||
gettext("Error saving: ");
|
||||
gettext("Error saving element");
|
||||
gettext("Error handling your request");
|
||||
@ -311,12 +311,10 @@ gettext("User mode");
|
||||
gettext("Logout");
|
||||
gettext("Summary");
|
||||
gettext("Services");
|
||||
gettext("Networks");
|
||||
gettext("Authenticators");
|
||||
gettext("Os Managers");
|
||||
gettext("Connectivity");
|
||||
gettext("Transports");
|
||||
gettext("Networks");
|
||||
gettext("Proxies");
|
||||
gettext("Pools");
|
||||
gettext("Service pools");
|
||||
gettext("Meta pools");
|
||||
@ -326,6 +324,7 @@ gettext("Accounts");
|
||||
gettext("Tools");
|
||||
gettext("Gallery");
|
||||
gettext("Reports");
|
||||
gettext("Notifiers");
|
||||
gettext("Tokens");
|
||||
gettext("Actor");
|
||||
gettext("Tunnel");
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user