#!/usr/bin/env python3 # Copyright 2018 Abdulkadir Furkan Şanlı # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sqlite3 import time def connect_database(file): """ Creates and returns Connection object. :param file: database file """ conn = sqlite3.connect(file) return conn def get_data(conn): """ Requests student ID and returns integer tuple (id, class) with valid student id and corresponding class no. :param conn: Connection object """ try: id = int(input("Please enter student ID: ")) cur = conn.cursor() cur.execute("SELECT id, student_class FROM students") ids = cur.fetchall() for x in ids: # ids is list with single value tuples if id == x[0]: # return tuple x with valid id and corresponding class no. return x else: raise ValueError except ValueError: print("Incorrect ID, try again.") return get_data(conn) def select_final_time(conn, day, stud): """ Returns ending time of final lesson student must attend, or None. :param conn: Connection object :param day: current weekday, lowercase str :param stud: tuple with student ID no. and class no., int """ cur = conn.cursor() cur.execute(""" SELECT end_time FROM timetable INNER JOIN students ON g1 = lesson_id OR g2 = lesson_id OR g3 = lesson_id OR g4 = lesson_id OR g5 = lesson_id OR g6 = lesson_id OR lesson_id = 'gu' OR lesson_id = 'tok' WHERE id = ? AND day = ? AND lesson_class = ? ORDER BY end_time DESC LIMIT 1 """, (stud[0], day, stud[1])) finish = cur.fetchone() if str(type(finish)) == "": return finish[0] else: return finish def parse_time_string(timestring): """ Parses given 24h time string of format "HH:MM" into struct_time. :param timestring: time string "HH:MM" """ structtime = time.strptime(timestring, "%H:%M") return structtime def main(): print("ib-clearance") print("============") conn = connect_database("database.db") while True: id = get_data(conn) day = time.strftime("%A").lower() finish_time = select_final_time(conn, day, id) current_time = time.strftime("%H:%M") if finish_time == None: print("Student has no lessons today, clear to leave.") elif parse_time_string(finish_time) < parse_time_string(current_time): print("Student has finished for today, clear to leave.") else: print("Student still has lessons, clearance not granted.") if input("Enter y to run again.") != "y": break # Run main() if script is run standalone. if __name__ == "__main__": main()