#!/usr/bin/python import cgitb; cgitb.enable() import cgi import os import eva_core from eva_html import * from eva_db import Participator, Survey, Questionnaire, Feedback # Wenn eine andere Datenbank als Postgres verwendet wird, einfach das # folgende Modul durch ein entsprechendes austauschen from eva_pg import Database # Als erstes die uebergebenen Parameter auslesen params = cgi.FieldStorage() # Jetzt Konfigurations- und Sprachdatei laden confobj = eva_core.get_confobj() langobj = eva_core.get_langobj(confobj, "de") # Verbindung mit Datenbank erstellen. Die benoetigten Daten # (Name der Datenbank, Benutzername) muessen in der Konfigurationsdatei # vorhanden sein. dbo = Database(confobj) error = 1 version = "2.0" if params.has_key("action"): if params["action"].value == "save": # Antworten speichern, aber noch nicht submitten key = params["k"].value p = Participator(dbo) if p.load(key): # Lade Teilnehmer # Teilnehmer erfolgreich geladen. # Versuche passenden Fragebogen zu laden questionnaire = Questionnaire(dbo) questionnaire.load(params["q"].value) questionnaire.load_entries() # Die alten Daten loeschen p.del_feedbacks(questionnaire.get_survey().get_id()) # Nun die Daten in DB eintragen has_fillout_something = 0 for entry in questionnaire.get_entries(): if entry.get_type() == "question": if params.has_key(entry.get_keyword()): has_fillout_something = 1 # Jetzt die entsprechende Antwort speichern # Zuerst einmal schauen, ob da vielleicht mehrere # Antworten gewaehlt wurden (z.B. Mehrfachauswahl) if isinstance(params[entry.get_keyword()], list): for answer in params[entry.get_keyword()]: feedback = Feedback(dbo) #feedback.set_survey(p.get_survey()) feedback.set_survey(questionnaire.get_survey().get_id()) feedback.set_keyword(entry.get_keyword()) feedback.set_return(answer.value) feedback.set_participator(p.get_key()) feedback.set_questionnaire(questionnaire.get_id()) feedback.save() else: feedback = Feedback(dbo) #feedback.set_survey(p.get_survey()) feedback.set_survey(questionnaire.get_survey().get_id()) feedback.set_keyword(entry.get_keyword()) feedback.set_return(params[entry.get_keyword()].value) feedback.set_participator(p.get_key()) feedback.set_questionnaire(questionnaire.get_id()) feedback.save() if has_fillout_something: # Zumindest ein Eintrag wurde abgegeben p.set_submitted(False) p.set_phase_reference(questionnaire.get_survey().get_phase()) p.set_questionnaire(questionnaire.get_id()) p.save() # Jetzt der Bildschirm zum bearbeiten/submitten survey = questionnaire.get_survey() mainpage = HTMLFilloutSaveSubmitPage(confobj, langobj, version, survey.get_questionnaires(), key) else: # Es wurde nichts ausgefuellt. Entsprechende Meldung anzeigen mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_nothing_filled_out"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # Konnte entweder Teilnehmer nicht laden. zeige entsprechende # Fehlermeldung mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_key_invalid"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif params["action"].value == "login": # ... lade zum Schluessel passende Umfrage if params.has_key("k"): key = params["k"].value else: key = "" error = False # Fehler entdeckt? p = Participator(dbo) if p.load(key): # Teilnehmer erfolgreich geladen. Jetzt Umfrage laden survey = Survey(dbo) if not survey.load(p.get_survey()): mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_key_invalid"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) error = True # Jetzt die aktuell laufende Phase laden tmpsurvey = survey.get_running_phase() mainsurvey = survey if survey.get_status() == "running": if tmpsurvey: if p.get_phase_reference() >= tmpsurvey.get_phase() - 1: # Der Teilnehmer hat die vorhergehende Umfrage beantwortet survey = tmpsurvey else: error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_not_participated_last_phase"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif not p.get_phase_reference(): error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_not_participated_last_phase"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: if survey.get_status() == "authoring": error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_survey_authoring"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) #else: # error = True # mainpage = HTMLOKPage( # langobj, # langobj.get("errors", "error"), # langobj.get("fillout", "error_survey_stopped"), # {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_key_invalid"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) if not error: # Daten konnten korrekt geladen werden... x = p.get_phase_reference() if p.get_submitted() or (x and not survey.get_phase_status() == "running") or (x and x < survey.get_phase() and mainsurvey.get_running_phase().get_phase() > x+1) or survey.get_status() == "stopped": # Teilnehmer hat schon submitted (fuer diese oder vorherige Frageboegen) # Zeige also entsprechenden Auswahlbildschirm an... mainpage = HTMLFilloutEvalSelectPage(confobj, langobj, version, mainsurvey, p, key) #mainpage = HTMLFilloutMultiuseSelectPage(confobj, langobj, version, survey.get_questionnaires(), key) elif not p.get_submitted() and p.get_phase_reference() == survey.get_phase(): # Teilnehmer hat Daten fuer diese Phase gespeichert, aber nicht # submitted mainpage = HTMLFilloutSaveSubmitPage(confobj, langobj, version, survey.get_questionnaires(), key) else: # Schluessel ist noch gueltig... # ... lade also die Frageboegen questionnaires = survey.get_questionnaires() if len(questionnaires) < 1: # Keine Frageboegen vorhanden mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_no_questionnaires"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif len(questionnaires) == 1: # Es gibt nur einen Fragebogen... # ... also diesen gleich mal anzeigen # (aber vorher brauche ich noch nen Knopf zum Absenden *g*) hiddenparams = {"k" : key, "action":"save"} button = HTMLImageSubmitButton("submit", "submit", "%s/filloutbutton_next.gif" % confobj.get("paths", "imgdir")) mainpage = HTMLQuestionnairePage( confobj, 0, questionnaires[0], "fillout.cgi", hiddenparams, button) else: # Auswahldialog fuer Frageboegen anzeigen mainpage = HTMLFilloutSelectQuestionnairePage(confobj, langobj, version, questionnaires, key) elif params["action"].value == "action_sel": # Der Benutzer hat eine Auswahl getroffen # ... lade zum Schluessel passende Umfrage key = params["k"].value p = Participator(dbo) error = False # Fehler entdeckt? mainpage = 0 if p.load(key): # Teilnehmer erfolgreich geladen. Jetzt Umfrage laden survey = Survey(dbo) if not survey.load(p.get_survey()): error = True else: # Jetzt passende Phase laden phase = survey.get_phase_by_number(p.get_phase_reference()) # ... und Aktion des Benutzer sollen auf diese angewendet werden survey = phase else: error = True if error: # Beim Laden der Daten ist ein Fehler aufgetreten if not mainpage: mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_key_invalid"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # Daten konnten korrekt geladen werden... if params["selaction"].value == "edit": # Fragebogen anzeigen, den der Benutzer ausgefuellt hat. # Hier checken ob der User zum Edit berechtigt ist if p.get_submitted(): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "already_submitted"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif ((survey.get_status() == "stopped") or (survey.get_status() == "authoring")): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "not_active"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # Jetzt herausfinden, welchen Fragebogen der Teilnehmer beim ausgewaehlt # hatte. questionnaire = Questionnaire(dbo) questionnaire.load(p.get_questionnaire()) p.load_feedback(survey.get_id()) fb = p.get_feedback() hiddenparams = {"k" : key, "action":"save"} button = HTMLImageSubmitButton("submit", "submit", "%s/filloutbutton_next.gif" % confobj.get("paths", "imgdir")) mainpage = HTMLQuestionnairePage( confobj, 0, questionnaire, "fillout.cgi", hiddenparams, button, fb) elif params["selaction"].value == "save": # Rueckmeldung geben, dass die Daten gespeichert wurden hiddenparams = {} mainpage = HTMLOKPage( langobj, langobj.get("fillout", "info"), langobj.get("fillout", "info_saved"), {"title_bg":"green", "title_fg":"white", "body_bg":"white", "body_fg":"black"}, 0, 0, "fillout.cgi", hiddenparams) elif params["selaction"].value == "submit": # Hier checken ob der User zum Submit berechtigt ist if p.get_submitted(): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "already_submitted"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif ((survey.get_status() == "stopped") or (survey.get_status() == "authoring")): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "not_active"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # Feedbacks jetzt abschicken p.submit_feedbacks(survey.get_id()) # User hat submitted p.set_submitted(True) # Anzahl der abgegeb. Stimmen fuer diese Umfrage aktualisieren survey.increase_num_submitted() p.save() # ... und den Benutzer informieren, dass er submitted hat hiddenparams = {"k" : key, "action" : "login"} mainpage = HTMLOKPage( langobj, langobj.get("fillout", "info"), langobj.get("fillout", "info_submitted"), {"title_bg":"green", "title_fg":"white", "body_bg":"white", "body_fg":"black"}, 0, 0, "fillout.cgi", hiddenparams) elif params["selaction"].value == "eval": # Evaluation anzeigen # 1. Feststellen, welche Phase ausgewertet werden soll sid = params["phase"].value phase = Survey(dbo) phase.load(sid) # Hier checken ob der User berechtigt ist, diese Evaluation zu sehen # Ist der User ueberhaupt Teilnehmer der Umfrage? if not phase.is_participator(p.get_key()): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "no_survey_member"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif not p.get_submitted(): mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "not_yet_submitted"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # 1. Festlegen, welche Frageboegen ausgewertet werden: # In diesem Fall alle zur Umfrage gehoerenden eval_questionnaires = [] for questionnaire in phase.get_questionnaires(): eval_questionnaires.append(questionnaire.get_description()) # 2. Auszuwertende Fragen festlegen # In diesem Fall alle Fragen aller Frageboegen eval_questions = [] for questionnaire in phase.get_questionnaires(): for entry in questionnaire.get_entries(): if entry.get_type() == "question": eval_questions.append(entry.get_keyword()) # 3. Jetzt Auswertung erstellen evaluation = phase.evaluate(eval_questionnaires, 0, eval_questions) # 4. ... und anzeigen css_file = confobj.get("paths", "cssdir") + "eva_evaluation.css" mainpage = evaluation.get_htmlpage(langobj, confobj, css_file) elif params["action"].value == "qsel": # Es wurde ein Fragebogen ausgewaehlt, der angezeigt werden soll # Schluessel sollte in "k" stehen, ID des Fragebogens in "q" assert(params.has_key("k") and params.has_key("q")) key = params["k"].value p = Participator(dbo) error = False assert(p.load(key)) # Lade Teilnehmer # Jetzt Umfrage laden survey = Survey(dbo) if not survey.load(p.get_survey()): mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_key_invalid"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) error = True # Jetzt die aktuell laufende Phase laden tmpsurvey = survey.get_running_phase() mainsurvey = survey if survey.get_status() == "running": if tmpsurvey: if p.get_phase_reference() >= tmpsurvey.get_phase() - 1: # Der Teilnehmer hat die vorhergehende Umfrage beantwortet survey = tmpsurvey else: error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_not_participated_last_phase"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) elif not p.get_phase_reference(): error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_not_participated_last_phase"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: if survey.get_status() == "authoring": error = True mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_survey_authoring"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) if not error: # Daten konnten korrekt geladen werden... x = p.get_phase_reference() if p.get_submitted() or (x and not survey.get_phase_status() == "running") or (x and x < survey.get_phase() and mainsurvey.get_running_phase().get_phase() > x+1) or survey.get_status() == "stopped": # Teilnehmer hat schon submitted (fuer diese oder vorherige Frageboegen) # Zeige also entsprechenden Auswahlbildschirm an... mainpage = HTMLFilloutEvalSelectPage(confobj, langobj, version, mainsurveyy, p, key) elif not p.get_submitted() and p.get_phase_reference() == survey.get_phase(): # Teilnehmer hat Daten fuer diese Phase gespeichert, aber nicht # submitted mainpage = HTMLFilloutSaveSubmitPage(confobj, langobj, version, survey.get_questionnaires(), key) else: # Schluessel ist noch gueltig... # ... lade also die Frageboegen questionnaires = survey.get_questionnaires() if len(questionnaires) < 1: # Keine Frageboegen vorhanden mainpage = HTMLOKPage( langobj, langobj.get("errors", "error"), langobj.get("fillout", "error_no_questionnaires"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: questionnaire = Questionnaire(dbo) questionnaire.load(params["q"].value) questionnaire.load_entries() hiddenparams = {"k" : key, "action":"save"} button = HTMLImageSubmitButton("submit", "submit", "%s/filloutbutton_next.gif" % (confobj.get("paths", "imgdir"))) mainpage = HTMLQuestionnairePage( confobj, 0, questionnaire, "fillout.cgi", hiddenparams, button) else: # Unbekannte Aktion wurde angefordet, Fehler abfangen und Nachricht ausgeben mainpage = HTMLDeniedPage( langobj, langobj.get("errors", "access_denied"), langobj.get("fillout", "unknown_action"), {"title_bg":"red", "title_fg":"white", "body_bg":"white", "body_fg":"black"}) else: # ... ansonsten nach Schluessel fragen mainpage = HTMLFilloutLoginPage(confobj, langobj, version) print mainpage if confobj.get("misc", "debug_mode") == "on": print params