Feature Complete

This commit is contained in:
darthsandmann 2016-12-14 22:32:35 +01:00
parent 08eb4edae5
commit aa300044f6
18 changed files with 559 additions and 468 deletions

View File

@ -1,28 +1,49 @@
# Web-Praktikum Gruppe K # Web-Praktikum Gruppe A
## Kai Wansart und Felix Hoster ## Kai Wansart 921862 und Felix Hoster xxxxxx
### 16.11.2016 ### 15.12.2016
## Beschreibung der Lösung ## Beschreibung der Lösung
### Aufgabe der Anwendung: ### Aufgabe der Anwendung:
Die Praktikumsaufgabe war, eine Ünterstützung der Betreuung von Praxisphasen mit einer Web-Anwendung zu erstellen. Praxisphasen werden - Entwickeln und Umsetzen eines Praxisphasenmanagers (PPM).
von externen Partnern (Firmen) angeboten, Studenten können diese Angebote nutzen, wenn sie einen Lehrenden als Betreuer - Schnittstelle für Firmen, Dozenten und Studenten
finden - Verwaltung der Daten, zB. Benutzerverwaltung und Angebotverwaltung
#### Übersicht der fachlichen Funktion #### Übersicht der fachlichen Funktion
- Datenpflege Studenten: Eine Liste mit allen erstellten Studenten (Name, Vorname, Matrikelnummer) - Datenpflege Studenten:
- Datenpflege Lehrende: Eine Übersicht mit allen Lehrenden (Name, Titel, Lehrgebiet) - Ausgabe Studenten im System
- Datenpflege Firmenverzeichniss: Eine Liste mit einer kleinen Übersicht über einzelne Firmen (Schwerpunkt, Sitz, Name, Branche, Mitarbeiteranzahl) - Verwaltung bestehender Datensätze
- Datenpflege Praxisphase: Erhält man eine kurze Übersicht über Angebote für die Studenten (Firmenbetreuer, Beschreibung, Name, Voraussetzung, Firma) - Erstellen neuer Datensätze
- Auswahl Praxisphasen: Dort können die Studenten mit einem Professor sich eine Praxisphase aussuchen - Datenpflege Lehrende:
- Auswertung Firma: Hier werden die Firmen bewertet, die ein Angebot für die Praxisphase bewertet - Ausgabe Lehrenden im System
- Auswertung Praxisphasen nach Studenten: Hier sieht man die Bewertung der Studenten über die einzelnen Angebote - Verwaltung bestehender Datensätze
- Auswertung Praxisphase nach Betreuern: Hier sieht man die Bewertung der Praxisphasen - Betreuer - Erstellen neuer Datensätze
- Datenpflege Firmenverzeichnis:
- Ausgabe Firmen im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Datenpflege Praxisphase:
- Ausgabe Angebote Praxiphasenplätze im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Auswahl Praxisphasen:
- Schnittstelle für Studenten, um sich in Praxisphasenplatz einzuschreiben, mit Angabe von Zeitraum
- Auswertung Firma:
- Ausgabe aller Firmen mit den jeweiligen Studenten, die sich bei Ihnen zu einem Praxisphasenplatz eingeschrieben haben
- Auswertung Praxisphasen nach Studenten:
- Ausgabe aller Studenten mit Informationen, bei welcher Firma sie wann ihre Praxisphase machen / gemacht haben
- Auswertung Praxisphase nach Betreuern:
- Ausgabe aller Betreuer mit den jeweiligen Studenten, die sie betreuen.
## Beschreibung des Servers ## Beschreibung des Servers
#### Zweck #### Zweck
- Firmen die Möglichkeit geben, Studenten Praxisphasenplätze anzubieten
- Studenten die Möglichkeit geben, Praxisphasenplätze auszuwählen
- Auswertungen anbieten
#### Aufbau (Bestandteile der Komponente) #### Aufbau (Bestandteile der Komponente)
-
#### Zusammenwirken mit anderen Komponenten #### Zusammenwirken mit anderen Komponenten

View File

@ -1,332 +0,0 @@
import json
import cherrypy
from app import database
from app import view
#----------------------------------------------------------
class Application_cl(object):
#----------------------------------------------------------
exposed = True
#----------------------------------------------------------
def __init__(self):
#----------------------------------------------------------
self.db_o = database.Database_cl()
self.view_o = view.View_cl()
#----------------------------------------------------------
def GET(self, cat=None, id=None):
#----------------------------------------------------------
return json.dumps(retVal)
#----------------------------------------------------------
def PUT(self, **data):
#----------------------------------------------------------
return json.dumps(retVal)
#----------------------------------------------------------
def POST(self, cat, id, **data_opl):
#----------------------------------------------------------
return json.dumps(retVal)
#----------------------------------------------------------
def DELETE(self, cat, id):
#----------------------------------------------------------
return json.dumps(retVal)
#----------------------------------------------------------
def default(self, *arguments, **kwargs):
#----------------------------------------------------------
msg_s = "unbekannte Anforderung: " + \
str(arguments) + \
' ' + \
str(kwargs)
raise cherrypy.HTTPError(404, msg_s)
# /* import cherrypy
# from .database import Database_cl
# from .view import View_cl
# import collections
# orderedDict = collections.OrderedDict()
# from collections import OrderedDict
# #----------------------------------------------------------
# class Application_cl(object):
# #----------------------------------------------------------
# #-------------------------------------------------------
# # Request Processing
# #-------------------------------------------------------
# #-------------------------------------------------------
# def __init__(self):
# #-------------------------------------------------------
# # spezielle Initialisierung können hier eingetragen werden
# self.db = Database_cl()
# self.view = View_cl()
# @cherrypy.expose
# #-------------------------------------------------------
# def index(self):
# #-------------------------------------------------------
# print("Index\n")
# return self.GenerateIndex()
# @cherrypy.expose
# #-------------------------------------------------------
# def category(self, cat=None):
# #-------------------------------------------------------
# print("Category: ", cat, "\n")
# if(cat==None):
# return self.GenerateIndex()
# else:
# return self.GenerateList(cat)
# @cherrypy.expose
# #-------------------------------------------------------
# def choice(self):
# #-------------------------------------------------------
# print("Choice \n")
# return self.GenerateListChoice()
# @cherrypy.expose
# #-------------------------------------------------------
# def eval(self, cat):
# #-------------------------------------------------------
# print("Eval \n")
# self.db.CheckDates()
# return self.GenerateListEval(cat)
# @cherrypy.expose
# #-------------------------------------------------------
# def detail(self, cat=None, id=None):
# #-------------------------------------------------------
# if(cat!=None):
# if(id!=None):
# print("Cat=", cat, " id=", id)
# return self.GenerateDetail(cat, id)
# else:
# print("ID=None Cat=", cat)
# return self.GenerateDetail(cat)
# else:
# return self.GenerateIndex()
# @cherrypy.expose
# #-------------------------------------------------------
# def detailchoice(self, id):
# #-------------------------------------------------------
# print("id=", id)
# return self.GenerateDetailChoice(id)
# @cherrypy.expose
# #-------------------------------------------------------
# def save(self, cat=None, **data):
# #-------------------------------------------------------
# print("Save: ", cat)
# dataTmp = data
# return self.GenerateSave(dataTmp, cat)
# @cherrypy.expose
# #-------------------------------------------------------
# def saveChoice(self, **data):
# #-------------------------------------------------------
# print("Save: Choice")
# dataTmp = data
# return self.GenerateSaveChoice(dataTmp)
# @cherrypy.expose
# #-------------------------------------------------------
# def delete(self, cat=None, id=None):
# #-------------------------------------------------------
# print("Delete",cat,id)
# return self.GenerateDelete(cat, id)
# @cherrypy.expose
# #-------------------------------------------------------
# def default(self, *arguments, **kwargs):
# #-------------------------------------------------------
# msg_s = "unbekannte Anforderung: " + \
# str(arguments) + \
# ''+ \
# str(kwargs)
# raise cherrypy.HTTPError(404, msg_s)
# default.exposed= True
# #-------------------------------------------------------
# # Functions
# #-------------------------------------------------------
# #-------------------------------------------------------
# def GenerateIndex(self):
# #-------------------------------------------------------
# return self.view.CreateIndex()
# #-------------------------------------------------------
# def GenerateList(self, category):
# #-------------------------------------------------------
# self.db.ReadAll()
# data = {}
# data['content'] = {}
# data['headings'] = {}
# data['category'] = category
# data['content'] = self.db.data[category]
# if(len(data['content']) != 0):
# print(len(data['content']))
# contentFirst = list(data['content'].keys())[0]
# data['headings'] = list(data['content'][contentFirst].keys())
# print(data)
# return self.view.CreateList(data)
# #-------------------------------------------------------
# def GenerateListChoice(self):
# #-------------------------------------------------------
# self.db.ReadAll()
# data = {}
# data['content'] = {}
# offerings = self.db.data['Angebote']
# for key, value in offerings.items():
# for key2, value2 in value.items():
# if(key2 == 'Status'):
# if(value2 == 'Angebot'):
# data['content'][key] = value
# print(data)
# return self.view.CreateListChoice(data)
# #-------------------------------------------------------
# def GenerateDetail(self, category, id=None):
# #-------------------------------------------------------
# self.db.ReadAll()
# data = {}
# data['category'] = category
# print("Detail",category,id)
# if(id != None):
# data['id'] = id
# data['content'] = self.db.ReadEntry(category, id)
# else:
# data['id'] = None
# data['content'] = self.db.GetDefault(category)
# print(data['content'])
# if(category == 'Angebote'):
# print("Angebote")
# data['Firmen'] = self.db.data['Firmen']
# print(data, "\n")
# return self.view.CreateDetail(data)
# #-------------------------------------------------------
# def GenerateDetailChoice(self, id):
# #-------------------------------------------------------
# self.db.ReadAll()
# data = {}
# data['id'] = id
# data = self.db.data['Angebote'][id]
# data['Studenten'] = self.db.data['Studenten']
# data['Lehrender'] = self.db.data['Lehrender']
# print(data, "\n")
# return self.view.CreateDetailChoice(data)
# #-------------------------------------------------------
# def GenerateListEval(self, cat):
# #-------------------------------------------------------
# self.db.ReadAll()
# data = {}
# Studenten = self.db.data['Studenten']
# Lehrender = self.db.data['Lehrender']
# Firmen = self.db.data['Firmen']
# Angebote = self.db.data['Angebote']
# data['category'] = cat
# if(cat == 'Firmen'):
# for keyFirma, valueFirma in sorted(Firmen.items()):
# data[valueFirma['Name']] = {}
# data[valueFirma['Name']]['Name'] = valueFirma['Name']
# data[valueFirma['Name']]['Angebote'] = {}
# data[valueFirma['Name']]['Angebote']['Angebot'] = {}
# data[valueFirma['Name']]['Angebote']['aktuell'] = {}
# data[valueFirma['Name']]['Angebote']['abgeschlossen'] = {}
# for keyAngebote, valueAngebote in Angebote.items():
# if(valueAngebote['Firma'] == valueFirma['Name']):
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']] = {}
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Name'] = valueAngebote['Name']
# if(valueAngebote['Student'] != ''):
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = Studenten[valueAngebote['Student']]['Name']
# else:
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = ''
# if(valueAngebote['Lehrender'] != ''):
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = Lehrender[valueAngebote['Lehrender']]['Name']
# else:
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = ''
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumVon'] = valueAngebote['ZeitraumVon']
# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumBis'] = valueAngebote['ZeitraumBis']
# print(data)
# return self.view.CreateListEval(data)
# elif(cat == 'Studenten'):
# for keyStudent, valueStudent in Studenten.items():
# data[valueStudent['Name']] = {}
# data[valueStudent['Name']]['Angebote'] = {}
# data[valueStudent['Name']]['Angebote']['Angebot'] = {}
# data[valueStudent['Name']]['Angebote']['aktuell'] = {}
# data[valueStudent['Name']]['Angebote']['abgeschlossen'] = {}
# for keyAngebot, valueAngebot in Angebote.items():
# if(valueAngebot['Student'] == valueStudent['id']):
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {}
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Lehrender'] = Lehrender[valueAngebot['Lehrender']]['Name']
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status']
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name']
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma']
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon']
# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis']
# elif(cat == 'Lehrender'):
# for keyLehrende, valueLehrende in Lehrender.items():
# data[valueLehrende['Name']] = {}
# data[valueLehrende['Name']]['Angebote'] = {}
# data[valueLehrende['Name']]['Angebote']['Angebot'] = {}
# data[valueLehrende['Name']]['Angebote']['aktuell'] = {}
# data[valueLehrende['Name']]['Angebote']['abgeschlossen'] = {}
# for keyAngebot, valueAngebot in Angebote.items():
# if(valueAngebot['Lehrender'] == valueLehrende['id']):
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {}
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Student'] = Studenten[valueAngebot['Student']]['Name']
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status']
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name']
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma']
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon']
# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis']
# return self.view.CreateListEval(data)
# #-------------------------------------------------------
# def GenerateSave(self, dataTmp, category):
# #-------------------------------------------------------
# if(category == None):
# return self.view.CreateIndex()
# else:
# self.db.Save(dataTmp, category)
# return self.GenerateList(category)
# #-------------------------------------------------------
# def GenerateSaveChoice(self, dataTmp):
# #-------------------------------------------------------
# if(dataTmp['Student'] != ''):
# angebote = self.db.CheckOfferings(dataTmp['Student'])
# print(angebote)
# if(angebote == 0):
# print("Save")
# self.db.Save(dataTmp, 'Angebote')
# return self.GenerateListChoice()
# #-------------------------------------------------------
# def GenerateDelete(self, category, id):
# #-------------------------------------------------------
# if(category == None or id == None):
# return self.view.CreateIndex()
# else:
# self.db.Delete(category, id)
# return self.GenerateList(category)
# #EOF

View File

@ -16,10 +16,11 @@ class Choice(object):
self.db = database.Database() self.db = database.Database()
#------------------------------------------------------- #-------------------------------------------------------
def GET(self): def GET(self, view, id=None):
#------------------------------------------------------- #-------------------------------------------------------
self.db.ReadAll() self.db.ReadAll()
data = {} data = {}
if(view == "List"):
data['content'] = {} data['content'] = {}
offerings = self.db.data['Angebote'] offerings = self.db.data['Angebote']
for key, value in offerings.items(): for key, value in offerings.items():
@ -27,5 +28,22 @@ class Choice(object):
if(key2 == 'Status'): if(key2 == 'Status'):
if(value2 == 'Angebot'): if(value2 == 'Angebot'):
data['content'][key] = value data['content'][key] = value
elif(view == "Detail"):
data['id'] = id
data = self.db.data['Angebote'][id]
data['Studenten'] = self.db.data['Studenten']
data['Lehrender'] = self.db.data['Lehrender']
print(data) print(data)
return json.dumps(data) return json.dumps(data)
#-------------------------------------------------------
def POST(self, **data):
#-------------------------------------------------------
if(data['Student'] != ''):
angebote = self.db.CheckOfferings(data['Student'])
print(angebote)
if(angebote == 0):
print("Save")
self.db.Save(data, 'Angebote')
print(data)
return self.GET("List")

View File

@ -1,52 +0,0 @@
# import os.path
# from mako.template import Template
# from mako.lookup import TemplateLookup
# #----------------------------------------------------------
# class View_cl(object):
# #----------------------------------------------------------
# #-------------------------------------------------------
# def __init__(self):
# #-------------------------------------------------------
# self.path = 'templates'
# self.lookup = TemplateLookup(directories=['/'])
# #-------------------------------------------------------
# def Create(self, template, data):
# #-------------------------------------------------------
# print("CreateView\n")
# template = Template(filename=os.path.join(self.path, template), output_encoding='utf-8', lookup=self.lookup)
# return template.render(data = data)
# #-------------------------------------------------------
# def CreateIndex(self):
# #-------------------------------------------------------
# print("CreateIndex\n")
# data = None
# return self.Create('index.tpl', data)
# #-------------------------------------------------------
# def CreateList(self, data):
# #-------------------------------------------------------
# return self.Create('list.tpl', data)
# #-------------------------------------------------------
# def CreateListChoice(self, data):
# #-------------------------------------------------------
# return self.Create('listChoice.tpl', data)
# #-------------------------------------------------------
# def CreateListEval(self, data):
# #-------------------------------------------------------
# return self.Create('listEval.tpl', data)
# #-------------------------------------------------------
# def CreateDetail(self, data):
# #-------------------------------------------------------
# return self.Create('detail.tpl', data)
# #-------------------------------------------------------
# def CreateDetailChoice(self, data):
# #-------------------------------------------------------
# return self.Create('detailChoice.tpl', data)

View File

@ -1,13 +1,13 @@
{ {
"ZeitraumBis": "02.02.2003", "ZeitraumBis": "02.02.2003",
"Firma": "Apple",
"ZeitraumVon": "02.02.2002",
"Lehrender": "5",
"id": "27",
"Status": "abgeschlossen", "Status": "abgeschlossen",
"Name": "Angebot Apple 2",
"ZeitraumVon": "02.02.2002",
"Student": "11", "Student": "11",
"Beschreibung": "Praxisphase Apple", "Lehrender": "5",
"Firma": "Apple",
"Firmenbetreuer": "Horst", "Firmenbetreuer": "Horst",
"Voraussetzungen": "Keine", "Voraussetzungen": "Keine",
"Name": "Angebot Apple 2" "id": "27",
"Beschreibung": "Praxisphase Apple"
} }

View File

@ -0,0 +1,13 @@
{
"ZeitraumBis": "2.2.2001",
"Status": "abgeschlossen",
"Name": "testa",
"ZeitraumVon": "1.1.2000",
"Student": "13",
"Lehrender": "6",
"Firma": "Apple",
"Firmenbetreuer": "testa",
"Voraussetzungen": "a",
"id": "28",
"Beschreibung": "testa"
}

View File

@ -1,13 +1,13 @@
{ {
"ZeitraumBis": "", "ZeitraumBis": "02.02.2000",
"Firmenbetreuer": "firmenbetreuer", "Status": "abgeschlossen",
"id": "30",
"ZeitraumVon": "",
"Name": "name", "Name": "name",
"Beschreibung": "beschreibung", "ZeitraumVon": "01.01.2000",
"Student": "", "Student": "12",
"Lehrender": "", "Lehrender": "6",
"Status": "Angebot", "Firma": "IBM",
"Firmenbetreuer": "firmenbetreuer",
"Voraussetzungen": "voraussetzungen", "Voraussetzungen": "voraussetzungen",
"Firma": "IBM" "id": "30",
"Beschreibung": "beschreibung"
} }

View File

@ -1 +1 @@
27 28

View File

@ -1 +1 @@
15 17

View File

@ -0,0 +1,212 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title></title>
<style type="text/css">code{white-space: pre;}</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<h1 id="web-praktikum">Web-Praktikum</h1>
<h2 id="termin-3">Termin 3</h2>
<ul>
<li>Gruppe A
<ul>
<li>Kai Wansart: 921862</li>
<li>Felix Hoster: xxxxxx</li>
</ul></li>
<li>15.12.2016</li>
</ul>
<h2 id="beschreibung-der-lösung">Beschreibung der Lösung</h2>
<h3 id="aufgabe-der-anwendung">Aufgabe der Anwendung</h3>
<ul>
<li>Entwickeln und Umsetzen eines Praxisphasenmanagers (PPM).</li>
<li>Schnittstelle für Firmen, Dozenten und Studenten</li>
<li>Verwaltung der Daten, zB. Benutzerverwaltung und Angebotverwaltung</li>
</ul>
<h3 id="übersicht-der-fachlichen-funktionen">Übersicht der fachlichen Funktionen</h3>
<ul>
<li>Datenpflege Studenten:
<ul>
<li>Ausgabe Studenten im System</li>
<li>Verwaltung bestehender Datensätze</li>
<li>Erstellen neuer Datensätze</li>
</ul></li>
<li>Datenpflege Lehrende:
<ul>
<li>Ausgabe Lehrenden im System</li>
<li>Verwaltung bestehender Datensätze</li>
<li>Erstellen neuer Datensätze</li>
</ul></li>
<li>Datenpflege Firmenverzeichnis:
<ul>
<li>Ausgabe Firmen im System</li>
<li>Verwaltung bestehender Datensätze</li>
<li>Erstellen neuer Datensätze</li>
</ul></li>
<li>Datenpflege Praxisphase:
<ul>
<li>Ausgabe Angebote Praxiphasenplätze im System</li>
<li>Verwaltung bestehender Datensätze</li>
<li>Erstellen neuer Datensätze</li>
</ul></li>
<li>Auswahl Praxisphasen:
<ul>
<li>Schnittstelle für Studenten, um sich in Praxisphasenplatz einzuschreiben, mit Angabe von Zeitraum</li>
</ul></li>
<li>Auswertung Firma:
<ul>
<li>Ausgabe aller Firmen mit den jeweiligen Studenten, die sich bei Ihnen zu einem Praxisphasenplatz eingeschrieben haben</li>
</ul></li>
<li>Auswertung Praxisphasen nach Studenten:
<ul>
<li>Ausgabe aller Studenten mit Informationen, bei welcher Firma sie wann ihre Praxisphase machen / gemacht haben</li>
</ul></li>
<li>Auswertung Praxisphase nach Betreuern:
<ul>
<li>Ausgabe aller Betreuer mit den jeweiligen Studenten, die sie betreuen.</li>
</ul></li>
</ul>
<h2 id="beschreibung-des-client">Beschreibung des Client</h2>
<ul>
<li>Basis: Html Vorlage</li>
<li>Dynamischer Inhalt via Javascript:
<ul>
<li>Lädt Inhalte im JSON Format von Server</li>
<li>Rendert Inhalte in Templates</li>
<li>Fügt gerenderte Inhalte in HTML (DOM) ein</li>
</ul></li>
</ul>
<h2 id="beschreibung-der-komponenten-des-servers">Beschreibung der Komponenten des Servers</h2>
<ul>
<li>Server: Object-Dispatching --&gt; Weiterleitung der Anfragen an jeweilige Funktionen
<ul>
<li>category
<ul>
<li>Zweck
<ul>
<li>Alle Kategorien (Studenten, Lehrende, Firmen, Angebote)</li>
<li>Rückgabe der Inhalte</li>
<li>Verwaltung der Daten</li>
</ul></li>
<li>Zusammenwirken mit anderen Komponenten
<ul>
<li>Zugriff auf Datenbank um Daten zu verwalten</li>
</ul></li>
<li>Aufbau
<ul>
<li>GET: Rückgabe</li>
<li>POST: Eingabe</li>
<li>DELETE: Löschen</li>
</ul></li>
<li>API
<ul>
<li>GET ( Kategorie, Ansicht, ID)</li>
<li>POST ( Kategorie, Daten )</li>
<li>DELETE ( Kategorie, ID )</li>
</ul></li>
</ul></li>
<li>choice
<ul>
<li>Zweck
<ul>
<li>Rückgabe der bestehenden Angebote</li>
<li>Verwaltung der Daten
<ul>
<li>Annahme mit Datum</li>
</ul></li>
</ul></li>
<li>Zusammenwirken mit anderen Komponenten
<ul>
<li>Zugriff auf Datenbank um Daten zu verwalten</li>
</ul></li>
<li>Aufbau
<ul>
<li>GET: Rückgabe</li>
<li>POST: Eingabe</li>
</ul></li>
<li>API
<ul>
<li>GET ( Ansicht, ID )</li>
<li>POST ( Daten )</li>
</ul></li>
</ul></li>
<li>eval
<ul>
<li>Zweck
<ul>
<li>Auswertung</li>
<li>Rückgabe der Auswertungen</li>
</ul></li>
<li>Zusammenwirken mit anderen Komponenten
<ul>
<li>Zugriff auf Datenbank um Daten zu verwalten</li>
</ul></li>
<li>Aufbau
<ul>
<li>GET: Rückgabe und Auswertung</li>
</ul></li>
<li>API
<ul>
<li>GET ( Kategorie )</li>
</ul></li>
</ul></li>
<li>database
<ul>
<li>Zweck -Verwaltung - auslesen - bearbeiten - speichern - löschen</li>
<li>Zusammenwirken mit anderen Komponenten
<ul>
<li>category, choice, eval greifen auf Datenbank zu</li>
</ul></li>
</ul></li>
<li>template
<ul>
<li>Zweck
<ul>
<li>Einlesen aller Templates</li>
<li>Rückgabe aller Templates</li>
</ul></li>
<li>Aufbau
<ul>
<li>GET: Rückgabe aller Templates</li>
</ul></li>
<li>API
<ul>
<li>GET ()</li>
</ul></li>
</ul></li>
</ul></li>
</ul>
<h2 id="datenablage">Datenablage</h2>
<ul>
<li>Die Daten werden mittels JSON abgespeichert und ausgelesen</li>
<li>Die Datensätze sind aufgeteilt in die Unterordner:
<ul>
<li>Angebote</li>
<li>Firmen</li>
<li>Lehrender</li>
<li>Studenten</li>
</ul></li>
<li>Es wird jeweils abgespeichert, welche ID der zuletzt hinzugefügte Eintrag hat, um den nächsten mit inkrementierter ID abspeichern zu können</li>
</ul>
<h2 id="konfiguration">Konfiguration</h2>
<ul>
<li>Python
<ul>
<li>Erweiterungen:
<ul>
<li>JSON</li>
<li>CherryPy</li>
</ul></li>
</ul></li>
<li>Webbrowser
<ul>
<li>Javascript fähig</li>
</ul></li>
</ul>
</body>
</html>

121
Praktikum2/ppm2/doc/PPM2.md Normal file
View File

@ -0,0 +1,121 @@
# Web-Praktikum
## Termin 3
- Gruppe A
- Kai Wansart: 921862
- Felix Hoster: xxxxxx
- 15.12.2016
## Beschreibung der Lösung
### Aufgabe der Anwendung
- Entwickeln und Umsetzen eines Praxisphasenmanagers (PPM).
- Schnittstelle für Firmen, Dozenten und Studenten
- Verwaltung der Daten, zB. Benutzerverwaltung und Angebotverwaltung
### Übersicht der fachlichen Funktionen
- Datenpflege Studenten:
- Ausgabe Studenten im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Datenpflege Lehrende:
- Ausgabe Lehrenden im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Datenpflege Firmenverzeichnis:
- Ausgabe Firmen im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Datenpflege Praxisphase:
- Ausgabe Angebote Praxiphasenplätze im System
- Verwaltung bestehender Datensätze
- Erstellen neuer Datensätze
- Auswahl Praxisphasen:
- Schnittstelle für Studenten, um sich in Praxisphasenplatz einzuschreiben, mit Angabe von Zeitraum
- Auswertung Firma:
- Ausgabe aller Firmen mit den jeweiligen Studenten, die sich bei Ihnen zu einem Praxisphasenplatz eingeschrieben haben
- Auswertung Praxisphasen nach Studenten:
- Ausgabe aller Studenten mit Informationen, bei welcher Firma sie wann ihre Praxisphase machen / gemacht haben
- Auswertung Praxisphase nach Betreuern:
- Ausgabe aller Betreuer mit den jeweiligen Studenten, die sie betreuen.
## Beschreibung des Client
- Basis: Html Vorlage
- Dynamischer Inhalt via Javascript:
- Lädt Inhalte im JSON Format von Server
- Rendert Inhalte in Templates
- Fügt gerenderte Inhalte in HTML (DOM) ein
## Beschreibung der Komponenten des Servers
- Server: Object-Dispatching --> Weiterleitung der Anfragen an jeweilige Funktionen
- category
- Zweck
- Alle Kategorien (Studenten, Lehrende, Firmen, Angebote)
- Rückgabe der Inhalte
- Verwaltung der Daten
- Zusammenwirken mit anderen Komponenten
- Zugriff auf Datenbank um Daten zu verwalten
- Aufbau
- GET: Rückgabe
- POST: Eingabe
- DELETE: Löschen
- API
- GET ( Kategorie, Ansicht, ID)
- POST ( Kategorie, Daten )
- DELETE ( Kategorie, ID )
- choice
- Zweck
- Rückgabe der bestehenden Angebote
- Verwaltung der Daten
- Annahme mit Datum
- Zusammenwirken mit anderen Komponenten
- Zugriff auf Datenbank um Daten zu verwalten
- Aufbau
- GET: Rückgabe
- POST: Eingabe
- API
- GET ( Ansicht, ID )
- POST ( Daten )
- eval
- Zweck
- Auswertung
- Rückgabe der Auswertungen
- Zusammenwirken mit anderen Komponenten
- Zugriff auf Datenbank um Daten zu verwalten
- Aufbau
- GET: Rückgabe und Auswertung
- API
- GET ( Kategorie )
- database
- Zweck
-Verwaltung
- auslesen
- bearbeiten
- speichern
- löschen
- Zusammenwirken mit anderen Komponenten
- category, choice, eval greifen auf Datenbank zu
- template
- Zweck
- Einlesen aller Templates
- Rückgabe aller Templates
- Aufbau
- GET: Rückgabe aller Templates
- API
- GET ()
## Datenablage
- Die Daten werden mittels JSON abgespeichert und ausgelesen
- Die Datensätze sind aufgeteilt in die Unterordner:
- Angebote
- Firmen
- Lehrender
- Studenten
- Es wird jeweils abgespeichert, welche ID der zuletzt hinzugefügte Eintrag hat, um den nächsten mit inkrementierter ID abspeichern zu können
## Konfiguration
- Python
- Erweiterungen:
- JSON
- CherryPy
- Webbrowser
- Javascript fähig

View File

@ -60,6 +60,11 @@ class PPM
this.LoadContent('/category/?cat=Firmen&view=List', 'list.tpl'); this.LoadContent('/category/?cat=Firmen&view=List', 'list.tpl');
break break
case 'categoryAngebote':
this.LoadContent('/category/?cat=Angebote&view=List', 'list.tpl');
break
case 'choice': case 'choice':
this.LoadContent('/choice/?view=List', 'listChoice.tpl'); this.LoadContent('/choice/?view=List', 'listChoice.tpl');
@ -80,60 +85,84 @@ class PPM
this.LoadContent('/eval/?cat=Firmen', 'listEval.tpl'); this.LoadContent('/eval/?cat=Firmen', 'listEval.tpl');
break break
case 'NewStudenten': case 'newStudenten':
console.log("NewStudenten"); console.log("NewStudenten");
this.LoadContent('/category/?cat=Studenten&view=Detail', 'detail.tpl'); this.LoadContent('/category/?cat=Studenten&view=Detail', 'detail.tpl');
break break
case 'NewLehrender': case 'newLehrender':
console.log("NewLehrender"); console.log("NewLehrender");
this.LoadContent('/category/?cat=Lehrenden&view=Detail', 'detail.tpl'); this.LoadContent('/category/?cat=Lehrender&view=Detail', 'detail.tpl');
break break
case 'NewFirmen': case 'newFirmen':
console.log("NewFirmen"); console.log("NewFirmen");
this.LoadContent('/category/?cat=Firmen&view=Detail', 'detail.tpl'); this.LoadContent('/category/?cat=Firmen&view=Detail', 'detail.tpl');
break break
case 'ModifyStudenten': case 'newAngebote':
console.log("ModifyStudenten: ", selectedId);
console.log("NewAngebote");
this.LoadContent('/category/?cat=Angebote&view=Detail', 'detail.tpl');
break
case 'modifyStudenten':
console.log("modifyStudenten: ", selectedId);
this.LoadContent('/category/?cat=Studenten&view=Detail&id='+ selectedId, 'detail.tpl'); this.LoadContent('/category/?cat=Studenten&view=Detail&id='+ selectedId, 'detail.tpl');
break break
case 'ModifyLehrender': case 'modifyLehrender':
console.log("ModifyLehrender", selectedId); console.log("modifyLehrender", selectedId);
this.LoadContent('/category/?cat=Lehrender&view=Detail&id='+ selectedId, 'detail.tpl'); this.LoadContent('/category/?cat=Lehrender&view=Detail&id='+ selectedId, 'detail.tpl');
break break
case 'ModifyFirmen': case 'modifyFirmen':
console.log("ModifyFirmen", selectedId); console.log("modifyFirmen", selectedId);
this.LoadContent('/category/?cat=Firmen&view=Detail&id='+ selectedId, 'detail.tpl'); this.LoadContent('/category/?cat=Firmen&view=Detail&id='+ selectedId, 'detail.tpl');
break break
case 'DeleteStudenten': case 'modifyAngebote':
console.log("DeleteStudenten", selectedId); console.log("modifyAngebote", selectedId);
this.LoadContent('/category/?cat=Angebote&view=Detail&id='+ selectedId, 'detail.tpl');
break
case 'choiceAnnehmen':
console.log("choiceAnnehmen", selectedId);
this.LoadContent('/choice/?view=Detail&id='+ selectedId, 'detailChoice.tpl');
break
case 'choiceNeu':
console.log("choiceNeu");
this.LoadContent('/choice/?view=Detail', 'detailChoice.tpl');
break
case 'deleteStudenten':
console.log("deleteStudenten", selectedId);
if (confirm("Soll der Eintrag wirklich geloescht werden?")) { if (confirm("Soll der Eintrag wirklich geloescht werden?")) {
console.log("DELETE"); console.log("DELETE");
this.DeleteContent('/category/?cat=Studenten&id='+selectedId, 'categoryStudenten'); this.DeleteContent('/category/?cat=Studenten&id='+selectedId, 'categoryStudenten');
} }
break break
case 'DeleteLehrender': case 'deleteLehrender':
console.log("DeleteLehrender", selectedId); console.log("deleteLehrender", selectedId);
if (confirm("Soll der Eintrag wirklich geloescht werden?")) { if (confirm("Soll der Eintrag wirklich geloescht werden?")) {
console.log("DELETE"); console.log("DELETE");
this.DeleteContent('/category/?cat=Lehrender&id='+selectedId, 'categoryLehrender'); this.DeleteContent('/category/?cat=Lehrender&id='+selectedId, 'categoryLehrender');
} }
break break
case 'DeleteFirmen': case 'deleteFirmen':
console.log("DeleteFirmen", selectedId); console.log("DeleteFirmen", selectedId);
if (confirm("Soll der Eintrag wirklich geloescht werden?")) { if (confirm("Soll der Eintrag wirklich geloescht werden?")) {
@ -142,24 +171,36 @@ class PPM
} }
break break
case 'SaveCategoryStudenten': case 'saveCategoryStudenten':
var data = $("#idForm").serialize(); var data = $("#idForm").serialize();
this.SaveContent('/category/?cat=Studenten&'+data, 'categoryStudenten'); this.SaveContent('/category/?cat=Studenten&'+data, 'categoryStudenten');
break break
case 'SaveCategoryLehrende': case 'saveCategoryLehrende':
var data = $("#idForm").serialize(); var data = $("#idForm").serialize();
this.SaveContent('/category/?cat=Lehrender&'+data, 'categoryLehrender'); this.SaveContent('/category/?cat=Lehrender&'+data, 'categoryLehrender');
break break
case 'SaveCategoryFirmen': case 'saveCategoryFirmen':
var data = $("#idForm").serialize(); var data = $("#idForm").serialize();
this.SaveContent('/category/?cat=Firmen&'+data, 'categoryFirmen'); this.SaveContent('/category/?cat=Firmen&'+data, 'categoryFirmen');
break break
case 'saveCategoryAngebote':
var data = $("#idForm").serialize();
this.SaveContent('/category/?cat=Angebote&'+data, 'categoryAngebote');
break
case 'saveChoice':
var data = $("#idForm").serialize();
this.SaveContent('/choice/?'+data, 'choice');
break
default: default:
alert ('[PPM] Unbekannte Anfrage: ' + message); alert ('[PPM] Unbekannte Anfrage: ' + message);

View File

@ -52,7 +52,7 @@
<div id="idButtonArea" class="clButtonArea"> <div id="idButtonArea" class="clButtonArea">
<a data-action="index" title="Zur&uumlck zur Startseite">Zur&uumlck zur Startseite</a> <a data-action="index" title="Zur&uumlck zur Startseite">Zur&uumlck zur Startseite</a>
<a data-action="category#context['category']#" title="Zurueck zur &uumlbersicht">Zur&uumlck zur &uumlbersicht</a> <a data-action="category#context['category']#" title="Zurueck zur &uumlbersicht">Zur&uumlck zur &uumlbersicht</a>
<a data-action="SaveCategory#context['category']#" title="Speichern">Speichern</a> <a data-action="saveCategory#context['category']#" title="Speichern">Speichern</a>
</div> </div>
</form> </form>

View File

@ -0,0 +1,48 @@
<form id="idForm" class="clContent" method="POST">
<h2 id="idContentHeader" class="clContentHeader">
Praxisphasenangebots Auswahl
</h2>
<div id="idContentArea" class="clContentArea">
<input type="hidden" value="#context['id']#" id="id" name="id" />
<input type="hidden" value="#context['Name']#" id="Name" name="Name" />
<input type="hidden" value="#context['Firma']#" id="Firma" name="Firma" />
<input type="hidden" value="#context['Beschreibung']#"" id="Beschreibung" name="Beschreibung" />
<input type="hidden" value="#context['Voraussetzungen']#" id="Voraussetzungen" name="Voraussetzungen" />
<input type="hidden" value="#context['Firmenbetreuer']#" id="Firmenbetreuer" name="Firmenbetreuer" />
<input type="hidden" value="aktuell" id="Status" name="Status" />
<div class="clFormRow">
<label for="Student">Student</label>
<select name="Student" form="idForm">
@for option in context['Studenten']@
<option value="#context['Studenten'][option]['id']#">#context['Studenten'][option]['Name']#</option>
@endfor@
</select>
</div>
<div class="clFormRow">
<label for="Lehrender">Lehrender</label>
<select name="Lehrender" form="idForm">
@for option in context['Lehrender']@
<option value="#context['Lehrender'][option]['id']#">#context['Lehrender'][option]['Name']#</option>
@endfor@
</select>
</div>
<div class="clFormRow">
<label for="ZeitraumVon">Zeitraum: Von (D.M.Y)</label>
<input type="text" value="" id="ZeitraumVon" name="ZeitraumVon" />
</div>
<div class="clFormRow">
<label for="ZeitraumBis">Zeitraum: Bis (D.M.Y)</label>
<input type="text" value="" id="ZeitraumBis" name="ZeitraumBis" />
</div>
<div id="idButtonArea" class="clButtonArea">
<a data-action="index" title="Zur&uumlck zur Startseite">Zur&uumlck zur Startseite</a>
<a data-action="choice" title="Zur&uumlck zur &uumlbersicht">Zur&uumlck zur &uumlbersicht</a>
<a data-action="saveChoice" title="Speichern">Speichern</a>
</div>
</div>
</form>

View File

@ -4,6 +4,7 @@
<li><a class="clNavButton" data-action="categoryStudenten">Datenpflege: Studenten</a></li> <li><a class="clNavButton" data-action="categoryStudenten">Datenpflege: Studenten</a></li>
<li><a class="clNavButton" data-action="categoryLehrender">Datenpflege: Lehrender</a></li> <li><a class="clNavButton" data-action="categoryLehrender">Datenpflege: Lehrender</a></li>
<li><a class="clNavButton" data-action="categoryFirmen">Datenpflege: Firmenverzeichnis</a></li> <li><a class="clNavButton" data-action="categoryFirmen">Datenpflege: Firmenverzeichnis</a></li>
<li><a class="clNavButton" data-action="categoryAngebote">Datenpflege: Angebote</a></li>
<li><a class="clNavButton" data-action="choice">Auswahl: Praxisphasen</a></li> <li><a class="clNavButton" data-action="choice">Auswahl: Praxisphasen</a></li>
<li><a class="clNavButton" data-action="evalStudenten">Auswertung: Studenten</a></li> <li><a class="clNavButton" data-action="evalStudenten">Auswertung: Studenten</a></li>
<li><a class="clNavButton" data-action="evalLehrender">Auswertung: Lehrenden</a></li> <li><a class="clNavButton" data-action="evalLehrender">Auswertung: Lehrenden</a></li>

View File

@ -41,7 +41,7 @@
<div id="idButtonArea" class="clButtonArea"> <div id="idButtonArea" class="clButtonArea">
<a class="clButton" data-action="index">Startseite</a> <a class="clButton" data-action="index">Startseite</a>
<a class="clButton" data-action="New#context['category']#">Neu</a> <a class="clButton" data-action="new#context['category']#">Neu</a>
<a class="clButton" data-action="Modify#context['category']#">Bearbeiten</a> <a class="clButton" data-action="modify#context['category']#">Bearbeiten</a>
<a class="clButton" data-action="Delete#context['category']#">Loeschen</a> <a class="clButton" data-action="delete#context['category']#">Loeschen</a>
</div> </div>

View File

@ -13,7 +13,7 @@
</tr> </tr>
@if context['content']!= 'None'@ @if context['content']!= 'None'@
@for entries in context['content']@ @for entries in context['content']@
<tr id=${entries}> <tr id=#entries#>
<td id=#entries#>#context['content'][entries]['Name']#</td> <td id=#entries#>#context['content'][entries]['Name']#</td>
<td id=#entries#>#context['content'][entries]['Firma']#</td> <td id=#entries#>#context['content'][entries]['Firma']#</td>
<td id=#entries#>#context['content'][entries]['Beschreibung']#</td> <td id=#entries#>#context['content'][entries]['Beschreibung']#</td>
@ -29,5 +29,5 @@
<div id="idButtonArea" class="clButtonArea"> <div id="idButtonArea" class="clButtonArea">
<a class="clButton" data-action="index">Startseite</a> <a class="clButton" data-action="index">Startseite</a>
<a class="clButton" id="Annehmen">Annehmen</a> <a class="clButton" data-action="choiceAnnehmen">Annehmen</a>
</div> </div>