Browse Source

finished chapter prototyp

master
Esther Kleinhenz 6 years ago
parent
commit
18f48df6a1

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux View File

\bibcite{Django}{{Fou18b}{}{{}}{{}}} \bibcite{Django}{{Fou18b}{}{{}}{{}}}
\bibcite{Django-2}{{Fou18c}{}{{}}{{}}} \bibcite{Django-2}{{Fou18c}{}{{}}{{}}}
\bibcite{Django-3}{{Fou18d}{}{{}}{{}}} \bibcite{Django-3}{{Fou18d}{}{{}}{{}}}
\@writefile{toc}{\contentsline {chapter}{Referenzen}{29}{chapter*.19}}
\@writefile{toc}{\contentsline {chapter}{Referenzen}{29}{chapter*.20}}
\bibcite{Python}{{Fou18e}{}{{}}{{}}} \bibcite{Python}{{Fou18e}{}{{}}{{}}}
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}} \bibcite{Gaynor}{{Gay10}{}{{}}{{}}}
\bibcite{Sario}{{Gmb18}{}{{}}{{}}} \bibcite{Sario}{{Gmb18}{}{{}}{{}}}

+ 5
- 4
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof View File

\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12} \contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12}
\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13} \contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13}
\contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14} \contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14}
\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15}
\contentsline {figure}{\numberline {3.6}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{24}{figure.caption.16}
\contentsline {figure}{\numberline {3.7}{\ignorespaces Prototyp Newsfeed Seite\relax }}{25}{figure.caption.17}
\contentsline {figure}{\numberline {3.8}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{26}{figure.caption.18}
\contentsline {figure}{\numberline {3.5}{\ignorespaces Prototyp Artikel-Editor.\relax }}{22}{figure.caption.15}
\contentsline {figure}{\numberline {3.6}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.16}
\contentsline {figure}{\numberline {3.7}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{24}{figure.caption.17}
\contentsline {figure}{\numberline {3.8}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{24}{figure.caption.18}
\contentsline {figure}{\numberline {3.9}{\ignorespaces Prototyp Newsfeed Seite\relax }}{26}{figure.caption.19}
\addvspace {10\p@ } \addvspace {10\p@ }
\addvspace {10\p@ } \addvspace {10\p@ }

+ 163
- 145
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.log View File

This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 18 NOV 2018 18:15
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 18 NOV 2018 22:38
entering extended mode entering extended mode
\write18 enabled. \write18 enabled.
file:line:error style messages enabled. file:line:error style messages enabled.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 90. (babel) in language on input line 90.


Underfull \hbox (badness 10000) in paragraph at lines 95--97

[]



Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 103.
(babel) in language on input line 97.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 103.
(babel) in language on input line 97.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 103.
(babel) in language on input line 97.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 103.
(babel) in language on input line 97.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 103.
(babel) in language on input line 97.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 103.
(babel) in language on input line 97.
[10] [10]
Underfull \hbox (badness 10000) in paragraph at lines 98--101

[]

Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 104.
(babel) in language on input line 106.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 104.
(babel) in language on input line 106.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 104.

(babel) in language on input line 106.


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 111.
(babel) in language on input line 113.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 111.
(babel) in language on input line 113.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 111.
(babel) in language on input line 113.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 111.
(babel) in language on input line 113.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 111.
(babel) in language on input line 113.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 111.
(babel) in language on input line 113.
[11] [11]
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 113.
(babel) in language on input line 115.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 113.
(babel) in language on input line 115.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 113.
(babel) in language on input line 115.
File: figures/bootstrap-head-tag.png Graphic file (type bmp) File: figures/bootstrap-head-tag.png Graphic file (type bmp)
<figures/bootstrap-head-tag.png> <figures/bootstrap-head-tag.png>
File: figures/bootstrap-class-example.png Graphic file (type bmp) File: figures/bootstrap-class-example.png Graphic file (type bmp)
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 135.
(babel) in language on input line 137.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 135.
(babel) in language on input line 137.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 135.
(babel) in language on input line 137.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 135.
(babel) in language on input line 137.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 135.
(babel) in language on input line 137.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 135.
(babel) in language on input line 137.
[12]) [12])


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 27.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 27.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 27.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 27.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 27.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 27.
(babel) in language on input line 28.
[15] [15]
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 31.
(babel) in language on input line 33.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 31.
(babel) in language on input line 33.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 31.
(babel) in language on input line 33.

Overfull \hbox (6.31879pt too wide) in paragraph at lines 36--38
\T1/aer/m/n/12 Codes dem Com-pi-ler mit-zu-tei-len, dass ei-ne In-te-gra-ti-on statt-fin-den muss (vgl. [Dja18]).
[]


Underfull \hbox (badness 10000) in paragraph at lines 34--36

Underfull \hbox (badness 10000) in paragraph at lines 36--38


[] []




Underfull \hbox (badness 10000) in paragraph at lines 37--40
Underfull \hbox (badness 10000) in paragraph at lines 39--42


[] []




Underfull \hbox (badness 10000) in paragraph at lines 41--43
Underfull \hbox (badness 10000) in paragraph at lines 43--45


[] []




Underfull \hbox (badness 10000) in paragraph at lines 44--47
Underfull \hbox (badness 10000) in paragraph at lines 46--49


[] []




Underfull \hbox (badness 10000) in paragraph at lines 48--49
Underfull \hbox (badness 10000) in paragraph at lines 50--51


[] []


This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 55.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 55.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 55.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 55.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 55.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 55.
(babel) in language on input line 54.
[16] [16]
File: figures/custommodelcode.png Graphic file (type bmp) File: figures/custommodelcode.png Graphic file (type bmp)
<figures/custommodelcode.png> <figures/custommodelcode.png>


Underfull \hbox (badness 10000) in paragraph at lines 76--78
Underfull \hbox (badness 10000) in paragraph at lines 78--80


[] []


This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 83.
(babel) in language on input line 85.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 83.
(babel) in language on input line 85.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 83.
(babel) in language on input line 85.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 83.
(babel) in language on input line 85.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 83.
(babel) in language on input line 85.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 83.
(babel) in language on input line 85.
[17] [17]
File: figures/datamodel.png Graphic file (type bmp) File: figures/datamodel.png Graphic file (type bmp)
<figures/datamodel.png> <figures/datamodel.png>
LaTeX Warning: `!h' float specifier changed to `!ht'. LaTeX Warning: `!h' float specifier changed to `!ht'.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 94.
(babel) in language on input line 99.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 94.
(babel) in language on input line 99.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 94.
(babel) in language on input line 99.


Overfull \hbox (21.96033pt too wide) in paragraph at lines 97--98
Overfull \hbox (21.96033pt too wide) in paragraph at lines 102--103
[]\T1/aer/m/n/12 Ein Django-Projekt bil-det be-reits beim Ein-rich-ten, \T1/aett/m/n/12 per De-fault\T1/aer/m/n/12 , ei-ne Administrator- []\T1/aer/m/n/12 Ein Django-Projekt bil-det be-reits beim Ein-rich-ten, \T1/aett/m/n/12 per De-fault\T1/aer/m/n/12 , ei-ne Administrator-
[] []


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 100.
(babel) in language on input line 107.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 100.
(babel) in language on input line 107.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 100.
(babel) in language on input line 107.


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 109.
(babel) in language on input line 116.
[18] [18]


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 109.
(babel) in language on input line 116.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 109.
(babel) in language on input line 116.
[19] [19]
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 111.
(babel) in language on input line 118.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 111.
(babel) in language on input line 118.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 111.
(babel) in language on input line 118.


Underfull \hbox (badness 10000) in paragraph at lines 112--113
Underfull \hbox (badness 10000) in paragraph at lines 119--120


[] []


File: figures/userstories.png Graphic file (type bmp) File: figures/userstories.png Graphic file (type bmp)
<figures/userstories.png> <figures/userstories.png>
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 121.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 121.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 121.
(babel) in language on input line 128.


Underfull \hbox (badness 10000) in paragraph at lines 122--126
Underfull \hbox (badness 10000) in paragraph at lines 129--133


[] []


This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 126.
(babel) in language on input line 134.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 126.
(babel) in language on input line 134.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 126.
(babel) in language on input line 134.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 126.
(babel) in language on input line 134.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 126.
(babel) in language on input line 134.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 126.
(babel) in language on input line 134.
[20] [20]
Underfull \hbox (badness 10000) in paragraph at lines 132--136
Underfull \hbox (badness 10000) in paragraph at lines 139--143


[] []




Underfull \hbox (badness 10000) in paragraph at lines 137--141
Underfull \hbox (badness 10000) in paragraph at lines 144--148


[] []


This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 141.
(babel) in language on input line 148.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 141.
(babel) in language on input line 148.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 141.
(babel) in language on input line 148.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 141.
(babel) in language on input line 148.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 141.
(babel) in language on input line 148.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 141.
(babel) in language on input line 148.
[21] [21]
Underfull \hbox (badness 10000) in paragraph at lines 144--145
File: figures/postedit.png Graphic file (type bmp)
<figures/postedit.png>

Underfull \hbox (badness 10000) in paragraph at lines 158--159


[] []


LaTeX Warning: `!h' float specifier changed to `!ht'. LaTeX Warning: `!h' float specifier changed to `!ht'.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 153.
(babel) in language on input line 167.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 153.
(babel) in language on input line 167.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 153.
(babel) in language on input line 167.


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 158.
(babel) in language on input line 171.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 158.
(babel) in language on input line 171.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 158.
(babel) in language on input line 171.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 158.
(babel) in language on input line 171.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 158.
(babel) in language on input line 171.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 158.
(babel) in language on input line 171.
[22] [22]
File: figures/view-search-add.png Graphic file (type bmp)
<figures/view-search-add.png>
Underfull \hbox (badness 10000) in paragraph at lines 171--172


Overfull \hbox (42.68173pt too wide) in paragraph at lines 165--166
[][]
[] []


File: figures/filtern.png Graphic file (type bmp)
<figures/filtern.png>


LaTeX Warning: `!h' float specifier changed to `!ht'. LaTeX Warning: `!h' float specifier changed to `!ht'.


This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 171.
(babel) in language on input line 185.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 171.
(babel) in language on input line 185.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 171.
(babel) in language on input line 185.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 171.
(babel) in language on input line 185.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 171.
(babel) in language on input line 185.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 171.
(babel) in language on input line 185.
[23] [23]
File: figures/newsfeed.png Graphic file (type bmp)
<figures/newsfeed.png>
File: figures/view-search-add.png Graphic file (type bmp)
<figures/view-search-add.png>


Overfull \hbox (42.68173pt too wide) in paragraph at lines 188--189
[][]
[]


LaTeX Warning: `!h' float specifier changed to `!ht'.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 182.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 182.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 182.
File: figures/filtern.png Graphic file (type bmp)
<figures/filtern.png>


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 193.
(babel) in language on input line 194.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 193.
(babel) in language on input line 194.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 193.
(babel) in language on input line 194.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 193.
(babel) in language on input line 194.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 193.
(babel) in language on input line 194.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 193.
(babel) in language on input line 194.
[24] [24]
Underfull \hbox (badness 10000) in paragraph at lines 195--196

[]

File: figures/newsfeed.png Graphic file (type bmp)
<figures/newsfeed.png>


LaTeX Warning: `!h' float specifier changed to `!ht'. LaTeX Warning: `!h' float specifier changed to `!ht'.


)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 205.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 205.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 205.


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
This may cause the page layout to be inconsistent, however. This may cause the page layout to be inconsistent, however.


Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 60.
(babel) in language on input line 215.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 60.
(babel) in language on input line 215.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 60.
(babel) in language on input line 215.
Package babel Info: Redefining german shorthand "f Package babel Info: Redefining german shorthand "f
(babel) in language on input line 60.
(babel) in language on input line 215.
Package babel Info: Redefining german shorthand "| Package babel Info: Redefining german shorthand "|
(babel) in language on input line 60.
(babel) in language on input line 215.
Package babel Info: Redefining german shorthand "~ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 60.
[25]
(babel) in language on input line 215.
[25])


Package Fancyhdr Warning: \headheight is too small (12.0pt): Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt. Make it at least 14.49998pt.
) )
(\end occurred when \ifnum on line 5 was incomplete) (\end occurred when \ifnum on line 5 was incomplete)
Here is how much of TeX's memory you used: Here is how much of TeX's memory you used:
27383 strings out of 492970
490349 string characters out of 6133939
563059 words of memory out of 5000000
30957 multiletter control sequences out of 15000+600000
556319 words of font info for 63 fonts, out of 8000000 for 9000
27411 strings out of 492970
490688 string characters out of 6133939
562061 words of memory out of 5000000
30977 multiletter control sequences out of 15000+600000
563921 words of font info for 80 fonts, out of 8000000 for 9000
1348 hyphenation exceptions out of 8191 1348 hyphenation exceptions out of 8191
58i,18n,50p,10437b,960s stack positions out of 5000i,500n,10000p,200000b,80000s 58i,18n,50p,10437b,960s stack positions out of 5000i,500n,10000p,200000b,80000s



+ 2
- 2
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.out View File

\BOOKMARK [1][-]{section.3.2}{Organisation}{chapter.3}% 18 \BOOKMARK [1][-]{section.3.2}{Organisation}{chapter.3}% 18
\BOOKMARK [2][-]{subsection.3.2.1}{Datenmodellierung}{section.3.2}% 19 \BOOKMARK [2][-]{subsection.3.2.1}{Datenmodellierung}{section.3.2}% 19
\BOOKMARK [2][-]{subsection.3.2.2}{Verwaltung\040im\040Administrator-Back-end}{section.3.2}% 20 \BOOKMARK [2][-]{subsection.3.2.2}{Verwaltung\040im\040Administrator-Back-end}{section.3.2}% 20
\BOOKMARK [2][-]{subsection.3.2.3}{Berechtigung\040der\040User}{section.3.2}% 21
\BOOKMARK [2][-]{subsection.3.2.3}{Berechtigungen\040der\040User}{section.3.2}% 21
\BOOKMARK [1][-]{section.3.3}{Funktionen}{chapter.3}% 22 \BOOKMARK [1][-]{section.3.3}{Funktionen}{chapter.3}% 22
\BOOKMARK [2][-]{subsection.3.3.1}{Verwalten}{section.3.3}% 23 \BOOKMARK [2][-]{subsection.3.3.1}{Verwalten}{section.3.3}% 23
\BOOKMARK [2][-]{subsection.3.3.2}{Abonnieren}{section.3.3}% 24 \BOOKMARK [2][-]{subsection.3.3.2}{Abonnieren}{section.3.3}% 24
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 26 \BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 26
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 27 \BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 27
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 28 \BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 28
\BOOKMARK [0][-]{chapter*.19}{Referenzen}{}% 29
\BOOKMARK [0][-]{chapter*.20}{Referenzen}{}% 29

BIN
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.synctex.gz View File


+ 4
- 4
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc View File

\contentsline {section}{\numberline {3.2}Organisation}{15}{section.3.2} \contentsline {section}{\numberline {3.2}Organisation}{15}{section.3.2}
\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1} \contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1}
\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2} \contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2}
\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{18}{subsection.3.2.3}
\contentsline {subsection}{\numberline {3.2.3}Berechtigungen der User}{18}{subsection.3.2.3}
\contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3} \contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3}
\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1} \contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}
\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{22}{subsection.3.3.2}
\contentsline {subsection}{\numberline {3.3.3}Filtern}{24}{subsection.3.3.3}
\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{23}{subsection.3.3.2}
\contentsline {subsection}{\numberline {3.3.3}Filtern}{25}{subsection.3.3.3}
\contentsline {chapter}{\numberline {4}Ergebnis}{27}{chapter.4} \contentsline {chapter}{\numberline {4}Ergebnis}{27}{chapter.4}
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{27}{subsection.4.0.1} \contentsline {subsection}{\numberline {4.0.1}Evaluierung}{27}{subsection.4.0.1}
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{28}{chapter.5} \contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{28}{chapter.5}
\contentsline {chapter}{Referenzen}{29}{chapter*.19}
\contentsline {chapter}{Referenzen}{29}{chapter*.20}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux View File

\setcounter{r@tfl@t}{0} \setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0} \setcounter{AM@survey}{0}
\setcounter{Item}{0} \setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hy@AnnotLevel}{0} \setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{27} \setcounter{bookmark@seq@number}{27}
\setcounter{NAT@ctr}{0} \setcounter{NAT@ctr}{0}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux View File

\setcounter{r@tfl@t}{0} \setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0} \setcounter{AM@survey}{0}
\setcounter{Item}{0} \setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hy@AnnotLevel}{0} \setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{27} \setcounter{bookmark@seq@number}{27}
\setcounter{NAT@ctr}{0} \setcounter{NAT@ctr}{0}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux View File

\setcounter{r@tfl@t}{0} \setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0} \setcounter{AM@survey}{0}
\setcounter{Item}{0} \setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hy@AnnotLevel}{0} \setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{28} \setcounter{bookmark@seq@number}{28}
\setcounter{NAT@ctr}{0} \setcounter{NAT@ctr}{0}

+ 11
- 10
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux View File

\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12}} \@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{18}{subsection.3.2.3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Berechtigungen der User}{18}{subsection.3.2.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13}} \@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13}}
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3}} \@writefile{toc}{\contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14}} \@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{22}{subsection.3.3.2}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{24}{figure.caption.16}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{24}{subsection.3.3.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.7}{\ignorespaces Prototyp Newsfeed Seite\relax }}{25}{figure.caption.17}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.8}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{26}{figure.caption.18}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Prototyp Artikel-Editor.\relax }}{22}{figure.caption.15}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.16}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{23}{subsection.3.3.2}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.7}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{24}{figure.caption.17}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.8}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{24}{figure.caption.18}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{25}{subsection.3.3.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.9}{\ignorespaces Prototyp Newsfeed Seite\relax }}{26}{figure.caption.19}}
\@setckpt{chapters/prototyp}{ \@setckpt{chapters/prototyp}{
\setcounter{page}{27} \setcounter{page}{27}
\setcounter{equation}{0} \setcounter{equation}{0}
\setcounter{enumii}{0} \setcounter{enumii}{0}
\setcounter{enumiii}{0} \setcounter{enumiii}{0}
\setcounter{enumiv}{0} \setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{footnote}{5}
\setcounter{mpfootnote}{0} \setcounter{mpfootnote}{0}
\setcounter{part}{0} \setcounter{part}{0}
\setcounter{chapter}{3} \setcounter{chapter}{3}
\setcounter{subsubsection}{0} \setcounter{subsubsection}{0}
\setcounter{paragraph}{0} \setcounter{paragraph}{0}
\setcounter{subparagraph}{0} \setcounter{subparagraph}{0}
\setcounter{figure}{8}
\setcounter{figure}{9}
\setcounter{table}{0} \setcounter{table}{0}
\setcounter{float@type}{8} \setcounter{float@type}{8}
\setcounter{parentequation}{0} \setcounter{parentequation}{0}
\setcounter{r@tfl@t}{0} \setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0} \setcounter{AM@survey}{0}
\setcounter{Item}{0} \setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hy@AnnotLevel}{0} \setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{25} \setcounter{bookmark@seq@number}{25}
\setcounter{NAT@ctr}{0} \setcounter{NAT@ctr}{0}

BIN
doc/bachelorarbeit_EstherKleinhenz/bachelorabeit_EstherKleinhenz.pdf View File


+ 9
- 7
doc/bachelorarbeit_EstherKleinhenz/chapters/framework.tex View File



Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden (vgl. [Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen lookup-Tabelle notwendig, die die Entitäten zweier Tabellen direkt verlinkt, anstatt diese generische zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass er Zugriff auf diese einheitlich geschieht. Au"serdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern. Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden (vgl. [Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen lookup-Tabelle notwendig, die die Entitäten zweier Tabellen direkt verlinkt, anstatt diese generische zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass er Zugriff auf diese einheitlich geschieht. Au"serdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern.


Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile eingefügt (vgl. [Gay10]):
Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile eingefügt (vgl. [Gay10]):
\\ \\
\begin{addmargin}[0pt]{0pt}
\noindent\hspace*{10mm}% \noindent\hspace*{10mm}%
{\tt \$ pip install django-taggit }
\texttt{\$ pip install django-taggit }
\\ \\
\end{addmargin}
Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert. Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert.
Au"serdem muss taggit in der settings.py unter INSTALLED\_APPS ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschreiben werden.
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde. Neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jedes Wort, dass durch ein Komma oder ein Leerzeichen getrennt ist als ein Tag. Soll dieses jedoch aus mehreren Wörtern bestehen so müssen diese mit Anführungszeichen umfasst werden. Standardmäßig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, Tags sind also case sensitive. Ändern kann man das, indem der Boolean TAGGIT\_CASE\_INSENSITIVE in der settings.py auf True gestellt wird.
Au"serdem muss taggit in der settings.py unter \texttt{INSTALLED\_APPS} ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschreiben werden.
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde. Neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jedes Wort, dass durch ein Komma oder ein Leerzeichen getrennt ist als ein Tag. Soll dieses jedoch aus mehreren Wörtern bestehen so müssen diese mit Anführungszeichen umfasst werden. Standardmäßig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, Tags sind also case sensitive. Ändern kann man das, indem der Boolean \texttt{TAGGIT\_CASE\_INSENSITIVE} in der settings.py auf True gestellt wird.


\subsection {Hilfsbibliotheken} \subsection {Hilfsbibliotheken}
---warum habe ich diese bibs gealden (beschreibung evtl in prototyp) ---warum habe ich diese bibs gealden (beschreibung evtl in prototyp)
Weitere Add-ons werden geladen um kleinere Funktionen der Website einfach umsetzen zu können. Zu diesen gehört django-taggit-templatetags, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Tags öfters vor als andere, so werden sie entsprechend grö"ser dargestellt.
Weitere Add-ons werden geladen um kleinere Funktionen der Website einfach umsetzen zu können. Zu diesen gehört \texttt{django-taggit-templatetags}, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Tags öfters vor als andere, so werden sie entsprechend grö"ser dargestellt.


Django-hitcount dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der HitCountDetailView in views.py die Variable hitcount verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der settings.py ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.
Django-hitcount dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der \texttt{HitCountDetailView} in views.py die Variable \texttt{hitcount} verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der settings.py ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.


Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich django-post-office (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt werden, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Die Benachrichtigungen können asynchron versendet werden mit einem integrierten Planungsmanager. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.
Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich \texttt{django-post-office} (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt werden, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Die Benachrichtigungen können asynchron versendet werden mit einem integrierten Planungsmanager. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.




\section{Bootstrap} \section{Bootstrap}

+ 62
- 38
doc/bachelorarbeit_EstherKleinhenz/chapters/prototyp.tex View File



\section{Organisation} \section{Organisation}


Zum Entwickeln des Prototypen wird die Open-Source- Entwicklungsumgebung Visual Studio Code von Microsoft verwendet. Die dynamische Oberfläche ist sehr performant, da sie wenig Speicherplatz bedarf und zunächst ohne grö"sere Ergänzungen sofort einsetzbar ist. Um den Code mit Shortcuts übersichtlicher zu gestalten und auf Python und Django abstimmen zu können werden aus der üppigen Extension-Bibliothek kostenlose Erweiterungen eingebunden. Unter Anderem sind die folgenden Add-on's während der Arbeit zum Einsatz gekommen (vgl. [Mic18]):
Zum Entwickeln des Prototypen wird die Open-Source-Entwicklungsumgebung Visual Studio Code von Microsoft verwendet. Die dynamische Oberfläche ist sehr performant, da sie wenig Speicherplatz bedarf und zunächst ohne grö"sere Ergänzungen sofort einsetzbar ist. Um den Code mit Shortcuts übersichtlicher zu gestalten und auf Python und Django abstimmen zu können werden aus der Extension-Bibliothek Erweiterungen eingebunden. Unter Anderem sind die folgenden Add-on's während der Arbeit zum Einsatz gekommen (vgl. [Mic18]):


\begin{itemize} \begin{itemize}
\item Python von Microsoft (Linting und Debugging) \item Python von Microsoft (Linting und Debugging)
\item Python Extension Pack (Django Code-Vervollständigung) \item Python Extension Pack (Django Code-Vervollständigung)
\end{itemize} \end{itemize}


Der entwickelte Syntax wird regelmä"sig auf das hochschulinterne Git-Repository geladen. Hier kann man mit Hilfe der verwendeten IDE bei der Überarbeitung im sogenannten \texttt{Working-Tree} die Änderungen visuell einsehen und wenn nötig bearbeiten. Es wird ausschlie"slich auf den Master-Branch gepusht, da nur ein Entwickler an dem Prototyp tätig ist. Lediglich zum Testen experimenteller Bibliotheken werden neue Branches angelegt und diese, falls Sie sich als hilfreich erweisen, mit dem Master-Branch fusionieren.
Der entwickelte Syntax wird regelmä"sig auf das hochschulinterne Git-Repository geladen. Hier kann man mit Hilfe der verwendeten \textit{IDE} \footnote{ IDE bedeutet Integrierte Entwicklungs Umgebung, die verschiedenste Sprachen vereinen kann. }
während der Überarbeitung im \texttt{Working-Tree} die Änderungen visuell einsehen und wenn nötig bearbeiten. Es wird ausschlie"slich auf den \textit{Master-Branch} \textit{gepusht}, da nur ein Entwickler am Prototyp tätig ist. Lediglich zum Testen experimenteller Bibliotheken werden neue Branches angelegt und diese, falls Sie sich als hilfreich erweisen, mit dem Master-Branch fusionieren.


Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird dies im folgenden genauer beschrieben. Die unterste Projektebene wird durch die manage.py-Datei gebildet. Sie wird unter Anderem genutzt um den lokalen Server starten zu können. In der Ebene darüber findet sich im Ordner \texttt{mysite} die Datei settings.py. Hier werden die allgemeinen Einstellungen der Website vorgenommen, wie zum Beispiel das Integrieren der Erweiterungen und der Pfad zu den hinterlegten Templates. Au"serdem ist die urls.py dort zu finden, deren Funktion bereits im Kapitel Django erläutert wurde. Die \texttt{\_\_init\_\_.py} und wsgi.py sind trivial und deshalb wird hier nicht weiter darauf eingegangen. Im Ordner \texttt{thisisenv} sind alle Bibliotheken und Add-on's der virtuellen Umgebung hinterlegt. Der Fokus dieser Arbeit liegt im Ordner \texttt{application}. Hier sind die Datenbank-Migrationen, die Static-Files wie bootstrap und css, und alle Templates abgelegt. Zudem befindet sich hier die Logik des Prototypen, auf die im Kapitel \texttt{Funktionen} weiter eingegangen wird.

Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird dies im folgenden genauer beschrieben. Die unterste Projektebene wird durch \texttt{manage.py} gebildet. Sie wird unter Anderem genutzt um den lokalen Server starten zu können. In der Ebene darüber findet sich im Ordner \texttt{mysite} die Datei \texttt{settings.py}. Hier werden die allgemeinen Einstellungen der Website vorgenommen, wie zum Beispiel das Integrieren der Erweiterungen und der Pfad zu den hinterlegten Templates. Au"serdem ist die \texttt{urls.py} dort zu finden, deren Funktion bereits im Kapitel Django erläutert wurde. Die Dateien \texttt{\_\_init\_\_.py} und \texttt{wsgi.py} sind trivial und deshalb wird hier nicht weiter darauf eingegangen. Im Ordner \texttt{thisisenv} sind alle Bibliotheken und Add-on's der virtuellen Umgebung hinterlegt. Der relevanteste Teil dieser Arbeit liegt im Ordner \texttt{application}. Hier sind die Datenbank-Migrationen, die Static-Files wie bootstrap und css, und alle Templates abgelegt. Zudem befindet sich hier die Logik des Prototypen, auf die im Kapitel \texttt{Funktionen} weiter eingegangen wird.




\subsection{Datenmodellierung} \subsection{Datenmodellierung}
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen dessen werden hier genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \texttt{UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \texttt{PostModel} und abschlie"send werden die Zusammenhänge der Modelle dargestellt.
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen dessen werden genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \texttt{UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \texttt{PostModel} und abschlie"send werden die Zusammenhänge dieser dargestellt.


Alle Modelle werden als Django-Modelle deklariert um beim kompilieren des Codes dem Compiler mitzuteilen, dass diese integriert werden müssen (vgl. [Dja18]). Mit der folgenden Eingabe
Alle Modelle werden als Django-Modelle deklariert um beim kompilieren des Codes dem Compiler mitzuteilen, dass eine Integration stattfinden muss (vgl. [Dja18]). Mit der folgenden Eingabe
\\ \\
\begin{addmargin}[0pt]{0pt} \begin{addmargin}[0pt]{0pt}
\noindent\hspace*{10mm}% \noindent\hspace*{10mm}%
\texttt{ \$ python3 manage.py makemigrations} \texttt{ \$ python3 manage.py makemigrations}
\\ \\
\end{addmargin} \end{addmargin}
werden die neun Tabellen der Modelle erstellt. Um diese dann auch anwenden zu können, muss der Befehl
werden die neun Tabellen der Modelle erstellt. Um diese anwenden zu können, muss der Befehl
\\ \\
\begin{addmargin}[0pt]{0pt} \begin{addmargin}[0pt]{0pt}
\noindent\hspace*{10mm}% \noindent\hspace*{10mm}%
\end{itemize} \end{itemize}
Das Feld \texttt{groups} wird in dieser Arbeit nicht verwendet und deshalb im Folgenden ignoriert. Das Feld \texttt{groups} wird in dieser Arbeit nicht verwendet und deshalb im Folgenden ignoriert.


In models.py ist der \texttt{CustomUser} dafür verantwortlich das neue Feld mit dem \texttt{Default-User} zu verknüpfen. Durch das \texttt{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \texttt{OneToOne} bildet eine einzigartige Zuordnung von zwei Objekten, sodass der Rückgabewert nur aus einem Objekt besteht (vgl. [Fou18a]). Das hei"st, dass hier keine Rekursiven, also auf sich selbst verlinkende oder \texttt{lazy} Beziehungen möglich sind um Konflikte bei der Authentifizierung zu vermeiden. Dies ist die übliche Vorgehensweise um mit einem Primärschlüssel das Default-Model zu erweitern. \\
In models.py ist der \texttt{CustomUser} dafür verantwortlich das neue Feld mit dem \texttt{Default-User} zu verknüpfen. Durch das \texttt{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \texttt{OneToOne} bildet eine einzigartige Zuordnung von zwei Objekten, sodass der Rückgabewert eindeutig ist (vgl. [Fou18a]). Das hei"st, dass hier keine Rekursiven, also auf sich selbst verlinkende oder \texttt{lazy} Beziehungen möglich sind um Konflikte bei der Authentifizierung zu vermeiden. Dies ist die übliche Vorgehensweise um mit einem Primärschlüssel das Default-Model zu erweitern. \\
\begin{figure}[!h] \begin{figure}[!h]
\centering \centering
\includegraphics[width=1\textwidth]{figures/custommodelcode} \includegraphics[width=1\textwidth]{figures/custommodelcode}


\textbf{PostModel:} \textbf{PostModel:}
\begin{addmargin}[25pt]{0pt} \begin{addmargin}[25pt]{0pt}
Das \texttt{PostModel} beschreibt alle Felder die ein Post enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com gehören dazu folgende:
Das \texttt{PostModel} beschreibt alle Felder die ein Artikel enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com gehören dazu folgende:
\begin{itemize} \begin{itemize}
\item author, title, text, created\_date, published\_date, tags \item author, title, text, created\_date, published\_date, tags
\end{itemize} \end{itemize}
Der Autor ist durch einen \texttt{ForeignKey} mit dem \texttt{UserModel} verbunden. Diese sogenannte \texttt{ManyToOne} Verbindung reicht hier aus um einem Post den Autor, also dem eingeloggten User, zuzuweisen. Title ist ein \texttt{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wir deshalb als \texttt{TextField} deklariert. Erstellungsdatum und Publikation sind beides \texttt{DateTimeField}s. Ersteres muss vom Ersteller angegeben werden, Zweiteres kann zunächst offen gelassen werden durch die Zusatzangabe \texttt{null=True}. Ein weiteres Feld tags wird hinzugefügt um den Posts unabhängig von den Usern Tags zuordnen zu können.
Der Autor ist durch einen \texttt{ForeignKey} mit dem \texttt{UserModel} verbunden. Diese \texttt{ManyToOne} Verbindung reicht hier aus um einem Post einem Autor, also dem eingeloggten User, zuzuweisen. \texttt{Title} ist ein \texttt{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wir deshalb als \texttt{TextField} deklariert. Erstellungsdatum und Publikation sind beides \texttt{DateTimeFields}. Ersteres muss vom Ersteller angegeben werden, Zweiteres kann zunächst durch die Zusatzangabe \texttt{null=True} offen gelassen werden. Ein weiteres Feld wird hinzugefügt um Artikeln unabhängig von Usern Tags zuordnen zu können.
\\ \\
\end{addmargin} \end{addmargin}


\textbf{Gesamtmodellierung:} \textbf{Gesamtmodellierung:}


\begin{addmargin}[25pt]{0pt} \begin{addmargin}[25pt]{0pt}
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \texttt{User} und \texttt{Post}. Au"serdem verdeutlicht es die Erweiterung des User-Modells von Django mit dem in der Applikation angelegtem CustomUser. Die im User vorkommenden booleschen Felder werden im Kapitel Berechtigung der User genauer erörtert.
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \texttt{User} und \texttt{Post}. Au"serdem verdeutlicht es die Erweiterung des User-Modells von Django mit dem in der Applikation angelegtem CustomUser. Die im User vorkommenden \textit{booleschen Felder} \footnote{ Boolesche Felder können eines von zwei Werten enthalten, Wahr oder Fasch. }
werden im Kapitel Berechtigungen der User genauer erörtert.


\begin{figure}[!h] \begin{figure}[!h]
\centering \centering
\includegraphics[width=0.9\textwidth]{figures/datamodel} \includegraphics[width=0.9\textwidth]{figures/datamodel}


Ein Django-Projekt bildet bereits beim Einrichten, \texttt{per Default}, eine Administrator-Oberfläche um die Inhalte der Website kontrollieren zu können. Nach der Migration von den oben genannten Modellen wird diese erweitert. Nich zu vergessen sind die externen Tabellen der installierten Add-on's, die nach der Migration das Back-end expandieren. Ein Django-Projekt bildet bereits beim Einrichten, \texttt{per Default}, eine Administrator-Oberfläche um die Inhalte der Website kontrollieren zu können. Nach der Migration von den oben genannten Modellen wird diese erweitert. Nich zu vergessen sind die externen Tabellen der installierten Add-on's, die nach der Migration das Back-end expandieren.


---eevtl kapitel löschen



\subsection{Berechtigung der User}
Im Allgemeinen verwendet man Berechtigungen um Benutzern Zugang zu bestimmten Resourcen in einem Netzwerk einzuräumen. Au"serdem bestimmt es die Arte des Zugangs, also ob der User die Resourcen nur lesen oder auch verändern oder löschen darf(vgl. [Com18]). Die Rechte werden meist einzelnen Individuen oder einer Gruppe zugeordnet.
\subsection{Berechtigungen der User}
Im Allgemeinen verwendet man Berechtigungen um Benutzern Zugang zu bestimmten Resourcen in einem Netzwerk einzuräumen. Au"serdem bestimmt es die Art des Zugangs, also ob der User die Resourcen nur lesen oder auch verändern oder löschen darf (vgl. [Com18]). Die Rechte werden meist einzelnen Individuen oder einer Gruppe zugeordnet.


Das gestaffeltes Berechtigungsmanagement ist im Prototyp notwendig um den Umgang mit Informationen so sicher wie möglich zu gestalten und um die Nachhaltigkeit dieser zu bewahren. Des Weiteren soll der Prototyp als Vorlage für die Erweiterung der Hochschulwebsite dienen und daher ist eine ähnliche Verteilung der Zugangsberechtigungen sinnvoll.
Das gestaffelte Berechtigungsmanagement ist im Prototyp notwendig um den Umgang mit Informationen so sicher wie möglich zu gestalten und um die Nachhaltigkeit dieser zu bewahren. Des Weiteren soll der Prototyp als Vorlage für die Erweiterung der Hochschulwebsite dienen und daher ist eine ähnliche Verteilung der Zugangsberechtigungen sinnvoll.


Studenten sollen zunächst Informationen weder einpflegen, noch editieren dürfen. Die einzigen Änderungen die sie vornehmen können sind auf Ihre eigene Datenbank fokussiert. Das Hinzufügen von Tags um die damit verbunden Posts auf dem persönlichen Dashboard zu sehen wird ihnen gewährleistet. Dies soll verhindern, dass Informationen nicht zu leichtfertig geändert oder gelöscht werden. Studenten sollen zunächst Informationen weder einpflegen, noch editieren dürfen. Die einzigen Änderungen die sie vornehmen können sind auf Ihre eigene Datenbank fokussiert. Das Hinzufügen von Tags um die damit verbunden Posts auf dem persönlichen Dashboard zu sehen wird ihnen gewährleistet. Dies soll verhindern, dass Informationen nicht zu leichtfertig geändert oder gelöscht werden.


Dozenten und Angestellte der Hochschule sind dazu berechtigt, Posts zu erstellen, zu editieren und wieder zu löschen. Zudem können sie, wie Studenten, Tags abonnieren und somit ebenso das persönliche Dashboard gestalten. Das Einloggen in die Administratoroberfläche kann vorgenommen werden, jedoch sind der Gruppe noch keinerlei Rechte zugewiesen. Möchte man dies ändern, kann man das von Django bereitgestellte Feld \texttt{User Permissions} im Admin-back-end unter Users, und dem Namen der Person, die gewünschte Berechtigung zuteilen. Diese sind von Django vorgegeben und betreffen alle vorhandenen Modelle der Applikation. Soll ein User zum Beispiel erlaubt sein einen Tag aus dem Archiv zu löschen, so wählt er das Feld \texttt{ taggit \textbar Tag \textbar can delete Tag} und schiebt es von der Auswahl zu den Berechtigungen.
Durch das Setzen des booleschen Wert \texttt{is\_staff} auf \texttt{True} beim Erstellen der Benutzer, ist es möglich im Code der Applikation Abfragen durchzuführen. Dadurch lassen sich bestimmte Views an die eingeloggte Personengruppe anpassen. So ist das Menü für Dozenten und Angestellte ein umfangreicheres als das, der Studenten.
Dozenten und Angestellte der Hochschule sind dazu berechtigt, Posts zu erstellen, zu editieren und wieder zu löschen. Zudem können sie, wie Studenten, Tags abonnieren und somit ebenso das persönliche Dashboard gestalten. Das Einloggen in die Administratoroberfläche kann vorgenommen werden, jedoch sind der Gruppe noch keinerlei Rechte zugewiesen. Möchte man dies ändern, kann man das von Django bereitgestellte Feld \texttt{User Permissions} im Admin-back-end unter Users, und dem Namen der Person, die gewünschte Berechtigung zuteilen. Diese sind von Django vorgegeben und betreffen alle vorhandenen Modelle der Applikation.
Durch das Setzen des booleschen Wert \texttt{is\_staff} auf \texttt{True} beim Erstellen der Benutzer, ist es möglich im Code der Applikation Abfragen durchzuführen. Dadurch lassen sich bestimmte Views an die eingeloggte Personengruppe anpassen. So ist unter Anderem das Menü der Dozenten und Angestellte ein umfangreicheres als das, der Studenten.




\section{Funktionen} \section{Funktionen}
Um die wichtigsten Funktionen des Prototypen festlegen zu können werden User Stories erstellt (vgl. Abbildung 3.4.). Diese bestehen aus kurzen Sätzen und beschreiben aus Sicht des Nutzers das Verwenden einer Funktion. Die Priorisierung bezieht sich hierbei auf die Relevanz der Funktion, wobei die Funktionen mit einem rotem Punkt sehr wichtig für den Prototypen sind, Orang wichtige Funktionen sind aber nicht unbedingt notwendig und Grün kaum relevant sind. \\
Um die wichtigsten Funktionen des Prototypen festlegen zu können werden User Stories erstellt (vgl. Abbildung 3.4.). Diese bestehen aus kurzen Sätzen und beschreiben aus Sicht des Nutzers das Verwenden einer Funktion. Die Priorisierung bezieht sich hierbei auf die Relevanz der Funktion, wobei die Funktionen mit einem rotem Punkt sehr wichtig für den Prototypen sind, Orang wichtige Funktionen sind aber nicht unbedingt notwendig und Grün kaum Relevanz haben. \\


\begin{figure}[!h] \begin{figure}[!h]
\centering \centering
Das Verwalten der Artikel soll von berechtigten Nutzern im Front-end stattfinden, hingegen die prozessuale Logik im Code-Back-end passiert. Der Vorgang des Erstellens, des Löschens und des Editierens der einzelnen Einträge wird im Folgenden konkretisiert. Das Verwalten der Artikel soll von berechtigten Nutzern im Front-end stattfinden, hingegen die prozessuale Logik im Code-Back-end passiert. Der Vorgang des Erstellens, des Löschens und des Editierens der einzelnen Einträge wird im Folgenden konkretisiert.
\\ \\
\\ \\
Einen neuen Artikel erstellen:
\textbf{Einen neuen Artikel erstellen: }


Das \texttt{+} in der Menüleiste leitet den Benutzer zu einer Unterseite. Hier können alle Felder befüllt werden, die im PostForm-Formular in der Datei forms.py festgelegt wurden. Dazu gehören der Titel und der Text, die als Pflichtfelder gelten. Das Feld \texttt{Tags} muss ebenfalls mindestens einen Wert enthalten um die Validierung der Eingaben sichern zu können. Eine Ausnahme bildet das Datum der Veröffentlichung. Bleibt das Feld leer so wird der Post automatisch der Liste der Entwürfe beigefügt.
Das \texttt{+} in der Menüleiste leitet den Benutzer zu einer Unterseite. Hier können alle Felder befüllt werden, die im \texttt{PostForm}-Formular in der Datei \texttt{forms.py} festgelegt wurden. Dazu gehören der Titel und der Text, die als Pflichtfelder gelten. Das Feld \texttt{Tags} muss ebenfalls mindestens einen Wert enthalten um die Validierung der Eingaben sichern zu können. Eine Ausnahme bildet das Datum der Veröffentlichung. Bleibt das Feld leer so wird der Post automatisch der Liste der Entwürfe beigefügt.


Speichert der Benutzer nun den Artikel, so werden im Back-end die Daten wir folgt verarbeitet. In der View \texttt{post\_new} wird zunächst die Validität aller Eingaben geprüft. Falls dies der Fall ist, wird der Post als Objekt zurückgegeben, jedoch durch das optionale Keywort \texttt{commit=false} noch nicht in der Datenbank abgelegt. Das ist notwendig um dem Objekt spezifische Informationen mitzugeben. In diesem Kontext wird der aktuell eingeloggte User als Autor hinterlegt. Jedoch birgt die Vorgehensweise eine Problematik im Speichervorgang einer \texttt{ManyToMany} Relation zwischen zwei Modellen. Da Informationen nur auf ein bereits in der Datenbank bestehendes Objekt gesichert werden können ist dies zunächst nicht möglich (vgl. [Fou18b]). Speichert der Benutzer nun den Artikel, so werden im Back-end die Daten wir folgt verarbeitet. In der View \texttt{post\_new} wird zunächst die Validität aller Eingaben geprüft. Falls dies der Fall ist, wird der Post als Objekt zurückgegeben, jedoch durch das optionale Keywort \texttt{commit=false} noch nicht in der Datenbank abgelegt. Das ist notwendig um dem Objekt spezifische Informationen mitzugeben. In diesem Kontext wird der aktuell eingeloggte User als Autor hinterlegt. Jedoch birgt die Vorgehensweise eine Problematik im Speichervorgang einer \texttt{ManyToMany} Relation zwischen zwei Modellen. Da Informationen nur auf ein bereits in der Datenbank bestehendes Objekt gesichert werden können ist dies zunächst nicht möglich (vgl. [Fou18b]).
Im Prototyp nutzt das \texttt{PostModel} die \texttt{ManyToMany} Konnektivität mit dem Modell des TaggabelManagers. Um die Eingabe des Tag-Felds trotzdem im neuen Artikel speichern zu können, wird zunächst das Objekt gespeichert, um nachdem explizit das von Django zur Verfügung gestellte \texttt{form.save\_m2m()} aufrufen zu können. Dieser Befehl zwingt die Daten der \texttt{ManyToMany} Relation zu speichern.
Im Prototyp nutzt das \texttt{PostModel} die \texttt{ManyToMany} Konnektivität mit dem Modell des \texttt{TaggabelManagers}. Um die Eingabe des Tag-Felds trotzdem im neuen Artikel speichern zu können, wird zunächst das Objekt gespeichert, um nachdem explizit das von Django zur Verfügung gestellte \texttt{form.save\_m2m()} aufrufen zu können. Dieser Befehl zwingt die Daten der \texttt{ManyToMany} Relation zu speichern.


Die eindeutige Zuordnung der Eingabe im Front-end zur Verarbeitung der Artikel im Back-end ist mit einem \texttt{Primary Key} realisiert. Das \texttt{PostModel} bekommt beim Anlegen keinen solchen Schlüssel zu einem Feld zugewiesen. Ist das der Fall, erstellt Django automatisiert beim Speichern der Tabelle diesen als \texttt{AutoField} im Feld \texttt{Id} und zählt bei jedem neu Erstellen eines Objekts hoch. Somit sind alle Objekte eindeutig zuordenbar und können mit dem Kommando \texttt{post.pk} jederzeit aufgerufen werden.
Die eindeutige Zuordnung der Eingabe im Front-end zur Verarbeitung der Artikel im Back-end ist mit einem \texttt{Primary Key} realisiert. Das \texttt{PostModel} bekommt beim Anlegen keinen solchen Schlüssel zu einem Feld zugewiesen. Django erstellt automatisiert beim Speichern der Tabelle diesen als \texttt{AutoField} im Feld \texttt{Id} und identifiziert automatisch bei jedem neu Erstellen eines Objekts. Somit sind alle Objekte eindeutig zuordenbar und können mit dem Kommando \texttt{post.pk} jederzeit aufgerufen werden.
\\ \\
\\ \\
Einen bereits vorhandenen Artikel löschen:
\textbf{Einen bereits vorhandenen Artikel löschen: }


In der Detailansicht eines Artikels ist es möglich diesen durch klicken auf den Button Löschen zu entfernen. Die View \texttt{post\_remove} selektiert über den im Template mitgegebenen \texttt{Primary Key} das Objekt und speichert dies in der Variable \texttt{post}. Um dem Benutzer nochmals mitteilen zu können, welchen Artikel er entfernt hat, wird vor dem Löschen eine Nachricht mit dem Titel dessen generiert. Nachdem wird dieser gelöscht (\texttt{post.remove()}) und eine Umleitung am Ende der View-Definition schickt den Benutzer auf die Seite der Artikelliste. Hier wird die vorher erstellte Nachricht aus informellen Gründen eingebunden.
In der Detailansicht eines Artikels ist es möglich diesen zu entfernen. Die View \texttt{post\_remove} selektiert über den im Template mitgegebenen \texttt{Primary Key} das Objekt und speichert dies in der Variable \texttt{post}. Um dem Benutzer zu vergewissern, welcher Artikel entfernt wird, wird vor dem Löschen eine Nachricht mit dem Titel dessen generiert. Nachdem wird dieser gelöscht (\texttt{post.remove()}) und eine Umleitung am Ende der View-Definition schickt den Benutzer auf die Seite der Artikelliste. Hier wird die vorher erstellte Nachricht aus informellen Gründen visualisiert.
\\ \\
\\ \\
Einen bereits vorhandenen Artikel bearbeiten:
\textbf{Einen bereits vorhandenen Artikel bearbeiten: }


Ähnlich wie beim Löschen eines Artikel, kann man diesen in der Detailansicht bearbeiten. Mit dem Betätigen des Bearbeiten-Buttons wird der User auf den Artikel-Editor weitergeleitet. Die Seite zeigt die Form, wie beim Erstellen eines neuen Artikels, nur dass hier die Felder bereits den Inhalt des zu Editierenden Textes enthalten. Dazu wird in der View über den \texttt{Primary Key} der Artikel einer Variable \texttt{post} zugeordnet. Die bedingte Anweisung fragt in Zeile 91 der Abbildung 3.5., ob der Benutzer die Eingaben bereits zum Speichern veranlasst hat. Wird die Bedingung zunächst nicht erfüllt, rendert die Funktion lediglich die \texttt{PostForm}, mit dem bereits eingepflegten Inhalt durch eine GET-Abfrage in der die Daten des Artikels als Instanz übermittelt werden (vgl. Abbildung 3.5. Zeile 100).
Ähnlich wie beim Löschen eines Artikel, kann man diesen in der Detailansicht bearbeiten. Dazu wird in der View über den \texttt{Primary Key} der Artikel einer Variable \texttt{post} zugeordnet. Die bedingte Anweisung rendert zunächst die \texttt{PostForm}, mit dem bereits eingepflegten Inhalt durch eine GET-Abfrage (vgl. Abbildung 3.5.).

\begin{figure}[!h]
\centering
\includegraphics[width=0.9\textwidth]{figures/postedit}
\caption{Prototyp Artikel-Editor.}
\hfill
\end{figure}


Betätigt der Benutzer den Speichern-Button im Front-end wird die bedingte Abfrage in Zeile 91 erfüllt. Die POST-Abfrage ist hier notwendig, da Django nur so Daten in der Datenbank verändert. Eine Begründung hierfür ist die Art der Übertragung der Daten an den Server. \texttt{POST-Requests} bündeln alle Daten, verschlüsseln diese und senden Sie dann an der Server (vgl. [Fou18c]). Dadurch ist der Vorgang einfacher kontrollierbar und mit einem \texttt{csrf-Token} im Template ebenfalls gegen Cross-Site-Request-Fälschung abgesichert. Die weitere Vorgehensweise der Funktion ist identisch zum bereits erwähnten neu Erstellen eines Artikels und muss nicht weiter beschreiben.\\
Veranlasst der Benutzer die Speicherung des Artikels im Front-end, wird die bedingte Abfrage der Abbildung 3.6. in Zeile 91 erfüllt. Die POST-Abfrage ist hier notwendig, da Django nur so Daten in der Datenbank verändert. Eine Begründung hierfür ist die Art der Übertragung der Daten an den Server. \texttt{POST-Requests} bündeln alle Daten, verschlüsseln diese und senden sie dann an der Server (vgl. [Fou18c]). Dadurch ist der Vorgang einfacher kontrollierbar und mit einem \texttt{csrf-Token} im Template ebenfalls gegen Cross-Site-Request-Fälschung abgesichert. Die weitere Vorgehensweise der Funktion ist identisch zum bereits erwähnten neu Erstellen eines Artikels und muss nicht weiter beschrieben werden.\\


\begin{figure}[!h] \begin{figure}[!h]
\centering \centering


\subsection{Abonnieren} \subsection{Abonnieren}


Das Abonnieren bestimmter Themengebiete ist eines der wichtigsten Funktionen im Prototyp.
Das Abonnieren bestimmter Themengebiete ist eines der wichtigsten Funktionen im Prototyp um die eingepflegten Informationen zielgerichtet anzeigen zu können.


Nach längerer Recherche im Netz wird unter Berücksichtigung aller Vor- und Nachteile ein Tag-Modell zur Umsetzung hierfür gewählt. Wie bereits in der Datenmodellierung angedeutet, besitzt jeder Artikel beschreibende Tags. Hierbei handelt es sich um kurze stichwortartige Beschreibungen, die den diesen so gut wie möglich charakterisieren. Abhängig vom Umfang des Blogsystems sollte die Anzahl der Tags immer in einem gewissen Rahmen vorhanden sein. Das bedeutet zum Einen, dass Ersteller von Artikeln immer die gleich Menge der Schlagwörter verwenden, wobei geringe Abweichungen möglich sind (vgl. [Gmb18]). Hat das System bereits einen grö"seren Umfang angenommen, sollten zum Anderen keine neuen Tags erstellt werden um die Übersicht für Autoren und Leser zu bewahren.
Nach längerer Recherche im Netz wird unter Berücksichtigung aller Vor- und Nachteile ein Tag-Modell zur Umsetzung hierfür gewählt. Wie bereits in der Datenmodellierung angedeutet, besitzt jeder Artikel beschreibende Tags. Hierbei handelt es sich um kurze stichwortartige Beschreibungen, die den diesen so gut wie möglich charakterisieren. Abhängig vom Umfang des Blogsystems sollte die Anzahl der Tags immer in einem gewissen Rahmen vorhanden sein. Das bedeutet zum Einen, dass Ersteller von Artikeln immer die gleich Menge der Schlagwörter verwenden, wobei geringe Abweichungen möglich sind (vgl. [Gmb18]). Hat das System bereits einen grö"seren Umfang angenommen, sollten zum Anderen keine neuen Tags erstellt werden um die Übersicht für Autoren und Leser zu bewahren. \\

\begin{figure}[!h]
\centering
\includegraphics[width=1\textwidth]{figures/filtern}
\caption{Prototyp Suche- und Abonnier-Seite}
\hfill
\end{figure}

Im Prototyp findet man die Abonnier-Funktion in der Menüleiste unter \texttt{Suche}. Hier erscheint ein zwei-geteiltes Layout, welches auf der rechten Seite alle bereits abonnierten Tags auflistet und darunter die Eingabe eines neuen Tags ermöglicht. Um den Benutzer alle bereits existierenden Tags offen zu legen, befindet sich auf der linken Seite des Layouts eine \textit{Tag-Cloud} \footnote{ Tag-Cloud ist eine Visualisierung eines Schalgwortverzeichnisses.}
, die diese darstellt (vgl. Abbildung 3.7.).


Im Prototyp findet man die Abonnier-Funktion in der Menüleiste unter Suche. Hier erscheint ein zwei-geteiltes Layout, welches auf der rechten Seite alle bereits abonnierten Tags auflistet und darunter die Eingabe eines neuen Tags ermöglicht. Um den Benutzer alle bereits existierenden Tags offen zu legen, befindet sich auf der linken Seite des Layouts eine \texttt{Tag-Cloud}, die diese darstellt (vgl. Abbildung 3.8.).


Die Eingabe des zu abonnierenden Tags wird durch ein Formular realisiert. Dieses ist in der \texttt{forms.py} Datei konfiguriert und enthält nur ein Eingabefeld. Der Ablauf verläuft gleichartig zum oben dargestellten Erstellen eines Artikels, wird aber hier nochmals beschrieben um die Struktur des \texttt{Taggable Managers} zu verdeutlichen. Die Eingabe des zu abonnierenden Tags wird durch ein Formular realisiert. Dieses ist in der \texttt{forms.py} Datei konfiguriert und enthält nur ein Eingabefeld. Der Ablauf verläuft gleichartig zum oben dargestellten Erstellen eines Artikels, wird aber hier nochmals beschrieben um die Struktur des \texttt{Taggable Managers} zu verdeutlichen.


\hfill \hfill
\end{figure} \end{figure}


Gibt der Benutzer einen Tag ein und sendet durch betätigen des Sichern-Buttons den \texttt{Request}, wird dieser in der \texttt{views.py}, verarbeitet. In Zeile 159 der Abbildung 3.6. wird der eingeloggte Benutzer der Variable \texttt{user\_instance} übergeben. Beim Erstellen der \texttt{Model-Instanz} (vgl. Abbildung 3.6., Zeile 161) wird \texttt{user\_instance} der Unbekannten \texttt{form} zugeteilt um die Tag-Eingabe im richtigen User-Objekt integrieren zu können. Nach der Abfrage der Formvalidität, wird ein neues Objekt angelegt (vgl. Abbildung 3.6., Zeile 163) und ebenfalls dem aktuellen Benutzer zugeordnet. Die Eingabe der \texttt{form} wird in ein \texttt{Array} zwischengespeichert und mit dem Attribut \texttt{cleaned\_data} in ein für Python kompatiblen Datentyp gecastet. Um prüfen zu können, ob die Eingaben der Form tatsächlich im \texttt{Tag-Model} enthalten sind, wird diese nochmals in einen String umgewandelt und mit den bereits existierenden Tags abgeglichen (vgl. Abbildung 3.6., Zeile 168). Wird Bedingung erfüllt, speichert die Funktion die Tags. In beiden möglichen Fällen, wird der Benutzer benachrichtigt ob der Vorgang erfolgreich oder die Eingabe nicht valide ist.
Gibt der Benutzer einen Tag ein und sendet durch betätigen des Sichern-Buttons den \texttt{Request}, wird dieser in der \texttt{views.py}, verarbeitet. In Zeile 159 der Abbildung 3.8. wird der eingeloggte Benutzer der Variable \texttt{user\_instance} übergeben. Beim Erstellen der \texttt{Model-Instanz} (vgl. Abbildung 3.8., Zeile 161) wird \texttt{user\_instance} der Unbekannten \texttt{form} zugeteilt um die Tag-Eingabe im richtigen User-Objekt integrieren zu können. Nach der Abfrage der Formvalidität, wird ein neues Objekt angelegt (vgl. Abbildung 3.8., Zeile 163) und ebenfalls dem aktuellen Benutzer zugeordnet. Die Eingabe der \texttt{form} wird in ein \texttt{Array} zwischengespeichert und mit dem Attribut \texttt{cleaned\_data} in ein für Python kompatiblen Datentyp gecastet. Um prüfen zu können, ob die Eingaben der Form tatsächlich im \texttt{Tag-Model} enthalten sind, wird diese nochmals in einen String umgewandelt und mit den bereits existierenden Tags abgeglichen (vgl. Abbildung 3.8., Zeile 168). Wird die Bedingung erfüllt, speichert die Funktion die Tags. In beiden möglichen Fällen, wird der Benutzer benachrichtigt ob der Vorgang erfolgreich oder die Eingabe nicht valide ist.


Nun werden auf dem Dashboard Artikel der neu hinzugefügten Tags angezeigt (vgl Abbildung 3.7.).
Nun werden auf dem Dashboard Artikel der neu hinzugefügten Tags angezeigt (vgl Abbildung 3.9.).\\


\begin{figure}[!h] \begin{figure}[!h]
\centering \centering


\subsection{Filtern} \subsection{Filtern}


Für eine effiziente Nutzbarkeit des Prototypen ist es wichtig, dass Benutzer intuitiv nach Tags suchen und diese selektieren können. Hierfür werden verschiedene Möglichkeiten zur Verfügung gestellt, die die Usability der Website verbessern.
Für eine effektive Nutzbarkeit des Prototypen ist es wichtig, dass User intuitiv nach Tags suchen und diese selektieren können. Hierfür werden verschiedene Möglichkeiten zur Verfügung gestellt, die die Usability der Website verbessern sollen.

Im persönlichen Newsfeed des Dashboards sind, die zu den Artikeln zugewiesenen Schlagwörter jeweils mit Verlinkungen versehen. Möchte ein Benutzer weitere Artikel zu einem bestimmten Thema lesen, so muss er lediglich auf den entsprechenden Tag klicken und erhält somit eine Liste aller Posts, die diesen enthalten. Hierfür wird keine eigene \texttt{View} benötigt denn das Erstellen von Listen mit unterschiedlichem Inhalt kann ebenso über sich unterscheidende Urls realisiert werden. Im Template \texttt{post\_list} wird beim klicken auf einen Tag der \textit{Slug} \footnote{ Der Slug dient im Taggable-Manager als eindeutig zuweisbarer Identifikator, ähnlich einer ID.}
dessen mitgegeben. Au"serdem wird nun die Url \texttt{post\_list\_by\_tag} aufgerufen, die auf eine neue Seite verweist. Die View \texttt{post\_list} rendert bei Anfragen mit \textit{Slug} die passende Liste, bei Anfragen ohne, werden alle vorhandenen Artikel geladen.


Der Prototyp bieten zudem die Möglichkeit nach Tags direkt zu suchen. Unter dem Menüpunkt \texttt{Suche} ist auf der linken Seite des geteilten Layouts befindet sich, wie bereits beschrieben, eine \textit{Tag-Cloud}. Darunter ist das Suchfeld, welches durch ein Formular im Template realisiert wird. Da dieses jedoch nur Tags aus der Datenbank abfragt und keine Daten verändert wird hier lediglich ein \texttt{GET-Request} gesendet. Mit der Funktion \texttt{filter} und dem von der taggit-Bibliothek zur Verfügung gestellten \textit{Lookup} \footnote{ Lookup ist eine Art Funktion, die das Wo des darauffolgend Feldes ausgibt.}
\texttt{tags\_\_name\_\_in}, können alle Artikel mit dem enthaltenen Tag, dem Template übergeben werden.



Im persönlichen Newsfeed des Dashboards sind, die zu den Artikeln zugewiesenen Schlagwörter jeweils mit Verlinkungen versehen. Möchte ein Benutzer weitere Artikel zu einem bestimmten Thema lesen, so muss er lediglich auf den entsprechenden Tag klicken und erhält somit eine Liste aller Posts, die diesen enthalten. Hierfür wird keine eigene \texttt{View} benötigt denn das Erstellen von Listen mit unterschiedlichem Inhalt kann ebenso über sich unterscheidende Urls realisiert werden. Im Template \texttt{post\_list} wird beim klicken auf einen Tag der \textit{Slug} dessen mitgegeben. Au"serdem wird nun die Url \texttt{post\_list\_by\_tag} aufgerufen, die auf eine neue Seite verweist


\begin{figure}[!h]
\centering
\includegraphics[width=1\textwidth]{figures/filtern}
\caption{Prototyp Suche- und Abonnier-Seite}
\hfill
\end{figure}







BIN
doc/bachelorarbeit_EstherKleinhenz/figures/postedit.png View File


+ 10
- 0
log.txt View File

[18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]> [18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
[18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet []> [18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet []>
[18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]> [18/Nov/2018 18:13:52] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
[18/Nov/2018 20:53:34] INFO [mysite:144] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
[18/Nov/2018 20:53:34] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
[18/Nov/2018 20:53:34] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
[18/Nov/2018 20:53:34] INFO [mysite:147] <QuerySet []>
[18/Nov/2018 20:53:34] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
[18/Nov/2018 21:06:03] INFO [mysite:144] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
[18/Nov/2018 21:06:03] INFO [mysite:147] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
[18/Nov/2018 21:06:03] INFO [mysite:147] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
[18/Nov/2018 21:06:03] INFO [mysite:147] <QuerySet []>
[18/Nov/2018 21:06:03] INFO [mysite:147] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>

Loading…
Cancel
Save