Skip to content

Commit 9e776ca

Browse files
committed
Codes 4 W12
1 parent 011bb06 commit 9e776ca

File tree

3 files changed

+372
-0
lines changed

3 files changed

+372
-0
lines changed

Week12/db.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import firebase_admin # pip install firebase-admin
2+
from firebase_admin import credentials, db
3+
import pyrebase # pip install pyrebase4
4+
5+
6+
class Firebase:
7+
def __init__(self):
8+
#####################################################################
9+
# Use your own information for your Firebase project below. #
10+
#####################################################################
11+
# You need to download the credentials file from your Firebase #
12+
# project settings. Click on the "Generate new private key" button #
13+
# and save the file as "credentials.json" in the same directory. #
14+
CREDENTIALS_FILE = "credentials.json"
15+
# You can find your database URL in your Firebase project settings. #
16+
# The format is "https://<project_id>.firebasedatabase.app/". #
17+
DATABASE_URL = ""
18+
# You can find your API key in your Firebase project settings. #
19+
# The format is "AIza...". #
20+
# If you can't find your API key, create a new web app in your #
21+
# Firebase project, then you will see the API key. #
22+
API_KEY = ""
23+
# You can find your project ID in your Firebase project settings. #
24+
PROJECT_ID = ""
25+
#####################################################################
26+
# You can find these information in your Firebase project settings. #
27+
# You don't need to change the following code. #
28+
#####################################################################
29+
self.cred = credentials.Certificate(CREDENTIALS_FILE)
30+
firebase_admin.initialize_app(
31+
self.cred,
32+
{
33+
"databaseURL": DATABASE_URL,
34+
},
35+
)
36+
self.ref = db.reference("/")
37+
self.config = {
38+
"apiKey": API_KEY,
39+
"authDomain": f"{PROJECT_ID}.firebaseapp.com",
40+
"databaseURL": DATABASE_URL,
41+
"storageBucket": f"{PROJECT_ID}.appspot.com",
42+
}
43+
self.firebase = pyrebase.initialize_app(self.config)
44+
self.auth = self.firebase.auth()
45+
46+
def login(self, email, password):
47+
user = self.auth.sign_in_with_email_and_password(email, password)
48+
return user
49+
50+
def register(self, email, password):
51+
user = self.auth.create_user_with_email_and_password(email, password)
52+
return user
53+
54+
def get_current_user(self):
55+
return self.auth.current_user
56+
57+
def get_user_id(self):
58+
return self.auth.current_user["localId"]
59+
60+
def get_user_email(self):
61+
return self.auth.current_user["email"]
62+
63+
def logout(self):
64+
self.auth.current_user = None
65+
66+
67+
if __name__ == "__main__":
68+
f = Firebase()
69+
print(f.ref.get())
70+
f.ref.set({"name": "Bora Canbula"})
71+
print(f.ref.get())
72+
try:
73+
f.login("prof@university.edu", "password")
74+
except Exception as e:
75+
f.register("prof@university.edu", "password")
76+
print(f.get_current_user())

Week12/professor.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from db import Firebase
2+
3+
4+
class Professor:
5+
def __init__(self, user_id: str, f: Firebase) -> None:
6+
self.user_id = user_id
7+
self.title = ""
8+
self.fullname = ""
9+
self.department = ""
10+
self.university = ""
11+
self.courses = []
12+
self.f = f
13+
self.ref = f.ref.child("professors").child(self.user_id)
14+
if self.ref.get():
15+
self.get()
16+
17+
def save(self):
18+
self.ref.set(
19+
{
20+
"title": self.title,
21+
"fullname": self.fullname,
22+
"department": self.department,
23+
"university": self.university,
24+
}
25+
)
26+
return self
27+
28+
def update(self, updates: dict = {}):
29+
if updates:
30+
self.title = updates.get("title", self.title)
31+
self.fullname = updates.get("fullname", self.fullname)
32+
self.department = updates.get("department", self.department)
33+
self.university = updates.get("university", self.university)
34+
self.save()
35+
return self
36+
37+
def get(self):
38+
professor = self.ref.get()
39+
if not professor:
40+
return self
41+
self.title = professor["title"]
42+
self.fullname = professor["fullname"]
43+
self.department = professor["department"]
44+
self.university = professor["university"]
45+
courses = self.f.ref.child("courses").get()
46+
if courses:
47+
for course_id in courses:
48+
course = courses[course_id]
49+
if course["user_id"] == self.user_id:
50+
self.courses.append(course)
51+
return self
52+
53+
def delete(self):
54+
self.ref.delete()
55+
self.title = ""
56+
self.fullname = ""
57+
self.department = ""
58+
self.university = ""
59+
return self
60+
61+
def __str__(self):
62+
return f"{self.title} {self.fullname} @ {self.department}, {self.university}"
63+
64+
65+
if __name__ == "__main__":
66+
f = Firebase()
67+
f.login("prof@university.edu", "password")
68+
professor = Professor(f.get_user_id(), f)
69+
professor.title = "Assoc. Prof. Dr."
70+
professor.fullname = "Bora Canbula"
71+
professor.department = "Computer Engineering"
72+
professor.university = "Manisa Celal Bayar University"
73+
professor.save()
74+
print(professor)
75+
print(professor.courses)
76+
professor.update(
77+
{
78+
"title": "Prof. Dr.",
79+
"department": "Department of Computer Engineering",
80+
}
81+
)
82+
print(professor)
83+
professor.delete()

Week12/pycat.py

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
import wx
2+
import wx.grid
3+
from db import Firebase
4+
from professor import Professor
5+
6+
7+
class LoginFrame(wx.Frame):
8+
def __init__(self, parent, title, f: Firebase):
9+
super(LoginFrame, self).__init__(parent, title=title, size=(400, 550))
10+
11+
self.f = f
12+
self.user = None
13+
14+
self.init_ui()
15+
self.Centre()
16+
self.Show()
17+
18+
wx.TopLevelWindow.Bind(self, wx.EVT_CLOSE, self.on_close)
19+
wx.TopLevelWindow.RequestUserAttention(self, True)
20+
21+
def init_ui(self):
22+
panel = wx.Panel(self)
23+
sizer = wx.BoxSizer(wx.VERTICAL)
24+
25+
sizer.Add((-1, 10))
26+
27+
logo = wx.StaticBitmap(panel, bitmap=wx.Bitmap("logo.png"))
28+
sizer.Add(logo, 0, wx.CENTER)
29+
30+
email_label = wx.StaticText(
31+
panel, label="Email", style=wx.ALIGN_CENTER, size=(200, 20)
32+
)
33+
self.email_entry = wx.TextCtrl(
34+
panel, size=(200, 20), style=wx.TE_CENTER, value="prof@university.edu"
35+
)
36+
37+
password_label = wx.StaticText(
38+
panel, label="Password", style=wx.ALIGN_CENTER, size=(200, 20)
39+
)
40+
self.password_entry = wx.TextCtrl(
41+
panel,
42+
size=(200, 20),
43+
style=wx.TE_CENTER | wx.TE_PASSWORD,
44+
value="password",
45+
)
46+
47+
login_button = wx.Button(panel, label="Login")
48+
login_button.Bind(wx.EVT_BUTTON, self.on_login)
49+
50+
sizer.Add(email_label, 0, wx.CENTER)
51+
sizer.Add((-1, 10))
52+
sizer.Add(self.email_entry, 0, wx.CENTER)
53+
sizer.Add((-1, 10))
54+
sizer.Add(password_label, 0, wx.CENTER)
55+
sizer.Add((-1, 10))
56+
sizer.Add(self.password_entry, 0, wx.CENTER)
57+
sizer.Add((-1, 10))
58+
sizer.Add(login_button, 0, wx.CENTER)
59+
60+
panel.SetSizer(sizer)
61+
62+
def on_login(self, event):
63+
email = self.email_entry.GetValue()
64+
password = self.password_entry.GetValue()
65+
try:
66+
self.user = self.f.login(email, password)
67+
print(f"Logged in as {self.f.get_user_email()}")
68+
except Exception as e:
69+
self.user = self.f.register(email, password)
70+
print(f"Registered as {self.f.get_user_email()}")
71+
self.Close()
72+
73+
def on_close(self, event):
74+
self.Destroy()
75+
76+
77+
class ProfessorPanel(wx.Panel):
78+
def __init__(self, parent, title, professor: Professor, f: Firebase):
79+
super(ProfessorPanel, self).__init__(parent)
80+
81+
self.f = f
82+
self.professor = professor
83+
84+
self.init_ui()
85+
86+
def init_ui(self):
87+
sizer = wx.GridBagSizer(10, 10)
88+
89+
self.title_label = wx.StaticText(
90+
self, label="Title", style=wx.ALIGN_LEFT, size=(200, 20)
91+
)
92+
self.title_entry = wx.TextCtrl(self, size=(200, 20), style=wx.TE_LEFT)
93+
self.fullname_label = wx.StaticText(
94+
self, label="Full Name", style=wx.ALIGN_LEFT, size=(200, 20)
95+
)
96+
self.fullname_entry = wx.TextCtrl(self, size=(200, 20), style=wx.TE_LEFT)
97+
self.department_label = wx.StaticText(
98+
self, label="Department", style=wx.ALIGN_LEFT, size=(200, 20)
99+
)
100+
self.department_entry = wx.TextCtrl(self, size=(200, 20), style=wx.TE_LEFT)
101+
self.university_label = wx.StaticText(
102+
self, label="University", style=wx.ALIGN_LEFT, size=(200, 20)
103+
)
104+
self.university_entry = wx.TextCtrl(self, size=(200, 20), style=wx.TE_LEFT)
105+
106+
if self.professor:
107+
self.title_entry.SetValue(self.professor.title)
108+
self.fullname_entry.SetValue(self.professor.fullname)
109+
self.department_entry.SetValue(self.professor.department)
110+
self.university_entry.SetValue(self.professor.university)
111+
112+
self.save_button = wx.Button(self, label="Save")
113+
self.save_button.Bind(wx.EVT_BUTTON, self.on_save)
114+
115+
sizer.Add(self.title_label, pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
116+
sizer.Add(self.title_entry, pos=(0, 1), flag=wx.EXPAND)
117+
sizer.Add(self.fullname_label, pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
118+
sizer.Add(self.fullname_entry, pos=(1, 1), flag=wx.EXPAND)
119+
sizer.Add(self.department_label, pos=(2, 0), flag=wx.ALIGN_CENTER_VERTICAL)
120+
sizer.Add(self.department_entry, pos=(2, 1), flag=wx.EXPAND)
121+
sizer.Add(self.university_label, pos=(3, 0), flag=wx.ALIGN_CENTER_VERTICAL)
122+
sizer.Add(self.university_entry, pos=(3, 1), flag=wx.EXPAND)
123+
sizer.Add(self.save_button, pos=(4, 0), span=(1, 2), flag=wx.ALIGN_RIGHT)
124+
125+
sizer.AddGrowableCol(1)
126+
127+
self.SetSizer(sizer)
128+
129+
def on_save(self, event):
130+
updates = {
131+
"title": self.title_entry.GetValue(),
132+
"fullname": self.fullname_entry.GetValue(),
133+
"department": self.department_entry.GetValue(),
134+
"university": self.university_entry.GetValue(),
135+
}
136+
self.professor.update(updates)
137+
print(
138+
f"Professor {self.professor.fullname} updated successfully with {updates}"
139+
)
140+
141+
142+
class MainFrame(wx.Frame):
143+
def __init__(self, parent, title, user, f: Firebase):
144+
super(MainFrame, self).__init__(parent, title=title, size=(800, 800))
145+
146+
self.f = f
147+
self.user = user
148+
self.professor = Professor(self.f.get_user_id(), self.f)
149+
150+
self.init_ui()
151+
self.Centre()
152+
self.Show()
153+
154+
wx.TopLevelWindow.Bind(self, wx.EVT_CLOSE, self.on_close)
155+
wx.TopLevelWindow.RequestUserAttention(self, True)
156+
157+
def init_ui(self):
158+
panel = wx.Panel(self)
159+
sizer = wx.BoxSizer(wx.VERTICAL)
160+
161+
logo = wx.StaticBitmap(panel, bitmap=wx.Bitmap("logo.png"))
162+
sizer.Add(logo, 0, wx.CENTER)
163+
164+
welcome_panel = wx.Panel(panel)
165+
welcome_sizer = wx.BoxSizer(wx.HORIZONTAL)
166+
167+
welcome_label = wx.StaticText(
168+
welcome_panel,
169+
label=f"Welcome, {self.f.get_user_email()}",
170+
style=wx.ALIGN_CENTER,
171+
size=(200, 20),
172+
)
173+
174+
logout_button = wx.Button(welcome_panel, label="Logout")
175+
logout_button.Bind(wx.EVT_BUTTON, self.on_logout)
176+
177+
welcome_sizer.Add((-1, 10))
178+
welcome_sizer.Add(welcome_label, 0, wx.CENTER)
179+
welcome_sizer.Add((-1, 10))
180+
welcome_sizer.Add(logout_button, 0, wx.CENTER)
181+
welcome_panel.SetSizer(welcome_sizer)
182+
183+
professor_panel = ProfessorPanel(
184+
panel,
185+
title="Professor",
186+
professor=self.professor,
187+
f=self.f,
188+
)
189+
190+
sizer.Add(welcome_panel, 0, wx.CENTER)
191+
sizer.Add((-1, 20))
192+
sizer.Add(professor_panel, 0, wx.CENTER)
193+
sizer.Add((-1, 20))
194+
panel.SetSizer(sizer)
195+
196+
def on_logout(self, event):
197+
self.f.logout()
198+
self.Close()
199+
200+
def on_close(self, event):
201+
self.Destroy()
202+
203+
204+
if __name__ == "__main__":
205+
app = wx.App()
206+
f = Firebase()
207+
login_frame = LoginFrame(None, title="Login to CAT", f=f)
208+
app.MainLoop()
209+
if login_frame.user:
210+
main_frame = MainFrame(
211+
None, title="CAT: Classroom Attendance Tracker", user=login_frame.user, f=f
212+
)
213+
app.MainLoop()

0 commit comments

Comments
 (0)