Guest User

Untitled

a guest
May 11th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.41 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. # work with windows
  5. import sys
  6.  
  7. from PyQt5.QtCore import Qt
  8. from PyQt5.QtWidgets import QApplication, QMessageBox, QTabWidget
  9. from PyQt5 import uic
  10. import psycopg2
  11. import re
  12.  
  13. Ui_WindowLogin, QLogIn = uic.loadUiType('login.ui')
  14. Ui_MainWindow, QMainWindow = uic.loadUiType('mainwindow.ui')
  15. Ui_WindowRegistration, QRegistration = uic.loadUiType('registration.ui')
  16. Ui_WindowTicket, QTicket = uic.loadUiType('ticket.ui')
  17. Ui_WindowChangeInfo, QChangeInfo = uic.loadUiType('changeinfo.ui')
  18. Ui_Profile, QProfile = uic.loadUiType('profile.ui')
  19. Ui_Admin, QAdmin = uic.loadUiType('adminwindow.ui')
  20.  
  21.  
  22. class ErrorMessage:
  23. def __init__(self, title="", message=""):
  24. msgBox = QMessageBox()
  25. msgBox.setIcon(QMessageBox.Warning)
  26. msgBox.setWindowTitle(title)
  27. msgBox.setText(message)
  28. msgBox.setStandardButtons(QMessageBox.Ok)
  29. msgBox.exec_()
  30.  
  31.  
  32. class LogInWindow(QLogIn):
  33. def __init__(self, parent=None):
  34.  
  35. QLogIn.__init__(self, parent)
  36. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  37.  
  38. self.ui = Ui_WindowLogin()
  39. self.ui.setupUi(self)
  40.  
  41. self.ui.sign_up_button.clicked.connect(
  42. lambda: self.parent().replace_with(RegistrationWindow())
  43. )
  44. self.ui.sign_in_button.clicked.connect(self.__execute_login)
  45.  
  46. def __del__(self):
  47. self.cursor.close()
  48. self.connect.close()
  49. self.ui = None
  50.  
  51. def __execute_login(self):
  52. try:
  53. self.cursor = self.connect.cursor()
  54. login = self.ui.line_login.text()
  55. password = self.ui.line_password.text()
  56.  
  57. self.cursor.execute(
  58. """SELECT user_id, name ,surname, login , status, passport_num,
  59. phone_number,password
  60. from users WHERE login=%s AND password=%s""",
  61. (login, password))
  62. user = self.cursor.fetchone()
  63. if not user:
  64. ErrorMessage('Warning', 'Invalid Username And Password')
  65. raise Exception("USER NOT EXISTS")
  66.  
  67. # creat instance of user in current session
  68. Current_User.set(user)
  69.  
  70. # !!!!!!!!
  71. if Current_User.status == "admin":
  72. self.parent().replace_with(AdminWindow())
  73. else:
  74. self.parent().replace_with(ProfileWindow())
  75.  
  76. except Exception as e:
  77. self.connect.rollback()
  78. print(e)
  79.  
  80. # обработка нажатия на "enter"
  81. def keyPressEvent(self, event):
  82. if event.key() == Qt.Key_Return and self.ui.line_login.hasFocus() \
  83. and self.ui.line_password.hasFocus():
  84. self.__execute_login()
  85.  
  86.  
  87. class ProfileWindow(QProfile):
  88. def __init__(self, parent=None):
  89. QProfile.__init__(self, parent)
  90. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  91. self.cursor = self.connect.cursor()
  92.  
  93. self.ui = Ui_Profile()
  94. self.ui.setupUi(self)
  95.  
  96. # self.ui.button_buy.clicked.connect(lambda: self.parent().replace_with(BuyTicketWindow()))
  97. self.ui.button_change.clicked.connect(lambda: self.parent().replace_with(ChangeInfoWindow()))
  98.  
  99. # display user info
  100. self.ui.label_name.setText(Current_User.name if Current_User.name != "" else "[No data]")
  101. self.ui.label_surname.setText(Current_User.surname if Current_User.name != "" else "[No data]")
  102. self.ui.label_login.setText(Current_User.login if Current_User.login != "" else "[No data]")
  103. self.ui.label_password.setText(Current_User.password if Current_User.password != "" else "[No data]")
  104. self.ui.label_passport.setText(Current_User.passport_num if Current_User.passport_num != "" else "[No data]")
  105. self.ui.label_phone.setText(Current_User.phone_number if Current_User.phone_number != "" else "[No data]")
  106.  
  107. # combobox: watch a list of bought tickets
  108. self.cursor.execute("SELECT ticket_id from tickets WHERE user_id=%s", (Current_User.user_id,))
  109. result = self.cursor.fetchall()
  110. for ticket in result:
  111. self.ui.comboBox_tickets.addItem(str(ticket))
  112.  
  113. self.ui.comboBox_tickets.activated[str].connect(self.do_sth)
  114.  
  115. def do_sth(self, text):
  116. Current_Ticket.set(int(text[1:-2]))
  117. print(int(text[1:-2]))
  118. self.parent().replace_with(TicketWindow())
  119.  
  120. def __del__(self):
  121. self.cursor.close()
  122. self.connect.close()
  123. self.ui = None
  124.  
  125.  
  126. class RegistrationWindow(QRegistration):
  127. def __init__(self, parent=None):
  128. QRegistration.__init__(self, parent)
  129. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  130.  
  131. self.ui = Ui_WindowRegistration()
  132. self.ui.setupUi(self)
  133.  
  134. self.ui.sign_up_button.clicked.connect(self.__execute_sign)
  135.  
  136. def __execute_sign(self):
  137. try:
  138. self.cursor = self.connect.cursor()
  139. name = self.ui.line_name.text()
  140. surname = self.ui.line_surname.text()
  141. passport = self.ui.line_passport.text()
  142. login = self.ui.line_login.text()
  143. password = self.ui.line_password.text()
  144.  
  145. self.cursor.execute(
  146. "INSERT INTO users (name, surname,passport_num,login,password) VALUES (%s,%s,%s,%s,%s)",
  147. (name, surname, passport, login, password))
  148. self.connect.commit()
  149.  
  150. # creat instance of user in current session
  151. self.cursor.execute("SELECT user_id from users WHERE passport_num=%s", (passport,))
  152. user_id = self.cursor.fetchone()
  153. user = (user_id[0], name, surname, login, "user", passport, None, password)
  154. Current_User.set(user)
  155. # end of creating
  156.  
  157. self.parent().replace_with(ProfileWindow())
  158.  
  159. except Exception as e:
  160. self.connect.rollback()
  161. print(e)
  162.  
  163. def __del__(self):
  164. self.cursor.close()
  165. self.connect.close()
  166. self.ui = None
  167.  
  168.  
  169. class MainWindow(QMainWindow):
  170. def __init__(self, parent=None):
  171. QMainWindow.__init__(self, parent)
  172. self.ui = Ui_MainWindow()
  173. self.ui.setupUi(self)
  174.  
  175. # переходим на окно log in
  176. self.current_widget = LogInWindow()
  177. self.ui.main_layout.addWidget(self.current_widget)
  178.  
  179. def replace_with(self, new_widget):
  180. print(str(new_widget))
  181. print(str(self.current_widget))
  182. self.ui.main_layout.replaceWidget(self.current_widget, new_widget)
  183. self.current_widget.setParent(None)
  184. self.current_widget = new_widget
  185.  
  186. def __del__(self):
  187. self.ui = None
  188.  
  189.  
  190. class ChangeInfoWindow(QChangeInfo):
  191. def __init__(self, parent=None):
  192. QChangeInfo.__init__(self, parent)
  193. self.ui = Ui_WindowChangeInfo()
  194. self.ui.setupUi(self)
  195.  
  196. self.ui.nameLine.setText(Current_User.name)
  197. self.ui.surnameLine.setText(Current_User.surname)
  198. self.ui.passporLine.setText(Current_User.passport_num)
  199. self.ui.phoneLine.setText(Current_User.phone_number)
  200. self.ui.loginLine.setText(Current_User.login)
  201. self.ui.passwordLine.setText(Current_User.password)
  202.  
  203. self.ui.buttonDone.clicked.connect(self.saveInfo)
  204.  
  205. # saves new information about user, checks it for validity
  206. def saveInfo(self):
  207. newName = self.ui.nameLine.text()
  208. newSurname = self.ui.surnameLine.text()
  209. newPassport = self.ui.passporLine.text()
  210. newPhone = self.ui.phoneLine.text()
  211. newLogin = self.ui.loginLine.text()
  212. newPassword = self.ui.passwordLine.text()
  213.  
  214. try:
  215. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  216. self.cursor = self.connect.cursor()
  217. self.cursor.execute("""SELECT user_id FROM users WHERE passport_num = %s""", (newPassport,))
  218. duplicated_users = self.cursor.fetchall()
  219. if len(duplicated_users)==2:
  220. ErrorMessage('Error', 'This user already exists')
  221. raise Exception("USER ALREADY EXISTS")
  222.  
  223. self.cursor.execute("""SELECT user_id FROM users WHERE login = %s""", (newLogin,))
  224. duplicated_users = self.cursor.fetchall()
  225. if len(duplicated_users)==2:
  226. ErrorMessage('Error', 'The user with this login already exists')
  227. raise Exception("USER WITH THIS LOGIN ALREADY EXISTS")
  228.  
  229. self.cursor.execute(
  230. """UPDATE users SET name = %s, surname=%s, login=%s, password=%s, passport_num=%s, phone_number=%s WHERE user_id=%s""",
  231. (newName, newSurname, newLogin, newPassword, newPassport, newPhone,Current_User.user_id))
  232.  
  233. self.connect.commit()
  234. except Exception as e:
  235. self.connect.rollback()
  236. print(e)
  237. # Modify user in current session
  238. Current_User.set((Current_User.user_id, newName, newSurname, newLogin, "user", newPassport, newPhone,
  239. newPassword))
  240.  
  241. self.parent().replace_with(ProfileWindow())
  242.  
  243. def __del__(self):
  244. self.cursor.close()
  245. self.connect.close()
  246. self.ui = None
  247.  
  248.  
  249. class TicketWindow(QTicket):
  250. def __init__(self, parent=None):
  251. QTicket.__init__(self, parent)
  252. self.ui = Ui_WindowTicket()
  253. self.ui.setupUi(self)
  254. try:
  255. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  256. self.cursor = self.connect.cursor()
  257.  
  258. # getting info about ticket from db
  259. self.cursor.execute("""SELECT flight_id, plane_id, seat_id, tariff_id FROM tickets WHERE ticket_id=%s""",
  260. (Current_Ticket.ticket_id,))
  261. ticket = self.cursor.fetchone()
  262. # здесь нужно добавить rowFactory в перспективе
  263. self.cursor.execute("""SELECT departure, destination FROM flights WHERE flight_id = %s""", (ticket[0],))
  264. flightDirection = self.cursor.fetchone()
  265. self.cursor.execute("""SELECT company FROM planes WHERE plane_id=%s""", (ticket[1],))
  266. airline = self.cursor.fetchone()
  267. self.cursor.execute("""SELECT price, large_luggage FROM tariff WHERE tariff_id = %s""", (ticket[3],))
  268. tariff = self.cursor.fetchone()
  269. except Exception as e:
  270. self.connect.rollback()
  271. print(e)
  272.  
  273. # putting info into window
  274. outDeparture = self.ui.departure
  275. outDeparture.setText(flightDirection[0])
  276.  
  277. outDestination = self.ui.destination
  278. outDestination.setText(flightDirection[1])
  279.  
  280. outAirline = self.ui.airline
  281. outAirline.setText(airline[0])
  282.  
  283. outSeat = self.ui.seat
  284. outSeat.setText(str(ticket[2]))
  285.  
  286. outPrice = self.ui.price
  287. outPrice.setText(str(tariff[0]))
  288.  
  289. outLuggage = self.ui.lagguge
  290. outLuggage.setText("Услуга куплена" if tariff[1] else "Услуга не куплена")
  291.  
  292. self.ui.pushButtonOk.clicked.connect(
  293. lambda: self.parent().replace_with(ProfileWindow())
  294. )
  295.  
  296. self.ui.returnTicket.clicked.connect(self.returnTick)
  297.  
  298. def returnTick(self):
  299. self.cursor.execute("""DELETE FROM tickets WHERE ticket_id = %s""", (Current_Ticket.ticket_id,))
  300. self.connect.commit()
  301. self.parent().replace_with(ProfileWindow())
  302.  
  303. def __del__(self):
  304. self.cursor.close()
  305. self.connect.close()
  306. self.ui = None
  307.  
  308.  
  309. class AdminWindow(QAdmin):
  310. def __init__(self, parent=None):
  311. QAdmin.__init__(self, parent)
  312.  
  313. self.ui = Ui_Admin()
  314. self.ui.setupUi(self)
  315.  
  316. try:
  317. self.connect = psycopg2.connect(database='db_project', user='kirill', host='localhost', password='25112458')
  318. self.cursor = self.connect.cursor()
  319. except Exception as e:
  320. self.connect.rollback()
  321. print(e)
  322.  
  323. self.user_field_fill()
  324. self.flight_field_fill()
  325.  
  326. # self.ui.user_field.itemDoubleClicked.connect(self.user_profile)
  327. self.ui.flight_field.itemClicked.connect(self.flight_edit)
  328. self.ui.backButton.clicked.connect(lambda: self.parent().replace_with(LogInWindow()))
  329. self.ui.adminLogin.setText("You are: "+str(Current_User.login))
  330.  
  331. def user_field_fill(self):
  332. try:
  333. self.cursor.execute("""SELECT name || ' ' || surname, user_id FROM users""")
  334. for user in self.cursor.fetchall():
  335. self.ui.user_field.addItem(str(user[0]) + " (user id = " + str(user[1]) + ")")
  336. except Exception as e:
  337. self.connect.rollback()
  338. print(e)
  339.  
  340. def flight_field_fill(self):
  341. try:
  342. self.cursor.execute("""SELECT departure, destination, flight_id FROM flights""")
  343. for flight in self.cursor.fetchall():
  344. self.ui.flight_field.addItem(
  345. "departure - destination: " + str(flight[0]) + " ---> " + str(flight[1]) + " (flight_id = " + str(
  346. flight[2]) + ")")
  347. except Exception as e:
  348. self.connect.rollback()
  349. print(e)
  350.  
  351. # def user_profile(self):
  352. # selected_item = self.ui.user_field.currentItem()
  353. # user_id = int(re.findall('\d+', selected_item.text())[0])
  354. # try:
  355. # self.cursor.execute(
  356. # """SELECT user_id, name ,surname, login , status, passport_num,
  357. # phone_number,password
  358. # from users WHERE user_id=%s""", (user_id,))
  359. # user = self.cursor.fetchone()
  360. # Current_User.set(user)
  361. # except Exception as e:
  362. # self.connect.rollback()
  363. # print(e)
  364. # self.parent().replace_with(ProfileWindow())
  365.  
  366. def flight_edit(self):
  367. selected_item = self.ui.flight_field.currentItem()
  368. flight_id = int(re.findall('\d+', selected_item.text())[0])
  369. try:
  370. self.cursor.execute("""SELECT departure, destination FROM flights WHERE flight_id =%s""",(flight_id,))
  371. current_flight = self.cursor.fetchone()
  372. self.ui.line_depart.setText(current_flight[0])
  373. self.ui.line_dest.setText(current_flight[1])
  374. # self.ui.backButton.clicked.disconnect()
  375. except Exception as e:
  376. self.connect.rollback()
  377. print(e)
  378.  
  379. class Ticket():
  380. def __init__(self):
  381. self.ticket_id = None
  382.  
  383. def set(self, ticket=None):
  384. self.ticket_id = ticket
  385.  
  386.  
  387. class User():
  388. def __init__(self):
  389. self.user_id = None
  390. self.name = ""
  391. self.surname = ""
  392. self.login = ""
  393. self.status = "user"
  394. self.passport_num = ""
  395. self.phone_number = ""
  396. self.password = ""
  397.  
  398. def set(self, user=(None, "", "", "", "user", "", "", "")):
  399. self.user_id = user[0]
  400. self.name = user[1]
  401. self.surname = user[2]
  402. self.login = user[3]
  403. self.status = user[4]
  404. self.passport_num = user[5]
  405. self.phone_number = user[6]
  406. self.password = user[7]
  407.  
  408.  
  409. if __name__ == '__main__':
  410. # пользователь в сессии
  411. global Current_User
  412. Current_User = User()
  413. global Current_Ticket
  414. Current_Ticket = Ticket()
  415.  
  416. app = QApplication(sys.argv)
  417. # создаем окно
  418. w = MainWindow()
  419. w.setWindowTitle("Air ticket")
  420. w.show()
  421.  
  422. # w = AdminWindow()
  423. # w.setWindowTitle("ajksnd")
  424. # w.show()
  425.  
  426. # enter tha main loop
  427. sys.exit(app.exec_())
Add Comment
Please, Sign In to add comment