Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
5010CEMgroup6/Home.py
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
331 lines (270 sloc)
11.4 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from email import message | |
import imp | |
from importlib.resources import contents | |
from turtle import title | |
import webbrowser | |
import sqlite3 | |
from async_timeout import timeout | |
from kivy import Config | |
# graphics configuration | |
Config.set('graphics', 'width', '414') | |
Config.set('graphics', 'height', '896') | |
Config.set('graphics', 'minimum_width', '414') | |
Config.set('graphics', 'minimum_height', '896') | |
from kivy.app import App | |
from kivy.uix.label import Label | |
from kivy.uix.button import Button | |
from kivy.uix.textinput import TextInput | |
from kivy.core.window import Window | |
from kivy.lang import Builder | |
from kivy.uix.screenmanager import ScreenManager, Screen | |
from kivy.uix.popup import Popup | |
from kivy.uix.anchorlayout import AnchorLayout | |
from kivy.uix.floatlayout import FloatLayout | |
from kivy.uix.boxlayout import BoxLayout | |
import time | |
import plyer | |
from plyer import notification | |
import gmaps | |
location = "" | |
# define the screens | |
class SplashScreen(Screen): | |
pass | |
class LogInScreen(Screen): | |
pass | |
class RegisterScreen(Screen): | |
pass | |
class RegisterScreencont(Screen): | |
pass | |
class PackageSelectScreen(Screen): | |
pass | |
class Package01Screen(Screen): | |
pass | |
class Package02Screen(Screen): | |
pass | |
class Package03Screen(Screen): | |
pass | |
class Package04Screen(Screen): | |
pass | |
class PaymentScreen(Screen): | |
pass | |
class MapScreen(Screen): | |
pass | |
class Alert(Popup): | |
def __init__(self, title, text): | |
super(Alert, self).__init__() | |
content = AnchorLayout(anchor_x='center', anchor_y='bottom') | |
content.add_widget( | |
Label(text=text, halign='left', valign='top') | |
) | |
ok_button = Button(text='Ok', size_hint=(None, None), size=(Window.width / 10, Window.height / 25)) | |
content.add_widget(ok_button) | |
popup = Popup( | |
title=title, | |
content=content, | |
size_hint=(None, None), | |
size=(Window.width / 1.2, Window.height / 5), | |
auto_dismiss=True, | |
) | |
ok_button.bind(on_press=popup.dismiss) | |
popup.open() | |
Builder.load_file('gui.kv') | |
DB_PATH = 'database_file.db' | |
TABLE_USER_QUERY = """ | |
CREATE TABLE IF NOT EXISTS User ( | |
carRegNo varchar(30) PRIMARY KEY, | |
firstName varchar(100) NOT NULL, | |
lastName varchar(100) NOT NULL, | |
vehicleType varchar(50) NOT NULL, | |
contactNo varchar(30) NOT NULL, | |
password varchar(100) NOT NULL | |
) | |
""" | |
class CarWash(App): | |
def build(self): | |
Window.clearcolor = (0.08,0.21,0.41,0) | |
self.sm = ScreenManager() | |
# set app pages | |
self.splashPage = SplashScreen(name='splash') | |
self.loginPage = LogInScreen(name='logIn') | |
self.registerPage = RegisterScreen(name='register') | |
self.registerContPage = RegisterScreencont(name='registercont') | |
self.packageSelection = PackageSelectScreen(name='pakcage_selection') | |
self.package01Page = Package01Screen(name='package01') | |
self.package02Page = Package02Screen(name='package02') | |
self.package03Page = Package03Screen(name='package03') | |
self.package04Page = Package04Screen(name='package04') | |
self.paymentPage = PaymentScreen(name="payment") | |
self.mapPage = MapScreen(name="map") | |
# add all pages to the root | |
self.sm.add_widget(self.splashPage) | |
self.sm.add_widget(self.loginPage) | |
self.sm.add_widget(self.registerPage) | |
self.sm.add_widget(self.registerContPage) | |
self.sm.add_widget(self.packageSelection) | |
self.sm.add_widget(self.package01Page) | |
self.sm.add_widget(self.package02Page) | |
self.sm.add_widget(self.package03Page) | |
self.sm.add_widget(self.package04Page) | |
self.sm.add_widget(self.paymentPage) | |
self.sm.add_widget(self.mapPage) | |
# create DB with User Table | |
conn = sqlite3.connect(DB_PATH) | |
cursor = conn.cursor() | |
cursor.execute(TABLE_USER_QUERY) | |
conn.commit() | |
conn.close() | |
notifyMe('Offers', 'Offers from as little as £2.99, register now or login') | |
return self.sm | |
def register(self): | |
ids = self.registerPage.ids | |
firstName = ids.first_name.text.strip() | |
lastName = ids.last_name.text.strip() | |
carRegNo = ids.car_reg_no.text.strip() | |
vehicleType = ids.vehicle_type.text.strip() | |
if firstName == "" or lastName == "" or carRegNo == "" or vehicleType == "" or vehicleType == "Select from the Dropdown Menu": | |
Alert(title='Error', text='All input fields required!') | |
else: | |
conn = sqlite3.connect(DB_PATH) | |
cursor = conn.cursor() | |
cursor.execute("SELECT carRegNo FROM User WHERE carRegNo = :carRegNo", {'carRegNo' : carRegNo}) | |
if len(cursor.fetchall()) == 0: | |
self.cahced_user = {"firstName" : firstName, "lastName" : lastName, "carRegNo" : carRegNo, "vehicleType" : vehicleType} | |
self.sm.switch_to(self.registerContPage, direction='left') | |
else: | |
Alert(title='Error', text='Car Registration Number\n Already Exists!') | |
conn.close() | |
def registerCont(self): | |
ids = self.registerContPage.ids | |
contactNo = ids.contactNo.text.strip() | |
password = ids.password.text.strip() | |
confirmedPassword = ids.confirmedPassword.text.strip() | |
if contactNo == "" or password == "" or confirmedPassword == "": | |
Alert(title='Error', text='All input fields required!') | |
elif len(password) < 4: | |
Alert(title='Error', text='Password required atleast 4 characters!') | |
elif password != confirmedPassword: | |
Alert(title='Error', text="Password doesn't match \nwith confirmed password!") | |
else: | |
# register user | |
self.cahced_user["contactNo"] = contactNo | |
self.cahced_user["password"] = password | |
conn = sqlite3.connect(DB_PATH) | |
cursor = conn.cursor() | |
cursor.execute("INSERT INTO User VALUES (:carRegNo, :firstName, :lastName, :vehicleType, :contactNo, :password)", { | |
'carRegNo' : self.cahced_user["carRegNo"], | |
'firstName': self.cahced_user["firstName"], | |
'lastName': self.cahced_user["lastName"], | |
'vehicleType': self.cahced_user["vehicleType"], | |
'contactNo': self.cahced_user["contactNo"], | |
'password': self.cahced_user["password"] | |
}) | |
conn.commit() | |
conn.close() | |
Alert(title='Success', text="Registration Success!") | |
self.sm.switch_to(self.loginPage, direction='right') | |
def on_login(self): | |
conn = sqlite3.connect(DB_PATH) | |
cursor = conn.cursor() | |
cursor.execute("SELECT carRegNo FROM User WHERE carRegNo = :carRegNo AND password = :password", | |
{'carRegNo' : self.loginPage.ids.carRegNo.text, 'password' : self.loginPage.ids.password.text}) | |
records = cursor.fetchall() | |
conn.close() | |
if len(records) == 0: | |
Alert(title='Failed', text="Car Registration or Password is Invalid!") | |
else: | |
self.sm.switch_to(self.mapPage) | |
offers() | |
notifyMe('Special offers', 'Offers from as little as £2.99') | |
def logout(self): | |
for child in reversed(self.loginPage.ids.grid.children): | |
if isinstance(child, TextInput): | |
child.text = '' | |
self.sm.switch_to(self.splashPage) | |
def map(self,instance): | |
global location | |
myid= instance.gid | |
if myid == "mega": | |
location = "Mega Hand Car Wash" | |
elif myid == "super": | |
location = "Superwash Car Wash" | |
elif myid == "zefi": | |
location = "Zefi Hand Car Wash" | |
def buy(self,package="package 1"): | |
if package == "package 1": | |
self.price = 2.99 | |
self.packageName = "Starter" | |
elif package == "package 2": | |
self.price = 5.99 | |
self.packageName = "Intermediate" | |
elif package == "package 3": | |
self.price = 9.99 | |
self.packageName = "Premium" | |
else: | |
# package 4 | |
self.price = 17.99 | |
self.packageName = "Quite literally" | |
self.sm.switch_to(self.paymentPage, direction='left') | |
def pay(self): | |
global location | |
ids = self.paymentPage.ids | |
paymentType = ids.payment_type.text.strip() | |
if paymentType == "" or paymentType == "Payment Option": | |
Alert(title="Error", text="Select a payment method!") | |
elif paymentType == "Cash": | |
Alert(title="Success", text=f"You have selected {self.packageName} \nwhich cost £{self.price}.\nThank you we await you in "+ location + ".") | |
self.sm.switch_to(self.packageSelection, direction='right') | |
else: | |
Alert(title="Info", text=f"You will be redirected to paypal\nweb page to proceed the payment.") | |
self.sm.switch_to(self.packageSelection, direction='right') | |
webbrowser.open(f'http://127.0.0.1:5000?package_name={self.packageName}&price={self.price}') | |
def on_package_01(self): | |
self.sm.switch_to(self.package01Page, direction='left') | |
def on_package_02(self): | |
self.sm.switch_to(self.package02Page, direction='left') | |
def on_package_03(self): | |
self.sm.switch_to(self.package03Page, direction='left') | |
def on_package_04(self): | |
self.sm.switch_to(self.package04Page, direction='left') | |
def go_to_package_selection_page(self): | |
self.sm.switch_to(self.packageSelection, direction='left') | |
def back_to_package_selection_page(self): | |
self.sm.switch_to(self.packageSelection, direction='right') | |
def go_to_login_page(self): | |
self.sm.switch_to(self.loginPage, direction='left') | |
def go_to_map_page(self): | |
self.sm.switch_to(self.mapPage, direction='left') | |
def back_to_map_page(self): | |
self.sm.switch_to(self.mapPage, direction='right') | |
def back_to_reg_page_1(self): | |
self.sm.switch_to(self.registerPage, direction='right') | |
def go_to_register_page(self): | |
self.sm.switch_to(self.registerPage, direction='left') | |
def go_back_to_splash_page(self): | |
self.sm.switch_to(self.splashPage, direction='right') | |
def go_back_to_home_page(self): | |
self.sm.switch_to(self.packageSelection, direction='right') | |
notifyMe('Offers', 'Offers from as little as £2.99') | |
# notifcation for offers upon login | |
class offers(Popup): | |
def __init__(self): | |
layout = AnchorLayout(anchor_x='center', anchor_y="top") | |
layout.add_widget( | |
Label(text='Offers starting from as litte as £2.99', halign='left', valign='top') | |
) | |
notify = Popup( | |
title='Special offers',content=layout,size_hint=(None, None),size=(Window.width , Window.height / 6),pos_hint={'center': .9 , 'top': 1}, | |
#Done the notification but need to make sure it shows on the user device, showing a couple time where necessary | |
) | |
X = Button(text='X', size_hint=(None, None), size=(20, 20)) | |
layout.add_widget(X) | |
X.bind(on_press=notify.dismiss) | |
notify.open() | |
# notifcation to the users os. | |
def notifyMe(title, message): | |
i =0 | |
while i < 1: | |
plyer.notification.notify(title=title, message=message, app_icon='logo.png', timeout=3) | |
i += 1 | |
if __name__ == "__main__": | |
CarWash().run() |