def initiateFileUpload(self, filePath): self.queue = Queue() self.waitDialog = StickyDialog(self.root, message="Please wait, uploading...") fileUploadThread = UploadFile(self.queue, filePath) fileUploadThread.start() self.master.after(100, self.checkQueueForUploadStatus)
def downloadFile(self): print("Download") self.dqueue = Queue() self.remove() self.waitDialog = StickyDialog(self, message="Downloading! Please wait...") userFileDownloadThread = DownloadFile(queue=self.dqueue, owner=self.fileDetails[0], name=self.fileDetails[1]) userFileDownloadThread.start() self.checkDownloadQueue()
def saveUserInfoInitiator(self): self.waitDialog = StickyDialog(self.root, message="Initializing...\nPlease wait!") self.user = User(userId=self.loginResponse.uid, name=self.loginResponse.name, email=self.emailStr) self.queue = Queue() saveUserInfoThread = SaveUserLoginInfo( self.queue, user=self.user, accJwt=self.loginResponse.accessToken, refJwt=self.loginResponse.refreshToken) saveUserInfoThread.start() self.root.after(100, self.checkQueueForDb)
def loginInitiator(self): self.emailStr = self.email.get() self.passwordStr = self.password.get() if not validateEmail(self.emailStr): GenericDialog(self.root, title="Validation Error", message="Invalid Email Address!") elif self.passwordStr == "" or len(self.passwordStr) < 8: GenericDialog(self.root, title="Validation Error", message="Password must be 8 characters long!") else: self.waitDialog = StickyDialog(self.root, message="Please wait!") userLoginThread = UserLogin(self.queue, email=self.emailStr, password=self.passwordStr) userLoginThread.start() self.root.after(100, self.checkQueueForLogin)
def grantAccess(self): print("granting") toEmail = self.emailEntry.get() self.remove() if validateEmail(email=toEmail): self.waitDialog = StickyDialog(self, message="Granting! Please wait...") updateAclGrantThread = UpdateFileACL(queue=self.queue, owner=self.fileDetails[0], name=self.fileDetails[1], grant=True, toEmail=toEmail) updateAclGrantThread.start() self.checkACLUpdateQueue() else: GenericDialog(self, title="Error!", message="Invalid Email Address!")
def signUpInitiator(self): name = self.username.get() email = self.email.get() password = self.password.get() confPassword = self.confirmPassword.get() if name == "" or not validateUsername(name) or len(name) > 32: GenericDialog( self.root, title="Validation Error", message= "Invalid name!\nContains only alphabets.\nMax length: 32.") elif not validateEmail(email): GenericDialog(self.root, title="Validation Error", message="Invalid Email Address!") elif password != confPassword: GenericDialog(self.root, title="Validation Error", message="Passwords do not match!") elif password == confPassword and len(password) < 8: GenericDialog(self.root, title="Validation Error", message="Password minimum length: 8") elif password == confPassword and len(password) > 64: GenericDialog(self.root, title="Validation Error", message="Password maximum length: 64") else: # initiate sign up self.waitDialog = StickyDialog(self.root, message="Please wait!") userSignUpThread = UserSignUp(queue=self.queue, username=name, email=email, password=password) userSignUpThread.start() self.root.after(100, self.checkQueue)
class SharedWithMeFilesOptionsDialog(tk.Toplevel): def __init__(self, master: tk.Frame, masterParent: tk.Tk, fileDetails: tuple): super().__init__(master) self.root = master self.fileDetails = fileDetails self.masterParent = masterParent self.dqueue = Queue() self.downloadResponse = None self.title(fileDetails[1]) self.resizable(False, False) self.grab_set() self.overrideredirect(True) centerWindow(self, 300, 100) tk.Label(self, text="Download").pack(expand=True) tk.Button(self, text="Download", command=self.downloadFile).pack(expand=True) tk.Button(self, text="Cancel", command=self.remove).pack(expand=True) def remove(self): self.grab_release() self.withdraw() def signOut(self): print("signout called") result = RemoveUserLoginInfo().remove() if result: self.root.destroy() loginScreen.LoginScreen(self.masterParent) else: GenericDialog( self.root, title="Database Error!", message="Unable to remove login info!\nProgram will exit now.") def downloadFile(self): print("Download") self.dqueue = Queue() self.remove() self.waitDialog = StickyDialog(self, message="Downloading! Please wait...") userFileDownloadThread = DownloadFile(queue=self.dqueue, owner=self.fileDetails[0], name=self.fileDetails[1]) userFileDownloadThread.start() self.checkDownloadQueue() def checkDownloadQueue(self): if not self.dqueue.empty(): self.downloadResponse = self.dqueue.get() self.waitDialog.remove() print(self.downloadResponse) self.afterDownloadResponse() else: self.root.after(100, self.checkDownloadQueue) def afterDownloadResponse(self): if self.downloadResponse == StatusCode.OK: GenericDialog(self.root, title="Success!", message="File saved to Desktop") elif self.downloadResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Error!", message="Internal server error!") else: GenericDialog(self.root, title="Error!", message="Some other error occurred!")
class LoginScreen: def __init__(self, master: tk.Tk): # TODO check if user is already logged-in here if CheckDbLoginStatus().check(): user = GetUser().get() if user != None: HomeScreen(master=master, user=user) else: self.root = master self.root.title("Login") centerWindow(self.root, 800, 600) self.root.config(menu=tk.Menu(self.root)) self.email = tk.StringVar() self.password = tk.StringVar() self.queue = Queue() self.loginResponse = None self.dbWriteResponse = None self.emailStr = "" self.passwordStr = "" self.waitDialog = None self.initLoginScreen() def initLoginScreen(self): self.frame = tk.Frame(self.root) self.frame.pack(expand=True, anchor=tk.CENTER) self.logo = getLogo() self.logoLabel = tk.Label(self.frame, image=self.logo) self.logoLabel.image = self.logo self.logoLabel.pack(expand=True, padx=30, pady=30) tk.Label(self.frame, text="Please Login to continue!").pack(expand=True, padx=15, pady=15) self.emailFrame = tk.Frame(self.frame) self.emailFrame.pack(side=tk.TOP) tk.Label(master=self.emailFrame, text="Email", padx=15).pack(side=tk.LEFT, expand=True) tk.Entry(self.emailFrame, textvariable=self.email).pack(side=tk.RIGHT, fill=tk.X, expand=True) self.passwordFrame = tk.Frame(self.frame) self.passwordFrame.pack(side=tk.TOP) tk.Label(self.passwordFrame, text="Password").pack(side=tk.LEFT) tk.Entry(self.passwordFrame, textvariable=self.password, show="*").pack(side=tk.RIGHT, fill=tk.X, expand=True) tk.Button(self.frame, text="Login", command=self.loginInitiator).pack(expand=True, padx=15, pady=15, ipadx=15) tk.Label(self.frame, text="Don't have an account?").pack(expand=True, side=tk.TOP, padx=20, pady=(35, 10)) tk.Button(self.frame, text="Create a new account", command=self.launchSignUpScreen).pack(expand=True, side=tk.TOP, ipadx=15) def launchSignUpScreen(self): self.frame.destroy() SignUpScreen(self.root) def loginInitiator(self): self.emailStr = self.email.get() self.passwordStr = self.password.get() if not validateEmail(self.emailStr): GenericDialog(self.root, title="Validation Error", message="Invalid Email Address!") elif self.passwordStr == "" or len(self.passwordStr) < 8: GenericDialog(self.root, title="Validation Error", message="Password must be 8 characters long!") else: self.waitDialog = StickyDialog(self.root, message="Please wait!") userLoginThread = UserLogin(self.queue, email=self.emailStr, password=self.passwordStr) userLoginThread.start() self.root.after(100, self.checkQueueForLogin) def checkQueueForLogin(self): if not self.queue.empty(): self.loginResponse = self.queue.get() self.waitDialog.remove() self.afterLoginResponse() else: self.root.after(100, self.checkQueueForLogin) def afterLoginResponse(self): if isinstance(self.loginResponse, ussPb.LoginResponse): # print(self.loginResponse) self.saveUserInfoInitiator() elif self.loginResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Server Error", message="Internal server error!") elif self.loginResponse == StatusCode.NOT_FOUND: GenericDialog(self.root, title="Error", message="User not found!") elif self.loginResponse == StatusCode.FAILED_PRECONDITION: GenericDialog(self.root, title="Validation Error", message="Wrong password!") elif self.loginResponse == StatusCode.UNAVAILABLE: GenericDialog(self.root, title="Internal Error", message="Server not available!") else: GenericDialog(self.root, title="Unknown Error", message="Some other error occurred!") def saveUserInfoInitiator(self): self.waitDialog = StickyDialog(self.root, message="Initializing...\nPlease wait!") self.user = User(userId=self.loginResponse.uid, name=self.loginResponse.name, email=self.emailStr) self.queue = Queue() saveUserInfoThread = SaveUserLoginInfo( self.queue, user=self.user, accJwt=self.loginResponse.accessToken, refJwt=self.loginResponse.refreshToken) saveUserInfoThread.start() self.root.after(100, self.checkQueueForDb) def checkQueueForDb(self): if not self.queue.empty(): self.dbWriteResponse = self.queue.get() self.waitDialog.remove() self.afterDbResponse() else: self.root.after(100, self.checkQueueForDb) def afterDbResponse(self): if self.dbWriteResponse: self.frame.destroy() HomeScreen(self.root, user=self.user) else: GenericDialog( self.root, title="Database Error!", message="Unable to save login info!\nProgram will exit now.") self.root.quit()
class SignUpScreen: def __init__(self, master: tk.Tk): self.root = master self.root.title("Sign Up") centerWindow(self.root, 800, 600) self.root.config(menu=tk.Menu(self.root)) self.username = tk.StringVar() self.email = tk.StringVar() self.password = tk.StringVar() self.confirmPassword = tk.StringVar() self.queue = Queue() self.signUpResponse = None self.waitDialog = None self.initSignUpScreen() def initSignUpScreen(self): self.frame = tk.Frame(self.root) self.frame.pack(expand=True, anchor=tk.CENTER) self.logo = getLogo() self.logoLabel = tk.Label(self.frame, image=self.logo) self.logoLabel.image = self.logo self.logoLabel.pack(expand=True, padx=30, pady=30) tk.Label(self.frame, text="Create a new account!").pack(expand=True, padx=5, pady=5) self.nameFrame = tk.Frame(self.frame) self.nameFrame.pack(side=tk.TOP) tk.Label(self.nameFrame, text="Name", padx=38).pack(side=tk.LEFT, expand=True) tk.Entry(self.nameFrame, textvariable=self.username).pack(side=tk.RIGHT, fill=tk.X, expand=True) self.emailFrame = tk.Frame(self.frame) self.emailFrame.pack(side=tk.TOP) tk.Label(self.emailFrame, text="Email", padx=40).pack(side=tk.LEFT, expand=True) tk.Entry(self.emailFrame, textvariable=self.email).pack(side=tk.RIGHT, fill=tk.X, expand=True) self.passwordFrame = tk.Frame(self.frame) self.passwordFrame.pack(side=tk.TOP) tk.Label(self.passwordFrame, text="Password", padx=26).pack(side=tk.LEFT, expand=True) tk.Entry(self.passwordFrame, textvariable=self.password, show="*").pack(side=tk.RIGHT, fill=tk.X, expand=True) self.confirmPasswordFrame = tk.Frame(self.frame) self.confirmPasswordFrame.pack(side=tk.TOP) tk.Label(self.confirmPasswordFrame, text="Confirm Password").pack(side=tk.LEFT, expand=True) tk.Entry(self.confirmPasswordFrame, textvariable=self.confirmPassword, show="*").pack(side=tk.RIGHT, fill=tk.X, expand=True) tk.Button(self.frame, text="Sign Up", command=self.signUpInitiator).pack(expand=True, padx=15, pady=15, ipadx=15) tk.Label(self.frame, text="Already have an account?").pack(expand=True, side=tk.TOP, padx=20, pady=(35, 10)) tk.Button(self.frame, text="Login Now", command=self.launchLoginScreen).pack(expand=True, side=tk.TOP, ipadx=15) def launchLoginScreen(self): self.frame.destroy() loginscreen.LoginScreen(self.root) def signUpInitiator(self): name = self.username.get() email = self.email.get() password = self.password.get() confPassword = self.confirmPassword.get() if name == "" or not validateUsername(name) or len(name) > 32: GenericDialog( self.root, title="Validation Error", message= "Invalid name!\nContains only alphabets.\nMax length: 32.") elif not validateEmail(email): GenericDialog(self.root, title="Validation Error", message="Invalid Email Address!") elif password != confPassword: GenericDialog(self.root, title="Validation Error", message="Passwords do not match!") elif password == confPassword and len(password) < 8: GenericDialog(self.root, title="Validation Error", message="Password minimum length: 8") elif password == confPassword and len(password) > 64: GenericDialog(self.root, title="Validation Error", message="Password maximum length: 64") else: # initiate sign up self.waitDialog = StickyDialog(self.root, message="Please wait!") userSignUpThread = UserSignUp(queue=self.queue, username=name, email=email, password=password) userSignUpThread.start() self.root.after(100, self.checkQueue) def checkQueue(self): if not self.queue.empty(): self.signUpResponse = self.queue.get() self.waitDialog.remove() self.afterSignUpResponse() else: self.root.after(100, self.checkQueue) def afterSignUpResponse(self): if self.signUpResponse == StatusCode.OK: GenericDialog(self.root, title="Success", message="User account created.\nYou can now login!") elif self.signUpResponse == StatusCode.ALREADY_EXISTS: GenericDialog( self.root, title="Account Error", message="User account already exists.\nPlease login!") elif self.signUpResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Error", message="Internal Server Error!") elif self.signUpResponse == StatusCode.UNAVAILABLE: GenericDialog(self.root, title="Error", message="Could not connect to server!") else: GenericDialog(self.root, title="Unknown Error", message="Error Code: " + self.signUpResponse + "!")
class MyFilesOptionsDialog(tk.Toplevel): def __init__(self, master: tk.Frame, masterParent: tk.Tk, fileDetails: tuple): super().__init__(master) self.root = master self.fileDetails = fileDetails self.masterParent = masterParent self.queue = Queue() self.aclUpdateResponse = None self.emailEntry = tk.StringVar() self.title(fileDetails[1]) self.resizable(False, False) self.grab_set() self.overrideredirect(True) centerWindow(self, 300, 300) tk.Label(self, text="Download").pack(expand=True) tk.Button(self, text="Download", command=self.downloadFile).pack(expand=True) tk.Label(self, text="Sharing").pack(expand=True) entry = tk.Entry(self, textvariable=self.emailEntry) entry.pack(expand=True) tk.Button(self, text="Cancel", command=self.remove).pack(expand=True, side=tk.LEFT) tk.Button(self, text="Revoke", command=self.revokeAccess).pack(expand=True, side=tk.LEFT) tk.Button(self, text="Grant", command=self.grantAccess).pack(expand=True, side=tk.LEFT) def remove(self): self.grab_release() self.withdraw() def signOut(self): print("signout called") result = RemoveUserLoginInfo().remove() if result: self.root.destroy() loginScreen.LoginScreen(self.masterParent) else: GenericDialog( self.root, title="Database Error!", message="Unable to remove login info!\nProgram will exit now.") def downloadFile(self): print("Download") self.dqueue = Queue() self.remove() self.waitDialog = StickyDialog(self, message="Downloading! Please wait...") userFileDownloadThread = DownloadFile(queue=self.dqueue, owner=self.fileDetails[0], name=self.fileDetails[1]) userFileDownloadThread.start() self.checkDownloadQueue() def checkDownloadQueue(self): if not self.dqueue.empty(): self.downloadResponse = self.dqueue.get() self.waitDialog.remove() print(self.downloadResponse) self.afterDownloadResponse() else: self.root.after(100, self.checkDownloadQueue) def afterDownloadResponse(self): if self.downloadResponse == StatusCode.OK: GenericDialog(self.root, title="Success!", message="File saved to Desktop") elif self.downloadResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Error!", message="Internal server error!") elif self.downloadResponse == StatusCode.UNAUTHENTICATED: GenericDialog(self.root, title="Error!", message="Internal server error!") else: GenericDialog(self.root, title="Error!", message="Some other error occurred!") def revokeAccess(self): print("revoking") toEmail = self.emailEntry.get() self.remove() if validateEmail(email=toEmail): self.waitDialog = StickyDialog(self, message="Revoking! Please wait...") updateAclGrantThread = UpdateFileACL(queue=self.queue, owner=self.fileDetails[0], name=self.fileDetails[1], grant=False, toEmail=toEmail) updateAclGrantThread.start() self.checkACLUpdateQueue() else: GenericDialog(self, title="Error!", message="Invalid Email Address!") def grantAccess(self): print("granting") toEmail = self.emailEntry.get() self.remove() if validateEmail(email=toEmail): self.waitDialog = StickyDialog(self, message="Granting! Please wait...") updateAclGrantThread = UpdateFileACL(queue=self.queue, owner=self.fileDetails[0], name=self.fileDetails[1], grant=True, toEmail=toEmail) updateAclGrantThread.start() self.checkACLUpdateQueue() else: GenericDialog(self, title="Error!", message="Invalid Email Address!") def checkACLUpdateQueue(self): if not self.queue.empty(): self.aclUpdateResponse = self.queue.get() self.waitDialog.remove() print(self.aclUpdateResponse) self.afterACLUpdateResponse() else: self.root.after(100, self.checkACLUpdateQueue) def afterACLUpdateResponse(self): if self.aclUpdateResponse == StatusCode.OK: GenericDialog(self.root, title="Success!", message="ACL Updated") elif self.aclUpdateResponse == StatusCode.FAILED_PRECONDITION: GenericDialog(self.root, title="Error!", message="No such user email found!") elif self.aclUpdateResponse == StatusCode.NOT_FOUND: GenericDialog(self.root, title="Error!", message="File not found.\nRefresh and try again!") elif self.aclUpdateResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Error!", message="Internal server error!") else: GenericDialog(self.root, title="Error!", message="Some other error occurred!")
class UssMenu(tk.Menu): def __init__(self, master: tk.Tk, masterFrame: tk.Frame): super().__init__(master) self.uploadStatusResponse = None self.root = master self.masterFrame = masterFrame # this is the first menu option of menubar # Name = File fileMenu = tk.Menu(self) fileMenu.add_command(label="Upload File", command=self.openNewUploadFile) fileMenu.add_command(label="Refresh", command=self.refreshMasterFrame) fileMenu.add_separator() fileMenu.add_command(label="Quit", command=self.quitApp) # this is the second menu option of menubar # Name = Account accountMenu = tk.Menu(self) accountMenu.add_command(label="Sign Out", command=self.signOut) # this is the third menu option of menubar # Name = More moreMenu = tk.Menu(self) moreMenu.add_command(label="About", command=self.showAbout) # adding menu options to the menubar self.add_cascade(label="File", menu=fileMenu) self.add_cascade(label="Account", menu=accountMenu) self.add_cascade(label="More", menu=moreMenu) def signOut(self): result = RemoveUserLoginInfo().remove() if result: self.masterFrame.grab_release() self.masterFrame.destroy() loginScreen.LoginScreen(self.root) else: GenericDialog( self.root, title="Database Error!", message="Unable to remove login info!\nProgram will exit now.") def quitApp(self): self.root.quit() def showAbout(self): aboutDialog.AboutDialog(self.root) def disableMenuBar(self): self.entryconfig("File", state="disabled") self.entryconfig("Account", state="disabled") self.entryconfig("More", state="disabled") def enableMenuBar(self): self.entryconfig("File", state="normal") self.entryconfig("Account", state="normal") self.entryconfig("More", state="normal") def openNewUploadFile(self): fileTypes = [("Text Documents", "*.txt")] dialog = filedialog.Open(master=self.root, filetypes=fileTypes) self.disableMenuBar() self.filePath = dialog.show() # check if file size is greater than 5 MB if self.filePath != "": self.fileStats = os.stat(self.filePath) print("size in bytes = ", self.fileStats.st_size) if self.fileStats.st_size > 5242880: GenericDialog(master=self.root, title="Size Error!", message="Max file size allowed: 5MB") self.enableMenuBar() else: # start uploading file self.initiateFileUpload(self.filePath) print("valid file size") else: self.enableMenuBar() def initiateFileUpload(self, filePath): self.queue = Queue() self.waitDialog = StickyDialog(self.root, message="Please wait, uploading...") fileUploadThread = UploadFile(self.queue, filePath) fileUploadThread.start() self.master.after(100, self.checkQueueForUploadStatus) def checkQueueForUploadStatus(self): if not self.queue.empty(): self.uploadStatusResponse = self.queue.get() self.waitDialog.destroy() self.master.config(menu=self) self.afterFileUploadResponse() else: self.master.after(100, self.checkQueueForUploadStatus) def afterFileUploadResponse(self): if self.uploadStatusResponse == StatusCode.INTERNAL: GenericDialog(self.root, title="Error!", message="Internal server error!") elif self.uploadStatusResponse == StatusCode.UNAVAILABLE: GenericDialog(self.root, title="Error!", message="Server not available!") elif self.uploadStatusResponse == StatusCode.UNAUTHENTICATED: self.signOut() elif self.uploadStatusResponse == StatusCode.OK: GenericDialog( self.root, title="Success!", message="File Uploaded Successfully!\nPlease refresh!") else: GenericDialog(self.root, title="Error!", message="Some other error occurred!") self.enableMenuBar() def refreshMasterFrame(self): self.masterFrame.destroy() loginScreen.LoginScreen(self.root)