131 lines
3.9 KiB
Python
131 lines
3.9 KiB
Python
from common.inputChecking.typeCheck import validateInput as validateTypeInput
|
|
from common.inputChecking.boolInput import validateInput as validateBoolInput
|
|
|
|
from json import dumps as serialize
|
|
from json import loads as unserialize
|
|
from os.path import isfile
|
|
|
|
class ExitError(Exception):
|
|
pass
|
|
|
|
def boolInput(question, yesNoLetters=('j','n'), exitKeyword='hade'):
|
|
yesLetters = [yesNoLetters[0], yesNoLetters[0].capitalize()]
|
|
while True:
|
|
answer = input(question)
|
|
if answer == exitKeyword:
|
|
raise ExitError
|
|
if validateBoolInput(answer, yesNoLetters):
|
|
return answer in yesLetters
|
|
|
|
def inputTypeCheck(question, type, exitKeyword='hade'):
|
|
while True:
|
|
userInput = input(question)
|
|
if userInput == exitKeyword:
|
|
raise ExitError
|
|
if validateTypeInput(userInput, type):
|
|
return userInput
|
|
|
|
class DataSchema:
|
|
def __init__(
|
|
self,
|
|
genderIsMale = None,
|
|
age = None,
|
|
hasMultipleSubjects = None,
|
|
hasITGK = None,
|
|
avgStudyTime = None
|
|
):
|
|
self.genderIsMale = genderIsMale
|
|
self.age = age
|
|
self.hasMultipleSubjects = hasMultipleSubjects
|
|
self.hasITGK = hasITGK
|
|
self.avgStudyTime = avgStudyTime
|
|
|
|
|
|
class Survey:
|
|
def __init__(self, savePath='./results.json', resultsPath=''):
|
|
self.savePath = savePath
|
|
if resultsPath != '':
|
|
self.resultsPath = resultsPath
|
|
self.loadResults()
|
|
|
|
results = []
|
|
|
|
def loadResults(self):
|
|
try:
|
|
file = open(self.resultsPath, 'r')
|
|
dicts = unserialize(file.read())
|
|
self.results = [DataSchema(**dict) for dict in dicts]
|
|
except FileNotFoundError:
|
|
print('Fant ikke undersøkelsesdata ved', self.resultsPath)
|
|
except Exception as e:
|
|
print('Noe gikk galt under lasting av undersøkelsesdata')
|
|
print(e)
|
|
|
|
def printStats(self):
|
|
print('Resultat av undersøkelse!')
|
|
men = women = multipleChoice = itgk = studyHours = 0
|
|
for result in self.results:
|
|
if result.genderIsMale:
|
|
men += 1
|
|
else:
|
|
women += 1
|
|
multipleChoice += 1 if result.hasMultipleSubjects else 0
|
|
itgk += 1 if result.hasITGK else 0
|
|
studyHours += int(result.avgStudyTime)
|
|
print("Antall kvinner:", women)
|
|
print("Antall menn:", men)
|
|
print("Antall personer som tar fag:", multipleChoice)
|
|
print("Antall personer som tar ITGK:", itgk)
|
|
print("Antall timer i snitt brukt på lekser:", studyHours/len(self.results))
|
|
|
|
def saveResults(self):
|
|
serializedResults = serialize([result.__dict__ for result in self.results])
|
|
|
|
# Check whether file exists
|
|
try:
|
|
assert not isfile(self.savePath)
|
|
except:
|
|
if not boolInput(f'Det eksisterer allerede en fil ved {self.savePath}\nVil du overskrive filen? [j/n]: '):
|
|
return
|
|
|
|
# Try to write data to file.
|
|
try:
|
|
file = open(self.savePath, "w")
|
|
file.write(serializedResults)
|
|
file.close()
|
|
except:
|
|
if boolInput('Noe gikk galt under lagring av data. Vil du prøve igjen? [j/n]: '):
|
|
self.saveResults()
|
|
|
|
def end(self):
|
|
if len(self.results) > 0:
|
|
self.printStats()
|
|
self.saveResults()
|
|
exit(0)
|
|
|
|
def update(self):
|
|
schema = DataSchema()
|
|
|
|
print('Velkommen til spørreundersøkelsen!\n')
|
|
|
|
try:
|
|
schema.genderIsMale = boolInput('Hvilket kjønn er du? [f/m]: ', yesNoLetters=('m','f'))
|
|
schema.age = inputTypeCheck('Hvor gammel er du?: ', int)
|
|
schema.hasMultipleSubjects = boolInput('Tar du et eller flere fag? [j/n]: ')
|
|
|
|
hasITGKQuestion = 'Tar du ITGK? [j/n]: ' if int(schema.age) < 22 else 'Tar du virkelig ITGK? [j/n]: '
|
|
schema.hasITGK = boolInput(hasITGKQuestion)
|
|
schema.avgStudyTime = inputTypeCheck('Hvor mange timer bruker du daglig (i snitt) på lekser?: ', float)
|
|
self.results.append(schema)
|
|
except ExitError:
|
|
self.end()
|
|
print()
|
|
|
|
def loop(self):
|
|
while True:
|
|
self.update()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
survey = Survey(resultsPath='./results.json')
|
|
survey.loop() |