processor settings sor
This commit is contained in:
parent
ee5db19d8e
commit
fb89f1946b
335
main.py
335
main.py
@ -3,8 +3,10 @@ import time
|
|||||||
from PythonQt.QtCore import QFile, QSettings
|
from PythonQt.QtCore import QFile, QSettings
|
||||||
from PythonQt.QtGui import QDesktopServices, QMessageBox
|
from PythonQt.QtGui import QDesktopServices, QMessageBox
|
||||||
from PythonQt.QtUiTools import QUiLoader
|
from PythonQt.QtUiTools import QUiLoader
|
||||||
|
from multiprocessing import Pool,Process
|
||||||
|
|
||||||
from seafapi import *
|
from seafapi import *
|
||||||
|
from processors import DefaultProcessor, EncryptedProcessor
|
||||||
###############################
|
###############################
|
||||||
## This is a temporary fix, should be removed when a newer python version is used ##
|
## This is a temporary fix, should be removed when a newer python version is used ##
|
||||||
import logging
|
import logging
|
||||||
@ -12,180 +14,193 @@ logging.captureWarnings(True)
|
|||||||
###############################
|
###############################
|
||||||
|
|
||||||
class SeafileUploader():
|
class SeafileUploader():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.uil = QUiLoader()
|
self.uil = QUiLoader()
|
||||||
self.loadSettings()
|
self.loadSettings()
|
||||||
self.seaf_lib = None
|
self.seaf_lib = None
|
||||||
self.libs = None
|
self.libs = None
|
||||||
|
self.pool = Pool(2)
|
||||||
|
self.processor = None
|
||||||
|
|
||||||
def showSettingsUI(self, parentWidget):
|
def showSettingsUI(self, parentWidget):
|
||||||
self.parentWidget = parentWidget
|
self.parentWidget = parentWidget
|
||||||
self.settingsDialog = self.uil.load(QFile(workingDir + "/settings.ui"), parentWidget)
|
self.settingsDialog = self.uil.load(QFile(workingDir + "/settings.ui"), parentWidget)
|
||||||
self.settingsDialog.group_account.widget_loggedIn.loginButton.connect("clicked()", self.startAuthenticationProcess)
|
self.settingsDialog.group_account.widget_loggedIn.loginButton.connect("clicked()", self.startAuthenticationProcess)
|
||||||
#self.settingsDialog.group_name.input_name.connect("textChanged(QString)", self.nameFormatEdited)
|
#self.settingsDialog.group_name.input_name.connect("textChanged(QString)", self.nameFormatEdited)
|
||||||
self.settingsDialog.group_location.widget_location.pathEdit.connect("textChanged(QString)", self.locationUpdate)
|
self.settingsDialog.group_location.widget_location.pathEdit.connect("textChanged(QString)", self.locationUpdate)
|
||||||
self.settingsDialog.group_location.widget_location.libraryEditDrop.connect("currentIndexChanged(QString)", self.locationUpdate)
|
self.settingsDialog.group_location.widget_location.libraryEditDrop.connect("currentIndexChanged(QString)", self.locationUpdate)
|
||||||
self.settingsDialog.connect("accepted()", self.saveSettings)
|
self.settingsDialog.connect("accepted()", self.saveSettings)
|
||||||
|
|
||||||
self.loadSettings()
|
self.loadSettings()
|
||||||
self.updateUi()
|
self.updateUi()
|
||||||
self.settingsDialog.open()
|
self.settingsDialog.open()
|
||||||
|
|
||||||
def populateLibrarySelector(self):
|
def populateLibrarySelector(self):
|
||||||
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
|
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
|
||||||
drop.clear()
|
drop.clear()
|
||||||
drop.setEnabled(False)
|
drop.setEnabled(False)
|
||||||
if self.isConfigured():
|
if self.isConfigured():
|
||||||
self.libs = (self.seaf_client or self.seaf_lib.client).libraries()
|
self.libs = (self.seaf_client or self.seaf_lib.client).libraries()
|
||||||
i=0
|
i=0
|
||||||
select = 0
|
select = 0
|
||||||
for lib in self.libs:
|
for lib in self.libs:
|
||||||
print "%s %s <-> %s%s" % (lib.name,lib.id,self.seaf_lib.name,self.seaf_lib.id)
|
if self.seaf_lib is not None and lib.id == self.seaf_lib.id:
|
||||||
if self.seaf_lib is not None and lib.id == self.seaf_lib.id:
|
select = i
|
||||||
select = i
|
print "set %s" % lib.name
|
||||||
print "set %s" % lib.name
|
drop.addItem(lib.name)
|
||||||
drop.addItem(lib.name)
|
i=i+1
|
||||||
i=i+1
|
drop.setCurrentIndex(select)
|
||||||
drop.setCurrentIndex(select)
|
drop.setEnabled(True)
|
||||||
drop.setEnabled(True)
|
|
||||||
|
|
||||||
def updateUi(self):
|
def updateUi(self):
|
||||||
self.settingsDialog.group_account.widget_loggedIn.usernameEdit.setText(self.access_token.username if not (self.access_token is None) else "")
|
self.settingsDialog.group_account.widget_loggedIn.usernameEdit.setText(self.access_token.username if not (self.access_token is None) else "")
|
||||||
self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.setText(self.seaf_url or "https://seaf.shimun.net")
|
self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.setText(self.seaf_url or "https://seaf.shimun.net")
|
||||||
self.settingsDialog.group_account.widget_loggedIn.loginButton.setText("Logout" if self.access_token is not None else "Login")
|
self.settingsDialog.group_account.widget_loggedIn.loginButton.setText("Logout" if self.access_token is not None else "Login")
|
||||||
#
|
#
|
||||||
if self.access_token is None and len(self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text) > 0:
|
if self.access_token is None and len(self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text) > 0:
|
||||||
self.settingsDialog.group_account.widget_loggedIn.passwordEdit.setText("X" * 8)
|
self.settingsDialog.group_account.widget_loggedIn.passwordEdit.setText("X" * 8)
|
||||||
for elm in [self.settingsDialog.group_account.widget_loggedIn.usernameEdit, self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit, self.settingsDialog.group_account.widget_loggedIn.passwordEdit]:
|
for elm in [self.settingsDialog.group_account.widget_loggedIn.usernameEdit, self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit, self.settingsDialog.group_account.widget_loggedIn.passwordEdit]:
|
||||||
elm.setEnabled(self.access_token is None)
|
elm.setEnabled(self.access_token is None)
|
||||||
self.settingsDialog.group_location.setEnabled(self.access_token is not None)
|
self.settingsDialog.group_location.setEnabled(self.access_token is not None)
|
||||||
self.settingsDialog.group_location.widget_location.pathEdit.setText(self.lib_path or "/")
|
self.settingsDialog.group_location.widget_location.pathEdit.setText(self.lib_path or "/")
|
||||||
self.settingsDialog.linkCopyCheck.setChecked(self.copyLink)
|
self.settingsDialog.linkCopyCheck.setChecked(self.copyLink)
|
||||||
self.populateLibrarySelector()
|
self.populateLibrarySelector()
|
||||||
self.settingsDialog.adjustSize()
|
self.settingsDialog.adjustSize()
|
||||||
|
|
||||||
def loadSettings(self):
|
def loadSettings(self):
|
||||||
settings = QSettings()
|
settings = QSettings()
|
||||||
settings.beginGroup("uploaders")
|
settings.beginGroup("uploaders")
|
||||||
settings.beginGroup("seafile")
|
settings.beginGroup("seafile")
|
||||||
self.seaf_url = settings.value("seafile-url", "")
|
self.seaf_url = settings.value("seafile-url", "")
|
||||||
(self.lib_id,self.lib_name) = str(settings.value("library", "/")).split("/")
|
(self.lib_id,self.lib_name) = str(settings.value("library", "/")).split("/")
|
||||||
self.lib_path = settings.value("library-path", "")
|
self.lib_path = settings.value("library-path", "")
|
||||||
self.copyLink = settings.value("copy-link", "true") in ['true', True]
|
self.copyLink = settings.value("copy-link", "true") in ['true', True]
|
||||||
if settings.value("auth-token", False) and settings.value("auth-username", False):
|
if settings.value("auth-token", False) and settings.value("auth-username", False):
|
||||||
self.access_token = SeafileToken(settings.value("auth-username", False),settings.value("auth-token", False))
|
self.access_token = SeafileToken(settings.value("auth-username", False),settings.value("auth-token", False))
|
||||||
else:
|
else:
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
self.nameFormat = settings.value("name-format", "Screenshot at %H:%M:%S")
|
self.nameFormat = settings.value("name-format", "Screenshot %Y-%m-%d %H_%M_%S")
|
||||||
settings.endGroup()
|
self.upload_scheme = settings.value("upload-scheme", "regular")
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
if self.isConfigured():
|
settings.endGroup()
|
||||||
self.seaf_client = SeafileClient(self.seaf_url,self.access_token.username,token=self.access_token)
|
if self.isConfigured():
|
||||||
for lib in self.seaf_client.libraries():
|
self.seaf_client = SeafileClient(self.seaf_url,self.access_token.username,token=self.access_token)
|
||||||
if lib.id == self.lib_id:
|
for lib in self.seaf_client.libraries():
|
||||||
self.seaf_lib = lib
|
if lib.id == self.lib_id:
|
||||||
|
self.seaf_lib = lib
|
||||||
|
|
||||||
def saveSettings(self):
|
self.processor = EncryptedProcessor(self.seaf_lib,self.lib_path)#DefaultProcessor(self.seaf_lib,self.lib_path)
|
||||||
settings = QSettings()
|
|
||||||
settings.beginGroup("uploaders")
|
|
||||||
settings.beginGroup("seafile")
|
|
||||||
self.copyLink = self.settingsDialog.linkCopyCheck.checked
|
|
||||||
settings.setValue("copy-link", self.copyLink)
|
|
||||||
if self.access_token is not None:
|
|
||||||
settings.setValue("auth-username", self.access_token.username )
|
|
||||||
settings.setValue("auth-token", self.access_token.token)
|
|
||||||
settings.setValue("seafile-url", self.seaf_url)
|
|
||||||
if self.seaf_lib is not None:
|
|
||||||
settings.setValue("library", "%s/%s" % (self.seaf_lib.id,self.seaf_lib.name))
|
|
||||||
settings.setValue("library-path", self.lib_path)
|
|
||||||
#settings.setValue("name-format", self.settingsDialog.group_name.input_name.text)
|
|
||||||
print self.seaf_lib, self.lib_path
|
|
||||||
settings.endGroup()
|
|
||||||
settings.endGroup()
|
|
||||||
|
|
||||||
def isConfigured(self):
|
def saveSettings(self):
|
||||||
return self.access_token and self.seaf_url
|
settings = QSettings()
|
||||||
|
settings.beginGroup("uploaders")
|
||||||
|
settings.beginGroup("seafile")
|
||||||
|
try:
|
||||||
|
self.copyLink = self.settingsDialog.linkCopyCheck.checked
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
settings.setValue("copy-link", self.copyLink)
|
||||||
|
if self.access_token is not None:
|
||||||
|
settings.setValue("auth-username", self.access_token.username )
|
||||||
|
settings.setValue("auth-token", self.access_token.token)
|
||||||
|
settings.setValue("seafile-url", self.seaf_url)
|
||||||
|
if self.seaf_lib is not None:
|
||||||
|
settings.setValue("library", "%s/%s" % (self.seaf_lib.id,self.seaf_lib.name))
|
||||||
|
settings.setValue("library-path", self.lib_path)
|
||||||
|
settings.setValue("name-format", self.nameFormat)
|
||||||
|
settings.setValue("upload-scheme", self.upload_scheme)
|
||||||
|
#settings.setValue("name-format", self.settingsDialog.group_name.input_name.text)
|
||||||
|
print self.seaf_lib, self.lib_path
|
||||||
|
settings.endGroup()
|
||||||
|
settings.endGroup()
|
||||||
|
|
||||||
def getFilename(self):
|
def isConfigured(self):
|
||||||
self.loadSettings()
|
return self.access_token and self.seaf_url and self.processor.is_configured()
|
||||||
return ScreenCloud.formatFilename(self.nameFormat)
|
|
||||||
|
|
||||||
def upload(self, screenshot, name):
|
def getFilename(self):
|
||||||
self.loadSettings()
|
self.loadSettings()
|
||||||
#Make sure we have a up to date token
|
return ScreenCloud.formatFilename(self.nameFormat)
|
||||||
if not self.seaf_lib:
|
|
||||||
ScreenCloud.setError("Not configured properly")
|
|
||||||
return False
|
|
||||||
#Save to a temporary file
|
|
||||||
timestamp = time.time()
|
|
||||||
try:
|
|
||||||
tmpFilename = QDesktopServices.storageLocation(QDesktopServices.TempLocation) + "/" + ScreenCloud.formatFilename(str(timestamp))
|
|
||||||
except AttributeError:
|
|
||||||
from PythonQt.QtCore import QStandardPaths #fix for Qt5
|
|
||||||
tmpFilename = QStandardPaths.writableLocation(QStandardPaths.TempLocation) + "/" + ScreenCloud.formatFilename(str(timestamp))
|
|
||||||
screenshot.save(QFile(tmpFilename), ScreenCloud.getScreenshotFormat())
|
|
||||||
#Upload!
|
|
||||||
link=None
|
|
||||||
try:
|
|
||||||
file = self.seaf_lib.upload(tmpFilename,self.getFilename(),self.lib_path)
|
|
||||||
link = file.share()
|
|
||||||
except Exception as e:
|
|
||||||
ScreenCloud.setError("Failed to upload to seafile. " + e.message)
|
|
||||||
return False
|
|
||||||
if self.copyLink:
|
|
||||||
ScreenCloud.setUrl(link)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def startAuthenticationProcess(self):
|
def upload(self, screenshot, name):
|
||||||
self.saveSettings()
|
self.loadSettings()
|
||||||
self.loadSettings()
|
#Make sure we have a up to date token
|
||||||
|
if not self.seaf_lib:
|
||||||
|
ScreenCloud.setError("Not configured properly")
|
||||||
|
return False
|
||||||
|
#Save to a temporary file
|
||||||
|
timestamp = time.time()
|
||||||
|
def tempfile(name):
|
||||||
|
try:
|
||||||
|
return QDesktopServices.storageLocation(QDesktopServices.TempLocation) + "/" + name
|
||||||
|
except AttributeError:
|
||||||
|
from PythonQt.QtCore import QStandardPaths #fix for Qt5
|
||||||
|
return QStandardPaths.writableLocation(QStandardPaths.TempLocation) + "/" + name
|
||||||
|
|
||||||
if self.access_token is not None:
|
tmpFilename = tempfile(ScreenCloud.formatFilename(str(timestamp)))
|
||||||
self.logOut()
|
screenshot.save(QFile(tmpFilename), ScreenCloud.getScreenshotFormat())
|
||||||
return
|
#Upload!
|
||||||
|
link=None
|
||||||
|
if True:
|
||||||
|
#try:
|
||||||
|
link = self.processor.upload(tmpFilename,self.getFilename())
|
||||||
|
if self.copyLink:
|
||||||
|
ScreenCloud.setUrl(link)
|
||||||
|
#except Exception as e:
|
||||||
|
# ScreenCloud.setError("Failed to upload to seafile. " + e.message)
|
||||||
|
# return False
|
||||||
|
return True
|
||||||
|
|
||||||
if self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text \
|
def startAuthenticationProcess(self):
|
||||||
and self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text \
|
self.saveSettings()
|
||||||
and self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text:
|
self.loadSettings()
|
||||||
self.seaf_url = self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text
|
|
||||||
if True:
|
|
||||||
#try:
|
|
||||||
self.login(self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text,self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text)
|
|
||||||
self.saveSettings()
|
|
||||||
self.loadSettings()
|
|
||||||
self.populateLibrarySelector()
|
|
||||||
#except Exception as e:
|
|
||||||
#QMessageBox.critical(self.settingsDialog, "Failed to login", "Verify your server url and credentials" + e.message)
|
|
||||||
self.saveSettings()
|
|
||||||
self.updateUi()
|
|
||||||
|
|
||||||
def locationUpdate(self):
|
if self.access_token is not None:
|
||||||
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
|
self.logOut()
|
||||||
selected_lib = drop.currentText
|
return
|
||||||
if not drop.isEnabled(): return #not populated
|
|
||||||
self.lib_path = self.settingsDialog.group_location.widget_location.pathEdit.text
|
if self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text \
|
||||||
print self.lib_path, selected_lib
|
and self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text \
|
||||||
if self.libs is None: return
|
and self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text:
|
||||||
for lib in self.libs:
|
self.seaf_url = self.settingsDialog.group_account.widget_loggedIn.serverUrlEdit.text
|
||||||
if lib.name == selected_lib:
|
if True:
|
||||||
self.seaf_lib = lib
|
#try:
|
||||||
print "%s user selected" % selected_lib
|
self.login(self.settingsDialog.group_account.widget_loggedIn.usernameEdit.text,self.settingsDialog.group_account.widget_loggedIn.passwordEdit.text)
|
||||||
|
self.saveSettings()
|
||||||
|
self.loadSettings()
|
||||||
|
self.populateLibrarySelector()
|
||||||
|
#except Exception as e:
|
||||||
|
#QMessageBox.critical(self.settingsDialog, "Failed to login", "Verify your server url and credentials" + e.message)
|
||||||
|
self.saveSettings()
|
||||||
|
self.updateUi()
|
||||||
|
|
||||||
|
def locationUpdate(self):
|
||||||
|
drop = self.settingsDialog.group_location.widget_location.libraryEditDrop
|
||||||
|
selected_lib = drop.currentText
|
||||||
|
if not drop.isEnabled(): return #not populated
|
||||||
|
self.lib_path = self.settingsDialog.group_location.widget_location.pathEdit.text
|
||||||
|
print self.lib_path, selected_lib
|
||||||
|
if self.libs is None: return
|
||||||
|
for lib in self.libs:
|
||||||
|
if lib.name == selected_lib:
|
||||||
|
self.seaf_lib = lib
|
||||||
|
print "%s user selected" % selected_lib
|
||||||
|
|
||||||
|
|
||||||
def login(self,user,password):
|
def login(self,user,password):
|
||||||
cli = SeafileClient(self.seaf_url,user,password)
|
cli = SeafileClient(self.seaf_url,user,password)
|
||||||
self.access_token = cli.obtain_token()
|
self.access_token = cli.obtain_token()
|
||||||
|
|
||||||
def logOut(self):
|
def logOut(self):
|
||||||
settings = QSettings()
|
settings = QSettings()
|
||||||
settings.beginGroup("uploaders")
|
settings.beginGroup("uploaders")
|
||||||
settings.beginGroup("seafile")
|
settings.beginGroup("seafile")
|
||||||
settings.remove("auth-token")
|
settings.remove("auth-token")
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
self.loadSettings()
|
self.loadSettings()
|
||||||
self.updateUi()
|
self.updateUi()
|
||||||
|
|
||||||
|
def nameFormatEdited(self, nameFormat):
|
||||||
|
self.settingsDialog.group_name.label_example.setText(ScreenCloud.formatFilename(nameFormat, False))
|
||||||
|
|
||||||
def nameFormatEdited(self, nameFormat):
|
|
||||||
self.settingsDialog.group_name.label_example.setText(ScreenCloud.formatFilename(nameFormat, False))
|
|
||||||
|
86
modules/processors.py
Normal file
86
modules/processors.py
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
|
from encryptedscreenshot import EncryptedScreenshot, Signer
|
||||||
|
import getpass, os
|
||||||
|
from PythonQt.QtGui import QInputDialog
|
||||||
|
from PythonQt.QtCore import QSettings
|
||||||
|
from seafapi import *
|
||||||
|
|
||||||
|
class Processor:
|
||||||
|
|
||||||
|
def configure(self,parent):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def is_configured(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def upload(self,file):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class DefaultProcessor(Processor):
|
||||||
|
|
||||||
|
def __init__(self,seaf_lib,lib_path):
|
||||||
|
self.seaf_lib = seaf_lib
|
||||||
|
self.lib_path = lib_path
|
||||||
|
|
||||||
|
def upload(self,file,name):
|
||||||
|
return self.seaf_lib.upload(file,name,self.lib_path).share()
|
||||||
|
|
||||||
|
class EncryptedProcessor(Processor):
|
||||||
|
|
||||||
|
def __init__(self,seaf_lib,lib_path):
|
||||||
|
self.seaf_lib = seaf_lib
|
||||||
|
self.lib_path = lib_path
|
||||||
|
self.load_settings()
|
||||||
|
self.host = ""
|
||||||
|
|
||||||
|
def load_settings(self):
|
||||||
|
settings = QSettings()
|
||||||
|
settings.beginGroup("uploaders")
|
||||||
|
settings.beginGroup("seafile")
|
||||||
|
settings.beginGroup("encscreen")
|
||||||
|
self.host = settings.value("url", "")
|
||||||
|
settings.endGroup()
|
||||||
|
settings.endGroup()
|
||||||
|
settings.endGroup()
|
||||||
|
|
||||||
|
def save_settings(self):
|
||||||
|
settings = QSettings()
|
||||||
|
settings.beginGroup("uploaders")
|
||||||
|
settings.beginGroup("seafile")
|
||||||
|
settings.beginGroup("encscreen")
|
||||||
|
settings.setValue("url", self.host)
|
||||||
|
settings.endGroup()
|
||||||
|
settings.endGroup()
|
||||||
|
settings.endGroup()
|
||||||
|
|
||||||
|
def is_configured(self):
|
||||||
|
return self.host is not None and self.host != ""
|
||||||
|
|
||||||
|
def configure(self,parent):
|
||||||
|
self.host = QInputDialog.getText(parent, 'Encscreen Server Setup', 'Enter server url (ex. https://servertld/s#%id%key):', text="https://screens.shimun.net/s#%id%key")
|
||||||
|
self.save_settings()
|
||||||
|
|
||||||
|
def upload(self,file,name):
|
||||||
|
enrypted = EncryptedScreenshot({
|
||||||
|
"owner": unicode(getpass.getuser()),
|
||||||
|
"format": unicode(str(file).split('.')[-1]),
|
||||||
|
"title": unicode(name),
|
||||||
|
"timestamp": int(time.time() * 1000),
|
||||||
|
"size": os.stat(file).st_size
|
||||||
|
},signer=Signer.default())
|
||||||
|
tmpHandle = open(file + "c", 'wb')
|
||||||
|
tmpHandle.write(enrypted.assemble(file))
|
||||||
|
tmpHandle.close()
|
||||||
|
seaf_file = self.seaf_lib.upload(file + "c",name + ".enc",self.lib_path)
|
||||||
|
if not seaf_file:
|
||||||
|
return
|
||||||
|
seaf_link = seaf_file.share()
|
||||||
|
if seaf_link:
|
||||||
|
id = str(seaf_link).split('/')[-2]
|
||||||
|
return self.host.replace('%id', id).replace('%key',"%s" % enrypted.password)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user