Advertisement
Guest User

Untitled

a guest
Mar 29th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.58 KB | None | 0 0
  1. class UserOrgPage(tkinter.Frame,SquadBot):
  2.     def __init__(self,parent,controller):
  3.         tkinter.Frame.__init__(self,parent)
  4.         self.createImages() # creates array of images
  5.         self.configure(bg=self.palette["bgblue"])
  6.         colourbar = tkinter.Frame(self,background=self.palette["darkblue"])
  7.         colourbar.place(x=0,y=0,width=700,height=90,anchor="nw")
  8.         logoutbutton = tkinter.Button(colourbar,background=self.palette["darkblue"],text="Log Out",
  9.                                       fg="#ffffff",font=("TkDefaultFont","10","bold"),command = lambda: controller.logout())
  10.         logoutbutton.place(height=50,width=100,x=680,y=45,anchor="e")
  11.  
  12.         mainscreenbutton = tkinter.Button(colourbar,background=self.palette["darkblue"],text="Back",
  13.                                           fg="#ffffff",font=("TkDefaultFont","10","bold"),command = lambda: controller.showPage(MainPage,UserOrgPage))
  14.         mainscreenbutton.place(height=50,width=100,x=560,y=45,anchor="e")
  15.  
  16.         crestlbl = tkinter.Label(self,image=self.images["smallcrest"],background=self.palette["darkblue"])
  17.         crestlbl.place(x=0,y=0,anchor="nw",width=99,height=135)
  18.         pagelbl = tkinter.Label(colourbar,text="User Management",font=("Arial Black","20","bold"),foreground="white",background=self.palette["darkblue"])
  19.         pagelbl.place(y=45,x=100,anchor="w")
  20.         # above code is the same setup as other pages
  21.  
  22.        
  23.         useraddframe = tkinter.Frame(self,background = self.palette["afb"])
  24.         useraddframe.place(x=10,y=145,anchor="nw",width=375,height=300)
  25.         # creates frame to add new user
  26.  
  27.         newubutton = tkinter.Button(useraddframe,text="Add new user",command=lambda: self.addnewuser(controller))
  28.         newubutton.place(x=187.5,y=260,height=25,width=80,anchor="n")
  29.  
  30.         forenamelbl = tkinter.Label(useraddframe,text="Forename:",bg=self.palette["afb"])
  31.         forenamelbl.place(x=25,y=15,anchor="nw")
  32.         self.forenamevar = tkinter.StringVar()
  33.         self.forenamevar.trace_add("write", lambda x,y,z: self.change_text(var=self.forenamevar))
  34.         self.forenameentry = tkinter.Entry(useraddframe,text=self.forenamevar)
  35.         self.forenameentry.place(x=100,y=40,anchor="n",width=150)
  36.         self.usernamevar = tkinter.StringVar()
  37.         self.usernamevar.trace_add("write", lambda x,y,z: self.change_text(var=self.usernamevar))
  38.         usernamelbl = tkinter.Label(useraddframe,text="Username:",bg=self.palette["afb"])
  39.         usernamelbl.place(x=200,y=15,anchor="nw")
  40.         self.usernameentry = tkinter.Entry(useraddframe,text = self.usernamevar)
  41.         self.usernameentry.place(x=275,y=40,anchor="n",width=150)
  42.        
  43.         surnamelbl = tkinter.Label(useraddframe,text="Surname:",bg=self.palette["afb"])
  44.         surnamelbl.place(x=25,y=65,anchor="nw")
  45.         self.surnamevar = tkinter.StringVar()
  46.         self.surnamevar.trace_add("write", lambda x,y,z: self.change_text(var=self.surnamevar))
  47.         self.surnameentry = tkinter.Entry(useraddframe,text=self.surnamevar)
  48.         self.surnameentry.place(x=100,y=90,width=150,anchor="n")
  49.         passwordlbl = tkinter.Label(useraddframe,text="Password:",bg=self.palette["afb"])
  50.         passwordlbl.place(x=200,y=65,anchor="nw")
  51.         self.passwordvar = tkinter.StringVar()
  52.         self.passwordvar.trace_add("write", lambda x,y,z: self.change_text(var=self.passwordvar))
  53.         self.passwordentry = tkinter.Entry(useraddframe,text=self.passwordvar)
  54.         self.passwordentry.place(x=275,y=90,anchor="n",width=150)
  55.         self.pwordcheckvar = tkinter.StringVar()
  56.         self.pwordcheckvar.trace_add("write", lambda x,y,z: self.change_text(var=self.pwordcheckvar))
  57.         passwordchecklbl = tkinter.Label(useraddframe,text="Confirm Password:",bg=self.palette["afb"])
  58.         passwordchecklbl.place(x=200,y=115,anchor="nw")
  59.         self.passwordcheck = tkinter.Entry(useraddframe,text=self.pwordcheckvar)
  60.         self.passwordcheck.place(x=275,y=140,anchor="n",width=150)
  61.        
  62.         self.gender = tkinter.StringVar()
  63.         genderlabel = tkinter.Label(useraddframe,text="Gender:",bg=self.palette["afb"])
  64.         genderlabel.place(x=25,y=120,anchor="nw")
  65.         genderentry = tkinter.OptionMenu(useraddframe,self.gender,"Male","Female")
  66.         genderentry.configure(highlightbackground=self.palette["afb"])
  67.         genderentry.place(x=100,y=115,anchor="nw",width=75)
  68.  
  69.         self.flight = tkinter.StringVar()
  70.         flightlabel = tkinter.Label(useraddframe,text="Flight:",bg=self.palette["afb"])
  71.         flightlabel.place(x=25,y=155,anchor="nw")
  72.         flightentry = tkinter.OptionMenu(useraddframe,self.flight,"A","B","T")
  73.         flightentry.configure(highlightbackground=self.palette["afb"])
  74.         flightentry.place(x=100,y=150,anchor="nw",width=75)
  75.  
  76.         self.rank = tkinter.StringVar()
  77.         ranklabel = tkinter.Label(useraddframe,text="Rank:",bg=self.palette["afb"])
  78.         ranklabel.place(x=25,y=190,anchor="nw")
  79.         rankentry = tkinter.OptionMenu(useraddframe,self.rank,"Cdt","Cpl","Sgt","FS","CWO")
  80.         rankentry.configure(highlightbackground=self.palette["afb"])
  81.         rankentry.place(x=100,y=185,anchor="nw",width=75)
  82.        
  83.         def changerankoptions():    # changes the rank options if the user is a staff member, as staff have different ranks to cadets
  84.             print("rankchanging")
  85.             cadet = staff.get()
  86.             print(cadet)
  87.             staff_ranks = ("CI","SI","Sgt (ATC)","FS (ATC)","WO (ATC)","Plt Off","Fg Off","Flt Lt","Sqn Ldr","Wg Cdr","Gp Capt")
  88.             cadet_ranks = ("Cdt","Cpl","Sgt","FS","CWO")
  89.             rankentry["menu"].delete(0,"end")
  90.             flightentry["menu"].delete(0,"end")
  91.             if cadet:
  92.                 for i in staff_ranks:
  93.                     rankentry["menu"].add_command(label=i,command=tkinter._setit(self.rank, i))
  94.                 flightentry["menu"].add_command(label="S",command=tkinter._setit(self.flight,"S"))
  95.                 self.flight.set("S")
  96.                 self.rank.set("CI")
  97.             else:
  98.                 for i in cadet_ranks:
  99.                     rankentry["menu"].add_command(label=i,command=tkinter._setit(self.rank, i))
  100.                 for i in ("A","B","T"):
  101.                     flightentry["menu"].add_command(label=i,command=tkinter._setit(self.flight, i))
  102.                 self.flight.set("A")
  103.                 self.rank.set("Cdt")
  104.                
  105.         stafflbl = tkinter.Label(useraddframe,text="Staff? :",bg=self.palette["afb"])
  106.         stafflbl.place(x=200,y=190)
  107.         staff = tkinter.BooleanVar()
  108.         staff.set(False)
  109.         staffbtn = tkinter.Checkbutton(useraddframe,variable=staff,command=lambda:changerankoptions())
  110.         staffbtn.place(x=275,y=190)
  111.        
  112.         doblabel = tkinter.Label(useraddframe,text="D.O.B:",bg=self.palette["afb"])
  113.         doblabel.place(x=25,y=225,anchor="nw")
  114.         self.month = tkinter.StringVar()
  115.         self.month.set("Jan")
  116.         self.dayentry = tkinter.Spinbox(useraddframe,from_=1,to=31)
  117.         self.dayentry.place(x=103,y=220,width=50,height=25)
  118.         self.monthdict = {"Jan":1,"Feb":2,"Mar":3,"Apr":4,"May":5,"Jun":6,"Jul":7,"Aug":8,"Sep":9,"Oct":10,"Nov":11,"Dec":12}
  119.         monthentry = tkinter.OptionMenu(useraddframe,self.month,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
  120.         monthentry.configure(highlightbackground=self.palette["afb"],indicatoron=False)
  121.         monthentry.place(x=188,y=218,width=60,height=30,anchor="n")
  122.         self.year = tkinter.StringVar()
  123.         self.year.set("2000")
  124.         self.yearentry = tkinter.Spinbox(useraddframe,from_=1930,to=int(datetime.datetime.today().strftime("%Y"))-11,textvariable=self.year)
  125.         self.yearentry.place(x=223,y=220,width=50,height=25)
  126.         # above code creates buttons and boxes to allows entry of a new user
  127.  
  128.         manageuserbtn = tkinter.Button(self,text="Manage Users",command=lambda:self.manageusers(controller),font=("Arial Black",14))
  129.         manageuserbtn.place(x=420,y=185,width=250,height=50,anchor="w")
  130.         controller.conn.send("rr".encode())
  131.         response = controller.conn.recv(1024).decode()
  132.         data = json.loads(response)
  133.         officernumber = staffnumber = nconumber = cadetnumber = 0
  134.         for i in data:
  135.             rank = i[0]
  136.             if rank in ("Plt Off","Fg Off","Flt Lt","Sqn Ldr","Wg Cdr","Gp Capt"):
  137.                 officernumber+=1
  138.             elif rank in ("CI","SI","Sgt (ATC)","FS (ATC)","WO (ATC)"):
  139.                 staffnumber+=1
  140.             elif rank in ("Cpl","Sgt","FS","CWO"):
  141.                 nconumber+=1
  142.             elif rank == "Cdt":
  143.                 cadetnumber+=1
  144.                 # counts total number of users to display how many of each type there are
  145.         usernoframe = tkinter.Frame(self,background = self.palette["afb"])
  146.         usernoframe.place(x=420,y=245,anchor="nw",width=250,height=200)
  147.         usernotitle = tkinter.Label(usernoframe,text="Users",background=self.palette["afb"],foreground="white",font=("Arial Black","15","underline"))
  148.         noofusers = tkinter.Label(usernoframe,text="""
  149. Officers:       {offno}
  150. Other Staff:    {staffno}
  151. NCOs:           {ncono}
  152. Cadets:         {cadetno}""".format(offno=officernumber,staffno=staffnumber,ncono=nconumber,cadetno=cadetnumber)
  153.                                   ,background = self.palette["afb"],foreground="white",font=("Arial Black","12"),justify="left")
  154.         usernotitle.place(x=125,y=10,anchor="n")
  155.         noofusers.place(x=125,y=50,anchor="n")
  156.         # displays number of users
  157.  
  158.  
  159.        
  160.     def manageusers(self,parent):
  161.         parent.conn.send("d".encode())
  162.         # client wishes to change details of a user
  163.         endofdata = False
  164.         data=""
  165.         while not endofdata:
  166.             received = parent.conn.recv(1024)
  167.             decoded = received.decode()
  168.             print("received:",decoded)
  169.             data = data.join(decoded)
  170.             if data[-1] == ">":
  171.                 endofdata = True
  172.         jsondata = data[1:-1]
  173.         data = json.loads(jsondata)
  174.         # above code receives data and decodes it to usable format
  175.         for i in data:
  176.             print(i)
  177.         self.managementwindow = tkinter.Toplevel()
  178.         self.managementwindow.geometry("400x200+200+200")
  179.         self.managementwindow.tk.call('wm', 'iconbitmap', self.managementwindow._w, "resources/crest.ico")
  180.         self.managementwindow.configure(bg=self.palette["bgblue"])
  181.         self.managementwindow.grab_set()
  182.         # creates extra window to select users to edit
  183.         def scrollfunc(event):
  184.             can.configure(scrollregion=can.bbox("all"),width=383,height=200)
  185.         canvasframe = tkinter.Frame(self.managementwindow,relief="groove",width=383,height=200)
  186.         canvasframe.place(x=0,y=0)
  187.        
  188.         can = tkinter.Canvas(canvasframe)
  189.         frame = tkinter.Frame(can)
  190.         scrollbar = tkinter.Scrollbar(canvasframe,orient="vertical",command=can.yview)
  191.         can.configure(yscrollcommand=scrollbar.set)
  192.         scrollbar.pack(side="right",fill="y")
  193.         can.pack(side="left")
  194.         can.create_window((0,0),window=frame,anchor="nw")
  195.         frame.bind("<Configure>",scrollfunc)
  196.         a=0
  197.         print(data)
  198.         controller = parent
  199.         def selectuser(uid,parent,num):
  200.             option = self.selection[num-1].get()
  201.             print(option,uid)
  202.             if option == "Delete User": # this code allows a user to be deleted
  203.                 checking = tkinter.messagebox.askquestion("Delete User","Are you sure you want to delete this user? It cannot be undone")
  204.                 if checking == "yes":
  205.                     parent.conn.send("px{userid}".format(userid=uid).encode())
  206.                     response = parent.conn.recv(1024).decode()
  207.                     if response == "UFD":
  208.                         tkinter.messagebox.showinfo("Success","User Successfully Deleted")
  209.                         self.managementwindow.destroy()
  210.                     else:
  211.                         tkinter.messagebox.showerror("Error","An error occured. Try again")
  212.                        
  213.             elif option == "Reset Password":    # this code resets a user's password and receoves a randomly-generated one
  214.                 checking = tkinter.messagebox.askquestion("Reset Password","Are you sure you want to reset this user's password?")
  215.                 if checking == "yes":
  216.                     parent.conn.send("pp{userid}".format(userid=uid).encode())
  217.                     npw = parent.conn.recv(1024).decode()
  218.                     print(npw)
  219.                     print(npw[:3])
  220.                     if npw[:3] == "npw":
  221.                         tkinter.messagebox.showinfo("New Password","The new password for this user is: {pw}\nIt is strongly advised they write this down.".format(pw=npw[3:]))
  222.             elif option == "Edit User":
  223.                 usereditwindow = tkinter.Toplevel(parent)
  224.                 # creates a separate window to the main program
  225.                 usereditwindow.grab_set()
  226.                 # makes it so that the main window cannot be interacted with unil this window has been closed
  227.                 usereditwindow.geometry("200x140")
  228.                 # setting size of window
  229.                 usereditwindow.resizable(0,0)
  230.                 # preventing the window from being resized
  231.                 userlbl = tkinter.Label(usereditwindow,text="Which attribute would \nyou like to change?")
  232.                 userlbl.place(x=100,y=0,anchor="n")
  233.                 attribute = tkinter.StringVar()
  234.                 newval = tkinter.StringVar()
  235.                 newval.trace_add("write", lambda x,y,z: self.change_text(var=newval,limit="alpha"))
  236.                 attribute.set("Forename")
  237.                 attributebox = tkinter.OptionMenu(usereditwindow,attribute,"Forename","Surname","Gender","Rank","Flight","Username")
  238.                 attributebox.place(x=100,y=40,anchor="n")
  239.                 self.entrywidg = []
  240.                 entrybox = tkinter.Entry(usereditwindow,text=newval)
  241.                 entrybox.place(x=100,y=70,anchor="n")
  242.                 submit = tkinter.Button(usereditwindow,text="Submit Changes",command = lambda: submitdata())
  243.                 submit.place(x=100,y=100,anchor="n")
  244.                 def submitdata():
  245.                     print("helllllllo")
  246.                     ranks = ("Cdt","Cpl","Sgt","FS","CWO","CI","SI","Sgt (ATC)","FS (ATC)","WO (ATC)","Plt Off","Fg Off","Flt Lt","Sqn Ldr","Wg Cdr","Gp Capt")
  247.                     varchanging = attribute.get()
  248.                     newdata = entrybox.get()
  249.                     if varchanging == "Gender" and len(newdata)!=1:
  250.                         tkinter.messagebox.showerror("Error","Gender must be 1 character")
  251.                         return 0
  252.                     elif varchanging == "Rank" and newdata not in ranks:
  253.                         tkinter.messagebox.showerror("Error","Not a valid rank. Valid ranks are:\n Cdt, Cpl, Sgt, FS, CWO,\n CI, SI, Sgt (ATC), WO (ATC), Plt Off,\n Fg Off, Flt Lt, Sqn Ldr, Wg Cdr, Gp Capt")
  254.                         return 0
  255.                     elif newdata == "":
  256.                         tkinter.messagebox.showerror("Error","Data field cannot be empty")
  257.                         return 0
  258.                     parent.conn.send("pd{cid}+{typ}+{dat}".format(typ=varchanging,dat=newdata,cid=uid).encode())
  259.                     response = parent.conn.recv(1024).decode()
  260.                     if response == "DCS":
  261.                         tkinter.messagebox.showinfo("Success","Details successfully changed")
  262.                         usereditwindow.destroy()
  263.                     elif response == "UAE":
  264.                         tkinter.messagebox.showerror("Error","That username already exists")
  265.         self.selection = []
  266.         tkinter.Label(frame,text="Rank").grid(row=a,column=0)
  267.         tkinter.Label(frame,text="Name").grid(row=a,column=1)
  268.         tkinter.Label(frame,text="Option").grid(row=a,column=3)
  269.         self.buttons = []
  270.         for i in data:
  271.             a+=1
  272.             tkinter.Label(frame,text=i[0]).grid(row=a,column=0)
  273.             tkinter.Label(frame,text=i[1]).grid(row=a,column=1)
  274.             tkinter.Label(frame,text=i[2]).grid(row=a,column=2)
  275.             name = i[0]+" "+i[1]+" "+i[2]
  276.             self.selection.append(tkinter.StringVar())
  277.             self.selection[-1].set("Edit User")
  278.             tkinter.OptionMenu(frame,self.selection[-1],"Edit User","Reset Password","Delete User").grid(row=a,column=3)
  279.             print("button",i,":",i[3])
  280.             self.buttons.append(tkinter.Button(frame,command = lambda x=i[3],y=a: selectuser(x,parent,y),text="Select"))
  281.             self.buttons[-1].grid(row=a,column=4)
  282.     def addnewuser(self,parent):
  283.         forename = self.forenameentry.get()
  284.         surname = self.surnameentry.get()
  285.         username = self.usernameentry.get()
  286.         password = self.passwordentry.get()
  287.         password2 = self.passwordcheck.get()
  288.         flight = self.flight.get()
  289.         rank = self.rank.get()
  290.         gender = self.gender.get()
  291.         if gender == "Male":
  292.             gender = "M"
  293.         else:
  294.             gender = "F"
  295.         dob = self.getdob()
  296.         if password == password2:
  297.             if len(password)>=8:
  298.                 userdata = (forename,surname,rank,flight,gender,dob,username,password)
  299.                 jsondata = json.dumps(userdata)
  300.                 sendingdata = "su" + jsondata
  301.                 parent.conn.send(sendingdata.encode())
  302.                 response = parent.conn.recv(1024).decode()
  303.                 if response == "UAS":
  304.                     self.forenameentry.delete(0,"end")
  305.                     self.surnameentry.delete(0,"end")
  306.                     self.usernameentry.delete(0,"end")
  307.                     self.passwordentry.delete(0,"end")
  308.                     self.passwordcheck.delete(0,"end")
  309.                    
  310.                     tkinter.messagebox.showinfo("Success","User successfully added")
  311.                 elif response == "UAE":
  312.                     tkinter.messagebox.showerror("Error","That username is taken")
  313.             else:
  314.                 tkinter.messagebox.showerror("Error","Password must be 8 characters or longer")
  315.         else:
  316.             tkinter.messagebox.showerror("Error","Passwords do not match")
  317.     def checkcontent(string):
  318.         pattern = ""
  319.     def getdob(self):
  320.         day = self.dayentry.get()
  321.         month = self.month.get()
  322.         monthnum = self.monthdict[month]
  323.         try:
  324.             print(str(monthnum)[1])
  325.             monthnum = str(monthnum)
  326.         except:
  327.             monthnum = "0"+str(monthnum)
  328.         year = self.yearentry.get()
  329.         datestr = str(year)+"-"+str(monthnum)+"-"+str(day)
  330.         print(datestr)
  331.         return datestr
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement