2019-12-09 18:07:21 +00:00
|
|
|
"""
|
|
|
|
input validation
|
|
|
|
"""
|
2019-12-11 00:50:28 +00:00
|
|
|
import re
|
2019-12-10 00:33:32 +00:00
|
|
|
import tkinter as tk
|
2020-01-14 19:06:52 +00:00
|
|
|
from typing import TYPE_CHECKING
|
2019-12-10 00:33:32 +00:00
|
|
|
|
2019-12-10 21:23:03 +00:00
|
|
|
import netaddr
|
|
|
|
from netaddr import IPNetwork
|
|
|
|
|
2020-01-14 19:06:52 +00:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
from core.gui.app import Application
|
|
|
|
|
2019-12-10 00:33:32 +00:00
|
|
|
|
2019-12-10 17:57:12 +00:00
|
|
|
class InputValidation:
|
2020-01-14 19:06:52 +00:00
|
|
|
def __init__(self, app: "Application"):
|
2019-12-10 17:57:12 +00:00
|
|
|
self.master = app.master
|
|
|
|
self.positive_int = None
|
|
|
|
self.positive_float = None
|
|
|
|
self.name = None
|
2019-12-11 00:50:28 +00:00
|
|
|
self.ip4 = None
|
2019-12-13 23:52:48 +00:00
|
|
|
self.rgb = None
|
|
|
|
self.hex = None
|
2019-12-10 17:57:12 +00:00
|
|
|
self.register()
|
|
|
|
|
|
|
|
def register(self):
|
|
|
|
self.positive_int = self.master.register(self.check_positive_int)
|
|
|
|
self.positive_float = self.master.register(self.check_positive_float)
|
|
|
|
self.name = self.master.register(self.check_node_name)
|
2019-12-11 00:50:28 +00:00
|
|
|
self.ip4 = self.master.register(self.check_ip4)
|
2019-12-13 23:52:48 +00:00
|
|
|
self.rgb = self.master.register(self.check_rbg)
|
|
|
|
self.hex = self.master.register(self.check_hex)
|
2019-12-10 17:57:12 +00:00
|
|
|
|
2020-01-10 23:32:16 +00:00
|
|
|
def ip_focus_out(self, event: tk.Event):
|
2019-12-10 17:57:12 +00:00
|
|
|
value = event.widget.get()
|
2019-12-10 21:23:03 +00:00
|
|
|
try:
|
|
|
|
IPNetwork(value)
|
|
|
|
except netaddr.core.AddrFormatError:
|
|
|
|
event.widget.delete(0, tk.END)
|
|
|
|
event.widget.insert(tk.END, "invalid")
|
2019-12-10 17:57:12 +00:00
|
|
|
|
2020-01-10 23:32:16 +00:00
|
|
|
def focus_out(self, event: tk.Event, default: str):
|
2019-12-10 17:57:12 +00:00
|
|
|
value = event.widget.get()
|
|
|
|
if value == "":
|
2019-12-10 21:23:03 +00:00
|
|
|
event.widget.insert(tk.END, default)
|
2019-12-10 17:57:12 +00:00
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_positive_int(self, s: str) -> bool:
|
2019-12-10 17:57:12 +00:00
|
|
|
if len(s) == 0:
|
2019-12-10 00:33:32 +00:00
|
|
|
return True
|
2019-12-10 17:57:12 +00:00
|
|
|
try:
|
|
|
|
int_value = int(s)
|
|
|
|
if int_value >= 0:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
except ValueError:
|
|
|
|
return False
|
2019-12-10 00:33:32 +00:00
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_positive_float(self, s: str) -> bool:
|
2019-12-10 17:57:12 +00:00
|
|
|
if len(s) == 0:
|
2019-12-10 00:33:32 +00:00
|
|
|
return True
|
2019-12-10 17:57:12 +00:00
|
|
|
try:
|
|
|
|
float_value = float(s)
|
|
|
|
if float_value >= 0.0:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
except ValueError:
|
2019-12-10 00:33:32 +00:00
|
|
|
return False
|
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_node_name(self, s: str) -> bool:
|
2019-12-10 17:57:12 +00:00
|
|
|
if len(s) < 0:
|
|
|
|
return False
|
|
|
|
if len(s) == 0:
|
2019-12-10 00:33:32 +00:00
|
|
|
return True
|
2019-12-10 17:57:12 +00:00
|
|
|
for char in s:
|
|
|
|
if not char.isalnum() and char != "_":
|
|
|
|
return False
|
2019-12-10 00:33:32 +00:00
|
|
|
return True
|
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_canvas_int(self, s: str) -> bool:
|
2019-12-10 17:57:12 +00:00
|
|
|
if len(s) == 0:
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
int_value = int(s)
|
|
|
|
if int_value >= 0:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
except ValueError:
|
|
|
|
return False
|
2019-12-10 00:33:32 +00:00
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_canvas_float(self, s: str) -> bool:
|
2019-12-10 17:57:12 +00:00
|
|
|
if not s:
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
float_value = float(s)
|
|
|
|
if float_value >= 0.0:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
except ValueError:
|
|
|
|
return False
|
2019-12-11 00:50:28 +00:00
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_ip4(self, s: str) -> bool:
|
2019-12-11 00:50:28 +00:00
|
|
|
if not s:
|
|
|
|
return True
|
|
|
|
pat = re.compile("^([0-9]+[.])*[0-9]*$")
|
|
|
|
if pat.match(s) is not None:
|
|
|
|
_32bits = s.split(".")
|
|
|
|
if len(_32bits) > 4:
|
|
|
|
return False
|
|
|
|
for _8bits in _32bits:
|
2019-12-11 17:17:39 +00:00
|
|
|
if (
|
2019-12-13 23:52:48 +00:00
|
|
|
(_8bits and int(_8bits) > 255)
|
2019-12-11 17:17:39 +00:00
|
|
|
or len(_8bits) > 3
|
|
|
|
or (_8bits.startswith("0") and len(_8bits) > 1)
|
|
|
|
):
|
2019-12-11 00:50:28 +00:00
|
|
|
return False
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
2019-12-13 23:52:48 +00:00
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_rbg(self, s: str) -> bool:
|
2019-12-13 23:52:48 +00:00
|
|
|
if not s:
|
|
|
|
return True
|
|
|
|
if s.startswith("0") and len(s) >= 2:
|
|
|
|
return False
|
|
|
|
try:
|
|
|
|
value = int(s)
|
|
|
|
if 0 <= value <= 255:
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
except ValueError:
|
|
|
|
return False
|
|
|
|
|
2020-01-13 20:03:13 +00:00
|
|
|
def check_hex(self, s: str) -> bool:
|
2019-12-13 23:52:48 +00:00
|
|
|
if not s:
|
|
|
|
return True
|
|
|
|
pat = re.compile("^([#]([0-9]|[a-f])+)$|^[#]$")
|
|
|
|
if pat.match(s):
|
|
|
|
if 0 <= len(s) <= 7:
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
return False
|