Skip to content

Commit

Permalink
Merge branch 'feature/daily-loaner' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
adamsher committed May 16, 2023
2 parents df3c83e + 27dada4 commit 3a0129a
Show file tree
Hide file tree
Showing 8 changed files with 530 additions and 4 deletions.
76 changes: 74 additions & 2 deletions src/devicekiosk.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ class KioskMode(Enum):
class ServiceMode(Enum):
dropoff = 1
pickup = 2
dailyDeviceBorrow = 3
dailyChargerBorrow = 4
dailyDeviceReturn = 5
dailyChargerReturn = 6

class UI(QObject):
majorVersion = 1
Expand All @@ -38,6 +42,7 @@ class UI(QObject):
# Signals are special functions that allow a message to be sent from Python to QML UI
# Instead of calling like a regular function, we call them as:
# self.[signal].emit(argument)
showDailyLoanersSignal = Signal(None)
showUserSignal = Signal(None)
showEmailScreenSignal = Signal(None)
startOverSignal = Signal(None)
Expand All @@ -56,6 +61,10 @@ class UI(QObject):
showFinishSignal = Signal(None)
showEOYReturnSignal = Signal(None)
showEOYStartSignal = Signal(None)
showDailyLoanerDeviceScreenSignal = Signal(None)
showDailyLoanerChargerScreenSignal = Signal(None)
showFinishDailyBorrowSignal = Signal(None)
showFinishDailyReturnSignal = Signal(None)

firstName = ""
lastName = ""
Expand All @@ -75,6 +84,7 @@ def loadConfig(self):
path = os.path.dirname(os.path.abspath(__file__))
configFile = os.path.join(path,'config.yml')
self.config = yaml.safe_load(open(configFile))
print("devicekiosk.py daily loaner status: " + str(self.config["show_daily_loaner"]))

# def toEmail(self):
# print("loading new qml")
Expand Down Expand Up @@ -125,6 +135,14 @@ def startOver(self):
# else:
# self.showDeviceSignal.emit()

@Slot()
def showHideDailyLoaners(self):
if (self.config["show_daily_loaner"] == True):
print("showing daily loaners")
self.showDailyLoanersSignal.emit()
else:
print("keeping daily loaners hidden")

@Slot(list)
def submitUser(self, userInfo):
print(userInfo)
Expand All @@ -137,8 +155,15 @@ def submitUser(self, userInfo):
self.studentID = self.studentID.replace(" ", "")
self.emailAddress = self.firstName + self.lastName + self.studentID + "@tolland.k12.ct.us"
print("Student email is: " + self.emailAddress)
print("Service mode is: " + str(self.serviceMode))
if (self.serviceMode == ServiceMode.dropoff):
self.showDescriptionSignal.emit()
elif (self.serviceMode == ServiceMode.dailyDeviceBorrow):
print("Python daily device mode")
self.showDailyLoanerDeviceScreenSignal.emit()
elif (self.serviceMode == ServiceMode.dailyChargerBorrow):
print("Python daily charger mode")
self.showDailyLoanerChargerScreenSignal.emit()
else:
self.showReturnSignal.emit()

Expand Down Expand Up @@ -195,14 +220,61 @@ def submitLoaner(self, serial):
self.loanerSerialNumber = serial
# Remove superflous spaces
self.loanerSerialNumber = self.loanerSerialNumber.replace(" ", "")
self.showSubmitSignal.emit()
if (self.serviceMode == ServiceMode.dailyDeviceBorrow):
self.sendDailyEmail()
self.showFinishDailyBorrowSignal.emit()
elif (self.serviceMode == ServiceMode.dailyChargerBorrow):
self.sendDailyEmail()
self.showFinishDailyBorrowSignal.emit()
else:
self.showSubmitSignal.emit()

def sendDailyEmail(self):
msg = EmailMessage()
if (self.serviceMode == ServiceMode.dailyDeviceBorrow):
msg['Subject'] = f'Daily loaner device borrowed by: ' + self.firstName + ' ' + self.lastName
body = self.firstName + " " + self.lastName + " has borrowed a daily loaner device.\nStudent Number: " + self.studentID + "\nLoaner Device Serial Number: " + self.loanerSerialNumber
msg.set_content(body)
elif (self.serviceMode == ServiceMode.dailyDeviceReturn):
msg['Subject'] = f'Daily loaner device returned by: ' + self.firstName + ' ' + self.lastName
body = self.firstName + " " + self.lastName + " has returned a daily loaner device.\nStudent Number: " + self.studentID + "\nLoaner Device Serial Number: " + self.loanerSerialNumber
msg.set_content(body)
elif (self.serviceMode == ServiceMode.dailyChargerBorrow):
msg['Subject'] = f'Daily loaner charger borrowed by: ' + self.firstName + ' ' + self.lastName
body = self.firstName + " " + self.lastName + " has borrowed a daily loaner charger.\nStudent Number: " + self.studentID + "\nLoaner Charger Serial Number: " + self.loanerSerialNumber
msg.set_content(body)
elif (self.serviceMode == ServiceMode.dailyChargerReturn):
msg['Subject'] = f'Daily loaner charger returned by: ' + self.firstName + ' ' + self.lastName
body = self.firstName + " " + self.lastName + " has returned a daily loaner charger.\nStudent Number: " + self.studentID + "\nLoaner Charger Serial Number: " + self.loanerSerialNumber
msg.set_content(body)
msg['From'] = self.config["smtp_user"]
msg['To'] = self.config["daily_email_list"]

# Send the message via Gmail SMTP server
s = smtplib.SMTP("smtp.gmail.com", 587)
s.ehlo()
s.starttls()
s.login(self.config["smtp_user"], self.config["smtp_password"])
try:
s.send_message(msg)
except smtplib.SMTPException as ex:
self.errorMessage = ex
s.close()

@Slot('QString')
def submitReturn(self, serial):
self.loanerSerialNumber = serial
# Remove superflous spaces
self.loanerSerialNumber = self.loanerSerialNumber.replace(" ", "")
self.showPickupSignal.emit()
if (self.serviceMode == ServiceMode.pickup):
self.showPickupSignal.emit()
else:
self.returnDailyLoaner()

def returnDailyLoaner(self):
print("python: returning daily loaner")
self.sendDailyEmail()
self.showFinishDailyReturnSignal.emit()

# Submit the QML form from Submit.qml
@Slot()
Expand Down
99 changes: 99 additions & 0 deletions src/qml/DailyLoanerCharger.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Layouts

Item {

function verifyForm() {
if (inputSerial.text.toString().length > 0) {
btnNext.enabled = true
}
else {
btnNext.enabled = false
}
}

function setFocus() {
inputSerial.focus = true
inputSerial.forceActiveFocus()
}

ColumnLayout {
anchors.fill: parent
// spacing: 2

Text {
id: txtEmail
Layout.fillWidth: true
Layout.fillHeight: true

text: "Take a charger from the 'loaner' area. This charger *must* be returned by the end of the school day. Use the barcode scanner to scan the barcode sticker on the charger."
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
font.pointSize: 30

}

// AnimatedImage {
// id: image
// Layout.alignment: Qt.AlignHCenter
// source: "../images/loaner.gif"
// fillMode: Image.Image.PreserveAspectCrop
// }


TextField {
id: inputSerial
// placeholderText: qsTr("Email Address")
font.pointSize: 20
Layout.fillWidth: true
Layout.fillHeight: true
focus: true
onTextChanged: {
verifyForm()
}

Component.onCompleted: {
// console.log("inputEmail loaded")
this.focus = true
this.forceActiveFocus()
}
}


Button {
id: btnNext
text: "Next"
enabled: false
font.pointSize: 50
Layout.fillWidth: true
Layout.fillHeight: true

onClicked: {
ui.submitLoaner(inputSerial.text)
}
}
Button {
id: bntStartOver
text: "Start Over"
enabled: true
font.pointSize: 50
Layout.fillWidth: true
Layout.fillHeight: true

onClicked: {
ui.startOver()
}
}
}
// Setting focus any other way doesn't seem to work.
// Kind of kludge, but works
Timer {
interval: 100
running: true
repeat: false
onTriggered: setFocus()
}
}
99 changes: 99 additions & 0 deletions src/qml/DailyLoanerDevice.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Layouts

Item {

function verifyForm() {
if (inputSerial.text.toString().length > 0) {
btnNext.enabled = true
}
else {
btnNext.enabled = false
}
}

function setFocus() {
inputSerial.focus = true
inputSerial.forceActiveFocus()
}

ColumnLayout {
anchors.fill: parent
// spacing: 2

Text {
id: txtEmail
Layout.fillWidth: true
Layout.fillHeight: true

text: "Take a laptop from the 'loaner' area. This device *must* be returned by the end of the school day. Use the barcode scanner to scan the barcode sticker on the loaner."
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
font.pointSize: 30

}

// AnimatedImage {
// id: image
// Layout.alignment: Qt.AlignHCenter
// source: "../images/loaner.gif"
// fillMode: Image.Image.PreserveAspectCrop
// }


TextField {
id: inputSerial
// placeholderText: qsTr("Email Address")
font.pointSize: 20
Layout.fillWidth: true
Layout.fillHeight: true
focus: true
onTextChanged: {
verifyForm()
}

Component.onCompleted: {
// console.log("inputEmail loaded")
this.focus = true
this.forceActiveFocus()
}
}


Button {
id: btnNext
text: "Next"
enabled: false
font.pointSize: 50
Layout.fillWidth: true
Layout.fillHeight: true

onClicked: {
ui.submitLoaner(inputSerial.text)
}
}
Button {
id: bntStartOver
text: "Start Over"
enabled: true
font.pointSize: 50
Layout.fillWidth: true
Layout.fillHeight: true

onClicked: {
ui.startOver()
}
}
}
// Setting focus any other way doesn't seem to work.
// Kind of kludge, but works
Timer {
interval: 100
running: true
repeat: false
onTriggered: setFocus()
}
}
Loading

0 comments on commit 3a0129a

Please sign in to comment.