Sorted things out with validation of NewChanDialog

This commit is contained in:
Dmitri Bogomolov 2020-05-26 13:51:09 +03:00
parent d07ab6dfd3
commit fc6613faa3
Signed by untrusted user: g1itch
GPG Key ID: 720A756F18DEED13
2 changed files with 112 additions and 65 deletions

View File

@ -1,22 +1,32 @@
from PyQt4 import QtGui
"""
The validator for address and passphrase QLineEdits
used in `.dialogs.NewChanDialog`.
"""
from Queue import Empty
from qtpy import QtGui
from addresses import decodeAddress, addBMIfNotPresent
from account import getSortedAccounts
from queues import apiAddressGeneratorReturnQueue, addressGeneratorQueue
from tr import _translate
from utils import str_chan
class AddressPassPhraseValidatorMixin():
def setParams(self, passPhraseObject=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True):
class AddressPassPhraseValidatorMixin(object):
def setParams(
self, passPhraseObject=None, addressObject=None,
feedBackObject=None, button=None, addressMandatory=True
):
self.addressObject = addressObject
self.passPhraseObject = passPhraseObject
self.feedBackObject = feedBackObject
self.buttonBox = buttonBox
self.addressMandatory = addressMandatory
self.isValid = False
# save default text
self.okButtonLabel = self.buttonBox.button(QtGui.QDialogButtonBox.Ok).text()
self.okButton = button
self.okButtonLabel = button.text()
def setError(self, string):
if string is not None and self.feedBackObject is not None:
@ -26,12 +36,14 @@ class AddressPassPhraseValidatorMixin():
self.feedBackObject.setStyleSheet("QLabel { color : red; }")
self.feedBackObject.setText(string)
self.isValid = False
if self.buttonBox:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
if self.okButton:
self.okButton.setEnabled(False)
if string is not None and self.feedBackObject is not None:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(_translate("AddressValidator", "Invalid"))
self.okButton.setText(
_translate("AddressValidator", "Invalid"))
else:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(_translate("AddressValidator", "Validating..."))
self.okButton.setText(
_translate("AddressValidator", "Validating..."))
def setOK(self, string):
if string is not None and self.feedBackObject is not None:
@ -41,9 +53,9 @@ class AddressPassPhraseValidatorMixin():
self.feedBackObject.setStyleSheet("QLabel { }")
self.feedBackObject.setText(string)
self.isValid = True
if self.buttonBox:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True)
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(self.okButtonLabel)
if self.okButton:
self.okButton.setEnabled(True)
self.okButton.setText(self.okButtonLabel)
def checkQueue(self):
gotOne = False
@ -55,7 +67,8 @@ class AddressPassPhraseValidatorMixin():
while True:
try:
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(False)
addressGeneratorReturnValue = \
apiAddressGeneratorReturnQueue.get(False)
except Empty:
if gotOne:
break
@ -65,80 +78,115 @@ class AddressPassPhraseValidatorMixin():
gotOne = True
if len(addressGeneratorReturnValue) == 0:
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
return (QtGui.QValidator.Intermediate, 0)
if addressGeneratorReturnValue[0] == 'chan name does not match address':
self.setError(_translate("AddressValidator", "Although the Bitmessage address you entered was valid, it doesn\'t match the chan name."))
return (QtGui.QValidator.Intermediate, 0)
self.setOK(_translate("MainWindow", "Passphrase and address appear to be valid."))
self.setError(_translate(
"AddressValidator",
"Address already present as one of your identities."
))
return
if addressGeneratorReturnValue[0] == \
'chan name does not match address':
self.setError(_translate(
"AddressValidator",
"Although the Bitmessage address you entered was valid,"
" it doesn\'t match the chan name."
))
return
self.setOK(_translate(
"MainWindow", "Passphrase and address appear to be valid."))
def returnValid(self):
if self.isValid:
return QtGui.QValidator.Acceptable
else:
return QtGui.QValidator.Intermediate
return QtGui.QValidator.Acceptable if self.isValid \
else QtGui.QValidator.Intermediate
def validate(self, s, pos):
if self.addressObject is None:
try:
address = self.addressObject.text().encode('utf-8')
except AttributeError:
address = None
else:
address = str(self.addressObject.text().toUtf8())
if address == "":
address = None
if self.passPhraseObject is None:
try:
passPhrase = self.passPhraseObject.text().encode('utf-8')
except AttributeError:
passPhrase = ""
else:
passPhrase = str(self.passPhraseObject.text().toUtf8())
if passPhrase == "":
passPhrase = None
# no chan name
if passPhrase is None:
self.setError(_translate("AddressValidator", "Chan name/passphrase needed. You didn't enter a chan name."))
return (QtGui.QValidator.Intermediate, pos)
if not passPhrase:
self.setError(_translate(
"AddressValidator",
"Chan name/passphrase needed. You didn't enter a chan name."
))
return (QtGui.QValidator.Intermediate, s, pos)
if self.addressMandatory or address is not None:
if self.addressMandatory or address:
# check if address already exists:
if address in getSortedAccounts():
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
return (QtGui.QValidator.Intermediate, pos)
self.setError(_translate(
"AddressValidator",
"Address already present as one of your identities."
))
return (QtGui.QValidator.Intermediate, s, pos)
status = decodeAddress(address)[0]
# version too high
if decodeAddress(address)[0] == 'versiontoohigh':
self.setError(_translate("AddressValidator", "Address too new. Although that Bitmessage address might be valid, its version number is too new for us to handle. Perhaps you need to upgrade Bitmessage."))
return (QtGui.QValidator.Intermediate, pos)
if status == 'versiontoohigh':
self.setError(_translate(
"AddressValidator",
"Address too new. Although that Bitmessage address"
" might be valid, its version number is too new"
" for us to handle. Perhaps you need to upgrade"
" Bitmessage."
))
return (QtGui.QValidator.Intermediate, s, pos)
# invalid
if decodeAddress(address)[0] != 'success':
self.setError(_translate("AddressValidator", "The Bitmessage address is not valid."))
return (QtGui.QValidator.Intermediate, pos)
if status != 'success':
self.setError(_translate(
"AddressValidator",
"The Bitmessage address is not valid."
))
return (QtGui.QValidator.Intermediate, s, pos)
# this just disables the OK button without changing the feedback text
# but only if triggered by textEdited, not by clicking the Ok button
if not self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
if not self.okButton.hasFocus():
self.setError(None)
# check through generator
if address is None:
addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + str(passPhrase), passPhrase, False))
if not address:
addressGeneratorQueue.put((
'createChan', 4, 1,
str_chan + ' ' + passPhrase, passPhrase, False
))
else:
addressGeneratorQueue.put(('joinChan', addBMIfNotPresent(address), str_chan + ' ' + str(passPhrase), passPhrase, False))
addressGeneratorQueue.put((
'joinChan', addBMIfNotPresent(address),
str_chan + ' ' + passPhrase, passPhrase, False
))
if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
return (self.returnValid(), pos)
if self.okButton.hasFocus():
return (self.returnValid(), s, pos)
else:
return (QtGui.QValidator.Intermediate, pos)
return (QtGui.QValidator.Intermediate, s, pos)
def checkData(self):
return self.validate("", 0)
return self.validate(u"", 0)
class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True):
def __init__(
self, parent=None, passPhraseObject=None, feedBackObject=None,
button=None, addressMandatory=True
):
super(AddressValidator, self).__init__(parent)
self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory)
self.setParams(
passPhraseObject, parent, feedBackObject, button,
addressMandatory)
class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False):
def __init__(
self, parent=None, addressObject=None, feedBackObject=None,
button=None, addressMandatory=False
):
super(PassPhraseValidator, self).__init__(parent)
self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory)
self.setParams(
parent, addressObject, feedBackObject, button,
addressMandatory)

View File

@ -21,10 +21,10 @@ class NewChanDialog(QtWidgets.QDialog):
self.parent = parent
self.chanAddress.setValidator(AddressValidator(
self.chanAddress, self.chanPassPhrase, self.validatorFeedback,
self.buttonBox, False))
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
self.chanPassPhrase.setValidator(PassPhraseValidator(
self.chanPassPhrase, self.chanAddress, self.validatorFeedback,
self.buttonBox, False))
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.delayedUpdateStatus)
@ -41,17 +41,16 @@ class NewChanDialog(QtWidgets.QDialog):
self.timer.stop()
self.hide()
apiAddressGeneratorReturnQueue.queue.clear()
passPhrase = self.chanPassPhrase.text().encode('utf-8')
if self.chanAddress.text() == "":
addressGeneratorQueue.put((
'createChan', 4, 1,
str_chan + ' ' + str(self.chanPassPhrase.text()),
self.chanPassPhrase.text(), True
str_chan + ' ' + passPhrase, passPhrase, True
))
else:
addressGeneratorQueue.put((
'joinChan', addBMIfNotPresent(self.chanAddress.text()),
str_chan + ' ' + str(self.chanPassPhrase.text()),
self.chanPassPhrase.text(), True
str_chan + ' ' + passPhrase, passPhrase, True
))
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True)
if (len(addressGeneratorReturnValue) > 0
@ -62,7 +61,7 @@ class NewChanDialog(QtWidgets.QDialog):
_translate(
"newchandialog",
"Successfully created / joined chan {0}"
).format(self.chanPassPhrase.text())
).format(passPhrase)
))
self.parent.ui.tabWidget.setCurrentIndex(
self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)