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,36 +1,57 @@
# Web-Praktikum Gruppe K
## Kai Wansart und Felix Hoster
### 16.11.2016
## Beschreibung der Lösung
### Aufgabe der Anwendung:
Die Praktikumsaufgabe war, eine Ünterstützung der Betreuung von Praxisphasen mit einer Web-Anwendung zu erstellen. Praxisphasen werden
von externen Partnern (Firmen) angeboten, Studenten können diese Angebote nutzen, wenn sie einen Lehrenden als Betreuer
finden
#### Übersicht der fachlichen Funktion
- Datenpflege Studenten: Eine Liste mit allen erstellten Studenten (Name, Vorname, Matrikelnummer)
- Datenpflege Lehrende: Eine Übersicht mit allen Lehrenden (Name, Titel, Lehrgebiet)
- Datenpflege Firmenverzeichniss: Eine Liste mit einer kleinen Übersicht über einzelne Firmen (Schwerpunkt, Sitz, Name, Branche, Mitarbeiteranzahl)
- Datenpflege Praxisphase: Erhält man eine kurze Übersicht über Angebote für die Studenten (Firmenbetreuer, Beschreibung, Name, Voraussetzung, Firma)
- Auswahl Praxisphasen: Dort können die Studenten mit einem Professor sich eine Praxisphase aussuchen
- Auswertung Firma: Hier werden die Firmen bewertet, die ein Angebot für die Praxisphase bewertet
- Auswertung Praxisphasen nach Studenten: Hier sieht man die Bewertung der Studenten über die einzelnen Angebote
- Auswertung Praxisphase nach Betreuern: Hier sieht man die Bewertung der Praxisphasen - Betreuer
## Beschreibung des Servers
#### Zweck
#### Aufbau (Bestandteile der Komponente)
#### Zusammenwirken mit anderen Komponenten
#### API (Programmierschnittstellen), die die Leistung der Komponente anbieten
## Datenablage
Die Daten werden mittels der Kategorie abgespeichert, die als Variable behandelt wird. Mit dieser Variable wird die Datei immer wieder neu gespeichert, wenn etwas gelöscht bzw. geändert wird. Das Format der Datei ist eine JSON-Datei, die im Ordner 'Data' und der darauffolgenden Kategorie abgespeichert wird.
## Konfiguration
# Web-Praktikum Gruppe A
## Kai Wansart 921862 und 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 Funktion
- 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 Servers
#### 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)
-
#### Zusammenwirken mit anderen Komponenten
#### API (Programmierschnittstellen), die die Leistung der Komponente anbieten
## Datenablage
Die Daten werden mittels der Kategorie abgespeichert, die als Variable behandelt wird. Mit dieser Variable wird die Datei immer wieder neu gespeichert, wenn etwas gelöscht bzw. geändert wird. Das Format der Datei ist eine JSON-Datei, die im Ordner 'Data' und der darauffolgenden Kategorie abgespeichert wird.
## Konfiguration
## Durchführung und Ergebnis der geforderten Prüfungen

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,16 +16,34 @@ class Choice(object):
self.db = database.Database()
#-------------------------------------------------------
def GET(self):
def GET(self, view, id=None):
#-------------------------------------------------------
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
if(view == "List"):
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
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)
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",
"Firma": "Apple",
"ZeitraumVon": "02.02.2002",
"Lehrender": "5",
"id": "27",
"Status": "abgeschlossen",
"Name": "Angebot Apple 2",
"ZeitraumVon": "02.02.2002",
"Student": "11",
"Beschreibung": "Praxisphase Apple",
"Lehrender": "5",
"Firma": "Apple",
"Firmenbetreuer": "Horst",
"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": "",
"Firmenbetreuer": "firmenbetreuer",
"id": "30",
"ZeitraumVon": "",
"ZeitraumBis": "02.02.2000",
"Status": "abgeschlossen",
"Name": "name",
"Beschreibung": "beschreibung",
"Student": "",
"Lehrender": "",
"Status": "Angebot",
"ZeitraumVon": "01.01.2000",
"Student": "12",
"Lehrender": "6",
"Firma": "IBM",
"Firmenbetreuer": "firmenbetreuer",
"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

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

View File

@ -52,7 +52,7 @@
<div id="idButtonArea" class="clButtonArea">
<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="SaveCategory#context['category']#" title="Speichern">Speichern</a>
<a data-action="saveCategory#context['category']#" title="Speichern">Speichern</a>
</div>
</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="categoryLehrender">Datenpflege: Lehrender</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="evalStudenten">Auswertung: Studenten</a></li>
<li><a class="clNavButton" data-action="evalLehrender">Auswertung: Lehrenden</a></li>

View File

@ -41,7 +41,7 @@
<div id="idButtonArea" class="clButtonArea">
<a class="clButton" data-action="index">Startseite</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="Delete#context['category']#">Loeschen</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="delete#context['category']#">Loeschen</a>
</div>

View File

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