@@ -1,10 +1,18 @@ | |||
{% extends "base.html" %} {% block content %} | |||
{% load taggit_templatetags2_tags %} | |||
{% get_tagcloud as tags for 'application' %} | |||
{% include_tagcloud 'application.Post' %} | |||
<div class="container-fluid"> | |||
<div class="modal-body row"> | |||
<div class="col-md-6"> | |||
<div class="col-md-8"> | |||
<p> Alle Tags im Überblick<br> | |||
</p> | |||
<div class="col-md-5"> | |||
<div style="border:solid; text-align:center;padding:5px;"> | |||
{% get_tagcloud as tags for 'application' %} | |||
{% include_tagcloud 'application.Post' %} | |||
</div> | |||
</div> | |||
<div style="padding-bottom:40px;"> | |||
</div> | |||
Tag-Suche | |||
<div id="custom-search-input"> | |||
<form type="get" action="." style="margin: 0" class="post-form"> | |||
@@ -36,7 +44,22 @@ | |||
</div> | |||
</div> | |||
</div> | |||
<div class="col-md-6"> | |||
<div class="col-md-4"> | |||
<p> Bereits abonnierten Tags | |||
</p> | |||
<div class="col-md-10"> | |||
{% if tags %} | |||
<div style="border:solid; text-align:center;padding:5px;"> | |||
{% for tag in tagsuser %} | |||
{{ tag.name }} | |||
{% if not forloop.last %}, {% endif %} | |||
{% endfor %} | |||
</div> | |||
{% endif %} | |||
</div> | |||
<div style="padding-bottom:40px;"> | |||
</div> | |||
Abonniere deine Tags hier! | |||
<form class="post-form" method="post"> | |||
{% csrf_token %} {{form.as_p}} |
@@ -1,14 +1,14 @@ | |||
{% extends "base.html" %} {% block content %} | |||
{% load taggit_templatetags2_tags %} | |||
{% load taggit_templatetags2_tags %} | |||
<div> | |||
</div> | |||
<div> | |||
<a id="search_submit" href="/posts" class="save btn btn-outline-dark">alle Artikel | |||
</a> | |||
<a id="search_submit" href="/posts" class="save btn btn-outline-dark">alle Artikel | |||
</a> | |||
{% for post in posts %} | |||
{% for post in posts %} | |||
<div class="post"> | |||
<div class="date"> | |||
{{ post.published_date }} | |||
@@ -23,6 +23,6 @@ | |||
{{ post.author }} | |||
</p> | |||
</div> | |||
{% endfor %} | |||
{% endfor %} | |||
</div> | |||
{% endblock %} |
@@ -26,7 +26,6 @@ import operator | |||
def navlogin(request): | |||
log = logging.getLogger('mysite') | |||
logout(request) | |||
error = "" | |||
@@ -157,6 +156,9 @@ def blog_search_list_view(request): | |||
log.info(search_query) | |||
posts = posts.filter(tags__name__in=[search_query]) | |||
log = logging.getLogger('mysite') | |||
u = User.objects.get(username=request.user) | |||
if u: | |||
tagsuser = Tag.objects.filter(customuser__user = u) | |||
user_instance = get_object_or_404(CustomUser, user=request.user) | |||
if request.method == "POST": | |||
log.info('post method') |
@@ -49,6 +49,7 @@ | |||
\@writefile{toc}{\contentsline {chapter}{Referenzen}{26}{chapter*.16}} | |||
\bibcite{Python}{{Fou18e}{}{{}}{{}}} | |||
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}} | |||
\bibcite{Sario}{{Gmb18}{}{{}}{{}}} | |||
\bibcite{Herzog}{{Her16}{}{{}}{{}}} | |||
\bibcite{King}{{Kin17}{}{{}}{{}}} | |||
\bibcite{Leipner}{{Lei13}{}{{}}{{}}} |
@@ -47,7 +47,7 @@ Andreas~Donner Frank-Michael~Schlede, Thomas~Bär. | |||
\bibitem[Fou18a]{Django-4} | |||
Django~Software Foundation. | |||
\newblock Cross site request forgery protection¶. | |||
\newblock Cross site request forgery protection. | |||
\newblock 2018. | |||
\newblock https://docs.djangoproject.com/en/dev/ref/csrf/. | |||
@@ -83,6 +83,12 @@ Alex Gaynor. | |||
\newblock 2010. | |||
\newblock https://django-taggit.readthedocs.io/en/latest/getting\_started. | |||
\bibitem[Gmb18]{Sario} | |||
Sario~Marketing GmbH. | |||
\newblock Tagging. | |||
\newblock 2018. | |||
\newblock https://www.textbroker.de/tagging. | |||
\bibitem[Her16]{Herzog} | |||
Stephan Herzog. | |||
\newblock Model view controller, model view presenter, and model view viewmodel |
@@ -28,6 +28,7 @@ Warning--empty journal in Django-2 | |||
Warning--empty journal in Django-3 | |||
Warning--empty journal in Python | |||
Warning--empty journal in Gaynor | |||
Warning--empty journal in Sario | |||
Warning--empty journal in Herzog | |||
Warning--empty journal in King | |||
Warning--empty journal in Leipner | |||
@@ -41,45 +42,45 @@ Warning--empty journal in Shelest | |||
Warning--empty journal in Solutions | |||
Warning--empty journal in Timm | |||
Warning--empty publisher in Weigend | |||
You've used 26 entries, | |||
You've used 27 entries, | |||
2543 wiz_defined-function locations, | |||
698 strings with 8272 characters, | |||
and the built_in function-call counts, 7085 in all, are: | |||
= -- 699 | |||
> -- 208 | |||
< -- 26 | |||
+ -- 56 | |||
- -- 52 | |||
* -- 342 | |||
:= -- 1240 | |||
add.period$ -- 104 | |||
call.type$ -- 26 | |||
change.case$ -- 129 | |||
chr.to.int$ -- 22 | |||
cite$ -- 52 | |||
duplicate$ -- 366 | |||
empty$ -- 526 | |||
format.name$ -- 102 | |||
if$ -- 1383 | |||
703 strings with 8340 characters, | |||
and the built_in function-call counts, 7356 in all, are: | |||
= -- 726 | |||
> -- 216 | |||
< -- 27 | |||
+ -- 58 | |||
- -- 54 | |||
* -- 355 | |||
:= -- 1287 | |||
add.period$ -- 108 | |||
call.type$ -- 27 | |||
change.case$ -- 134 | |||
chr.to.int$ -- 23 | |||
cite$ -- 54 | |||
duplicate$ -- 380 | |||
empty$ -- 546 | |||
format.name$ -- 106 | |||
if$ -- 1436 | |||
int.to.chr$ -- 5 | |||
int.to.str$ -- 0 | |||
missing$ -- 27 | |||
newline$ -- 159 | |||
num.names$ -- 78 | |||
pop$ -- 157 | |||
missing$ -- 28 | |||
newline$ -- 165 | |||
num.names$ -- 81 | |||
pop$ -- 163 | |||
preamble$ -- 1 | |||
purify$ -- 156 | |||
purify$ -- 162 | |||
quote$ -- 0 | |||
skip$ -- 282 | |||
skip$ -- 293 | |||
stack$ -- 0 | |||
substring$ -- 182 | |||
substring$ -- 189 | |||
swap$ -- 1 | |||
text.length$ -- 26 | |||
text.prefix$ -- 24 | |||
text.length$ -- 27 | |||
text.prefix$ -- 25 | |||
top$ -- 0 | |||
type$ -- 204 | |||
warning$ -- 26 | |||
while$ -- 52 | |||
width$ -- 32 | |||
write$ -- 340 | |||
type$ -- 212 | |||
warning$ -- 27 | |||
while$ -- 54 | |||
width$ -- 33 | |||
write$ -- 353 | |||
(There was 1 error message) |
@@ -2,17 +2,17 @@ | |||
\babel@toc {german}{} | |||
\addvspace {10\p@ } | |||
\addvspace {10\p@ } | |||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP ([She09])\relax }}{6}{figure.caption.5} | |||
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks ([Nev15])\relax }}{7}{figure.caption.6} | |||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{6}{figure.caption.5} | |||
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6} | |||
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7} | |||
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees ([Orc10])\relax }}{9}{figure.caption.8} | |||
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8} | |||
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9} | |||
\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10} | |||
\addvspace {10\p@ } | |||
\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{15}{figure.caption.11} | |||
\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12} | |||
\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von User und Post\relax }}{18}{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.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{22}{figure.caption.15} | |||
\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15} | |||
\addvspace {10\p@ } | |||
\addvspace {10\p@ } |
@@ -1,4 +1,4 @@ | |||
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 15 NOV 2018 11:06 | |||
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 17 NOV 2018 14:41 | |||
entering extended mode | |||
\write18 enabled. | |||
file:line:error style messages enabled. | |||
@@ -1137,17 +1137,17 @@ Package babel Info: Redefining german shorthand "~ | |||
] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 29. | |||
[3 | |||
@@ -1182,7 +1182,11 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 53. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 53. | |||
(/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof) | |||
(/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof | |||
LaTeX Font Info: Try loading font information for T1+aett on input line 14. | |||
(/usr/local/texlive/2018/texmf-dist/tex/latex/ae/t1aett.fd | |||
File: t1aett.fd 1997/11/16 Font definitions for T1/aett. | |||
)) | |||
\tf@lof=\write7 | |||
\openout7 = `bachelorabeit_EstherKleinhenz.lof'. | |||
@@ -1215,24 +1219,24 @@ Package babel Info: Redefining german shorthand "| | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 7. | |||
(babel) in language on input line 9. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 7. | |||
(babel) in language on input line 9. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 7. | |||
(babel) in language on input line 9. | |||
Missing character: There is no ̈ in font aer12! | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 9. | |||
(babel) in language on input line 11. | |||
[2 | |||
@@ -1240,13 +1244,17 @@ Package babel Info: Redefining german shorthand "~ | |||
] | |||
Missing character: There is no ̈ in font aer12! | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 18. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 18. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 18. | |||
Missing character: There is no ̈ in font aer12! | |||
) | |||
Overfull \hbox (12.19063pt too wide) in paragraph at lines 21--58 | |||
[]\T1/aer/m/n/12 Der Schwer-punkt die-ser Ar-beit liegt auf der pro-to-ty-pi-schen Um-set-zung der Website- | |||
[] | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1533,14 +1541,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 135. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 135. | |||
[12] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 138. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 138. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 138. | |||
) | |||
[12]) | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1631,7 +1632,27 @@ Package babel Info: Redefining german shorthand "| | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 31. | |||
Underfull \hbox (badness 10000) in paragraph at lines 34--45 | |||
Underfull \hbox (badness 10000) in paragraph at lines 34--36 | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 37--40 | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 41--43 | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 44--47 | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 48--49 | |||
[] | |||
@@ -1642,36 +1663,25 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 52. | |||
(babel) in language on input line 55. | |||
[16] | |||
File: figures/custommodelcode.png Graphic file (type bmp) | |||
<figures/custommodelcode.png> | |||
Underfull \hbox (badness 10000) in paragraph at lines 72--74 | |||
Underfull \hbox (badness 10000) in paragraph at lines 76--78 | |||
[] | |||
File: figures/datamodel.png Graphic file (type bmp) | |||
<figures/datamodel.png> | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 90. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 90. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 90. | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1679,18 +1689,41 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 83. | |||
[17] | |||
File: figures/datamodel.png Graphic file (type bmp) | |||
<figures/datamodel.png> | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 94. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 94. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 94. | |||
Overfull \hbox (21.96033pt too wide) in paragraph at lines 97--98 | |||
[]\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 | |||
(babel) in language on input line 100. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 100. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 100. | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1698,28 +1731,18 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 92. | |||
(babel) in language on input line 109. | |||
[18] | |||
Overfull \hbox (9.91238pt too wide) in paragraph at lines 93--94 | |||
[]\T1/aer/m/n/12 Ein Django-Projekt bil-det be-reits beim Ein-rich-ten, \T1/aer/m/it/12 per De-fault\T1/aer/m/n/12 , ei-ne Administrator- | |||
[] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 96. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 96. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 96. | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1727,34 +1750,39 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 109. | |||
[19] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 111. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 111. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 107. | |||
(babel) in language on input line 111. | |||
Underfull \hbox (badness 10000) in paragraph at lines 112--113 | |||
[] | |||
File: figures/userstories.png Graphic file (type bmp) | |||
<figures/userstories.png> | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 117. | |||
(babel) in language on input line 121. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 117. | |||
(babel) in language on input line 121. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 117. | |||
(babel) in language on input line 121. | |||
Underfull \hbox (badness 10000) in paragraph at lines 118--122 | |||
Underfull \hbox (badness 10000) in paragraph at lines 122--126 | |||
[] | |||
@@ -1765,24 +1793,24 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 127. | |||
(babel) in language on input line 126. | |||
[20] | |||
Underfull \hbox (badness 10000) in paragraph at lines 128--132 | |||
Underfull \hbox (badness 10000) in paragraph at lines 132--136 | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 133--137 | |||
Underfull \hbox (badness 10000) in paragraph at lines 137--141 | |||
[] | |||
@@ -1793,44 +1821,33 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 139. | |||
(babel) in language on input line 141. | |||
[21] | |||
Underfull \hbox (badness 10000) in paragraph at lines 144--145 | |||
[] | |||
File: figures/post-edit-view.png Graphic file (type bmp) | |||
<figures/post-edit-view.png> | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 149. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 149. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 149. | |||
Overfull \hbox (1.12642pt too wide) in paragraph at lines 150--151 | |||
\T1/aer/m/n/12 Tags als ein-ge-logg-ter User abon-nie-ren und ver-wal-ten Front-end und Admin-Backend? | |||
[] | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 152. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 152. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 152. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 155. | |||
(babel) in language on input line 153. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 155. | |||
(babel) in language on input line 153. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 155. | |||
) | |||
(babel) in language on input line 153. | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -1838,18 +1855,31 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 60. | |||
(babel) in language on input line 158. | |||
[22] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 166. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 166. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 166. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 169. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 169. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 169. | |||
) | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
@@ -2012,7 +2042,12 @@ Package babel Info: Redefining german shorthand "~ | |||
] | |||
Missing character: There is no ’ in font aer12! | |||
Underfull \hbox (badness 2717) in paragraph at lines 95--100 | |||
Underfull \hbox (badness 10000) in paragraph at lines 87--91 | |||
[]\T1/aer/m/n/12 Sario Mar-ke-ting GmbH. Tag-ging. 2018. | |||
[] | |||
Underfull \hbox (badness 2717) in paragraph at lines 101--106 | |||
[]\T1/aer/m/n/12 Adam King. Djan-go midd-le-wa-res and the re-quest/-re-spon-se cy- | |||
[] | |||
@@ -2021,74 +2056,74 @@ Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ’ in font aer12! | |||
Underfull \hbox (badness 10000) in paragraph at lines 116--122 | |||
Underfull \hbox (badness 10000) in paragraph at lines 122--128 | |||
\T1/aer/m/n/12 medium-com-nnennandukwe-python-is-the-back-end-programming- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 124--128 | |||
Underfull \hbox (badness 10000) in paragraph at lines 130--134 | |||
[]\T1/aer/m/n/12 Selwin Ong. django-post_office git re-po-si-to-ry. 2018. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 130--135 | |||
Underfull \hbox (badness 10000) in paragraph at lines 136--141 | |||
[]\T1/aer/m/n/12 Mark Ot-to. Boot-strap from twit-ter. 2011. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 130--135 | |||
Underfull \hbox (badness 10000) in paragraph at lines 136--141 | |||
\T1/aer/m/n/12 https://blog.twitter.com/developer/en_us/a/2011/bootstrap- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 137--142 | |||
Underfull \hbox (badness 10000) in paragraph at lines 143--148 | |||
[]\T1/aer/m/n/12 Mark Ot-to. Say hel-lo to boot-strap 2.0. 2012. | |||
[] | |||
Overfull \hbox (38.1438pt too wide) in paragraph at lines 137--142 | |||
Overfull \hbox (38.1438pt too wide) in paragraph at lines 143--148 | |||
\T1/aer/m/n/12 https://web.archive.org/web/20120203191214/https://dev.twitter.com/blog/say- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 144--148 | |||
Underfull \hbox (badness 10000) in paragraph at lines 150--154 | |||
[]\T1/aer/m/n/12 Shabda. Un-der-stan-ding de-co-ra-tors. 2009. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 150--156 | |||
[]\T1/aer/m/n/12 Alexy She-lest. Mo-del view con-trol-ler, mo-del view pre- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 150--156 | |||
\T1/aer/m/n/12 sen-ter, and mo-del view view-mo-del de-sign pat-terns. 2009. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 150--156 | |||
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller- | |||
[] | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 14.49998pt. | |||
We now make it that large for the rest of the document. | |||
This may cause the page layout to be inconsistent, however. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 156. | |||
(babel) in language on input line 154. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 156. | |||
(babel) in language on input line 154. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 156. | |||
(babel) in language on input line 154. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 156. | |||
(babel) in language on input line 154. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 156. | |||
(babel) in language on input line 154. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 156. | |||
[27]) | |||
(babel) in language on input line 154. | |||
[27] | |||
Underfull \hbox (badness 10000) in paragraph at lines 156--162 | |||
[]\T1/aer/m/n/12 Alexy She-lest. Mo-del view con-trol-ler, mo-del view pre- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 156--162 | |||
\T1/aer/m/n/12 sen-ter, and mo-del view view-mo-del de-sign pat-terns. 2009. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 156--162 | |||
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller- | |||
[] | |||
) | |||
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 78. | |||
@@ -2124,12 +2159,12 @@ Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 78. | |||
) | |||
(\end occurred when \ifnum on line 5 was incomplete) | |||
Here is how much of TeX's memory you used: | |||
27345 strings out of 492970 | |||
489625 string characters out of 6133939 | |||
562182 words of memory out of 5000000 | |||
30926 multiletter control sequences out of 15000+600000 | |||
555998 words of font info for 62 fonts, out of 8000000 for 9000 | |||
27372 strings out of 492970 | |||
490077 string characters out of 6133939 | |||
563138 words of memory out of 5000000 | |||
30949 multiletter control sequences out of 15000+600000 | |||
556319 words of font info for 63 fonts, out of 8000000 for 9000 | |||
1348 hyphenation exceptions out of 8191 | |||
58i,18n,50p,10437b,966s stack positions out of 5000i,500n,10000p,200000b,80000s | |||
58i,18n,50p,10437b,960s stack positions out of 5000i,500n,10000p,200000b,80000s | |||
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (33 pages). |
@@ -5,7 +5,7 @@ | |||
\BOOKMARK [1][-]{section.1.2}{Ziel\040der\040Arbeit}{chapter.1}% 5 | |||
\BOOKMARK [0][-]{chapter.2}{Framework}{}% 6 | |||
\BOOKMARK [1][-]{section.2.1}{Django}{chapter.2}% 7 | |||
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten\040Django's}{section.2.1}% 8 | |||
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten\040Djangos}{section.2.1}% 8 | |||
\BOOKMARK [2][-]{subsection.2.1.2}{Virtuelle\040Umgebung}{section.2.1}% 9 | |||
\BOOKMARK [2][-]{subsection.2.1.3}{Lightweight\040Directory\040Access\040Protocol}{section.2.1}% 10 | |||
\BOOKMARK [2][-]{subsection.2.1.4}{Sicherheit}{section.2.1}% 11 | |||
@@ -13,19 +13,18 @@ | |||
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 13 | |||
\BOOKMARK [2][-]{subsection.2.2.2}{Hilfsbibliotheken}{section.2.2}% 14 | |||
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 15 | |||
\BOOKMARK [1][-]{section.2.4}{Cron}{chapter.2}% 16 | |||
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 17 | |||
\BOOKMARK [1][-]{section.3.1}{Forschungsdesign}{chapter.3}% 18 | |||
\BOOKMARK [1][-]{section.3.2}{Organisation}{chapter.3}% 19 | |||
\BOOKMARK [2][-]{subsection.3.2.1}{Datenmodellierung}{section.3.2}% 20 | |||
\BOOKMARK [2][-]{subsection.3.2.2}{Verwaltung\040im\040Administrator-Back-end}{section.3.2}% 21 | |||
\BOOKMARK [2][-]{subsection.3.2.3}{Berechtigung\040der\040User}{section.3.2}% 22 | |||
\BOOKMARK [1][-]{section.3.3}{Funktionen}{chapter.3}% 23 | |||
\BOOKMARK [2][-]{subsection.3.3.1}{Verwalten}{section.3.3}% 24 | |||
\BOOKMARK [2][-]{subsection.3.3.2}{Abonnieren}{section.3.3}% 25 | |||
\BOOKMARK [2][-]{subsection.3.3.3}{Filtern}{section.3.3}% 26 | |||
\BOOKMARK [2][-]{subsection.3.3.4}{Benachrichtigung}{section.3.3}% 27 | |||
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 28 | |||
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 29 | |||
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 30 | |||
\BOOKMARK [0][-]{chapter*.16}{Referenzen}{}% 31 | |||
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 16 | |||
\BOOKMARK [1][-]{section.3.1}{Forschungsdesign}{chapter.3}% 17 | |||
\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.2}{Verwaltung\040im\040Administrator-Back-end}{section.3.2}% 20 | |||
\BOOKMARK [2][-]{subsection.3.2.3}{Berechtigung\040der\040User}{section.3.2}% 21 | |||
\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.2}{Abonnieren}{section.3.3}% 24 | |||
\BOOKMARK [2][-]{subsection.3.3.3}{Filtern}{section.3.3}% 25 | |||
\BOOKMARK [2][-]{subsection.3.3.4}{Benachrichtigung}{section.3.3}% 26 | |||
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 27 | |||
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 28 | |||
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 29 | |||
\BOOKMARK [0][-]{chapter*.16}{Referenzen}{}% 30 |
@@ -7,7 +7,7 @@ | |||
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{3}{section.1.2} | |||
\contentsline {chapter}{\numberline {2}Framework}{5}{chapter.2} | |||
\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1} | |||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Django's}{7}{subsection.2.1.1} | |||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1} | |||
\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2} | |||
\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3} | |||
\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4} | |||
@@ -15,17 +15,16 @@ | |||
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1} | |||
\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{11}{subsection.2.2.2} | |||
\contentsline {section}{\numberline {2.3}Bootstrap}{12}{section.2.3} | |||
\contentsline {section}{\numberline {2.4}Cron}{13}{section.2.4} | |||
\contentsline {chapter}{\numberline {3}Prototyp}{14}{chapter.3} | |||
\contentsline {section}{\numberline {3.1}Forschungsdesign}{14}{section.3.1} | |||
\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.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2} | |||
\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{19}{subsection.3.2.3} | |||
\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{18}{subsection.3.2.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.2}Abonnieren}{22}{subsection.3.3.2} | |||
\contentsline {subsection}{\numberline {3.3.3}Filtern}{22}{subsection.3.3.3} | |||
\contentsline {subsection}{\numberline {3.3.3}Filtern}{23}{subsection.3.3.3} | |||
\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{23}{subsection.3.3.4} | |||
\contentsline {chapter}{\numberline {4}Ergebnis}{24}{chapter.4} | |||
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{24}{subsection.4.0.1} |
@@ -29,7 +29,7 @@ | |||
\setcounter{Item}{0} | |||
\setcounter{Hfootnote}{0} | |||
\setcounter{Hy@AnnotLevel}{0} | |||
\setcounter{bookmark@seq@number}{29} | |||
\setcounter{bookmark@seq@number}{28} | |||
\setcounter{NAT@ctr}{0} | |||
\setcounter{lstlisting}{0} | |||
\setcounter{section@level}{0} |
@@ -34,7 +34,7 @@ | |||
\setcounter{Item}{0} | |||
\setcounter{Hfootnote}{0} | |||
\setcounter{Hy@AnnotLevel}{0} | |||
\setcounter{bookmark@seq@number}{29} | |||
\setcounter{bookmark@seq@number}{28} | |||
\setcounter{NAT@ctr}{0} | |||
\setcounter{lstlisting}{0} | |||
\setcounter{section@level}{0} |
@@ -33,7 +33,7 @@ | |||
\setcounter{Item}{0} | |||
\setcounter{Hfootnote}{0} | |||
\setcounter{Hy@AnnotLevel}{0} | |||
\setcounter{bookmark@seq@number}{30} | |||
\setcounter{bookmark@seq@number}{29} | |||
\setcounter{NAT@ctr}{0} | |||
\setcounter{lstlisting}{0} | |||
\setcounter{section@level}{0} |
@@ -5,13 +5,13 @@ | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\newlabel{ch:framework}{{2}{5}{Framework}{chapter.2}{}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP ([She09])\relax }}{6}{figure.caption.5}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks ([Nev15])\relax }}{7}{figure.caption.6}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Django's}{7}{subsection.2.1.1}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{6}{figure.caption.5}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees ([Orc10])\relax }}{9}{figure.caption.8}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{10}{section.2.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}} | |||
@@ -19,7 +19,6 @@ | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{12}{section.2.3}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.4}Cron}{13}{section.2.4}} | |||
\@setckpt{chapters/framework}{ | |||
\setcounter{page}{14} | |||
\setcounter{equation}{0} | |||
@@ -31,7 +30,7 @@ | |||
\setcounter{mpfootnote}{0} | |||
\setcounter{part}{0} | |||
\setcounter{chapter}{2} | |||
\setcounter{section}{4} | |||
\setcounter{section}{3} | |||
\setcounter{subsection}{0} | |||
\setcounter{subsubsection}{0} | |||
\setcounter{paragraph}{0} | |||
@@ -49,7 +48,7 @@ | |||
\setcounter{Item}{0} | |||
\setcounter{Hfootnote}{0} | |||
\setcounter{Hy@AnnotLevel}{0} | |||
\setcounter{bookmark@seq@number}{16} | |||
\setcounter{bookmark@seq@number}{15} | |||
\setcounter{NAT@ctr}{0} | |||
\setcounter{lstlisting}{0} | |||
\setcounter{section@level}{0} |
@@ -9,15 +9,15 @@ | |||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Organisation}{15}{section.3.2}} | |||
\@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.3}{\ignorespaces Datenmodellierung von User und Post\relax }}{18}{figure.caption.13}} | |||
\@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}{19}{subsection.3.2.3}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Berechtigung 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{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{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{22}{figure.caption.15}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{22}{subsection.3.3.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{22}{subsection.3.3.3}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{23}{subsection.3.3.3}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{23}{subsection.3.3.4}} | |||
\@setckpt{chapters/prototyp}{ | |||
\setcounter{page}{24} | |||
@@ -48,7 +48,7 @@ | |||
\setcounter{Item}{0} | |||
\setcounter{Hfootnote}{0} | |||
\setcounter{Hy@AnnotLevel}{0} | |||
\setcounter{bookmark@seq@number}{27} | |||
\setcounter{bookmark@seq@number}{26} | |||
\setcounter{NAT@ctr}{0} | |||
\setcounter{lstlisting}{0} | |||
\setcounter{section@level}{0} |
@@ -1,5 +1,7 @@ | |||
\chapter{Einleitung} | |||
In der Vergangenheit hat sich gezeigt, dass das Versenden von Informationen über elektronische Post nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich, sich vernünftig mit den Informationen zu befassen"(vgl. [Ver13]). Nicht nur am Arbeitsplatz, sondern auch an Hochschulen wird Gebrauch davon gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Hierdurch steigen die irrelevanten Informationen unkontrollierbar schnell an. Infolgedessen, nimmt der benötigte Speicheraufwand der zahlreichen kommerziellen, aber auch internen E-Mail-Dienste enorm zu (vgl. [Fio14]). Das Dezimieren dieses Kommunikationswegs ist jedoch in vielen Fällen nicht möglich und Beschränkungen jeglicher Art werden als nicht sinnvoll erachtet. | |||
Das elektronische Übertragen von Nachrichten ist aus der heutigen Zeit nicht mehr wegzudenken. | |||
In der Vergangenheit hat sich jedoch gezeigt, dass das Versenden von Informationen nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich, sich vernünftig mit den Informationen zu befassen"(vgl. [Ver13]). Nicht nur am Arbeitsplatz, sondern auch an Hochschulen wird Gebrauch davon gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Hierdurch steigen die irrelevanten Informationen unkontrollierbar schnell an. Infolgedessen, nimmt der benötigte Speicheraufwand der zahlreichen kommerziellen, aber auch internen E-Mail-Dienste enorm zu (vgl. [Fio14]). | |||
Das Dezimieren dieses Kommunikationswegs ist jedoch in vielen Fällen nicht möglich und Beschränkungen jeglicher Art werden als nicht sinnvoll erachtet. | |||
Betrachtet man darüber hinaus den Lebenszyklus einer einzelnen E-Mail, wird deutlich, dass dieser nach dem Erstellen, Senden und Empfangen noch nicht abgeschlossen ist. Nachdem die Information vom Adressat geöffnet wurde, wird sie archiviert, muss aber jederzeit durch eine Suchabfrage sofort angezeigt werden können. Dies verdeutlicht den enormen Aufwand, das das Verwalten elektronischer Post mit sich bringt. Aufbauend auf dieser Problematik wird folgend die Ausgangssituation der Arbeit erläutert. | |||
@@ -1,15 +1,15 @@ | |||
\chapter{Framework} | |||
\label{ch:framework} | |||
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website(vgl. [Ndu17]). Durch den modularen Aufbau ist es selbst für unerfahrene Entwickler möglich die Sprache schnell zu erlernen. Darüber hinaus bringt Python verschiedene Web-Service Tools mit sich, die beim implementieren einer Website viel Zeit sparen und das Aneignen von komplexen Protokollen redundant machen (vgl. [Sol17]). | |||
Das dazugehörige Framework Django reduziert den Entwicklungsaufwand eines Prototypen erheblich und ist daher als zielführendes Framework die beste Wahl | |||
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website (vgl. [Ndu17]). Durch den modularen Aufbau ist es selbst für unerfahrene Entwickler möglich die Sprache schnell zu erlernen. Darüber hinaus bringt Python verschiedene Web-Service Tools mit sich, die beim implementieren einer Website viel Zeit sparen und das Aneignen von komplexen Protokollen redundant machen (vgl. [Sol17]). | |||
Das dazugehörige Framework Django reduziert den Entwicklungsaufwand eines Prototypen erheblich und ist daher als zielführendes Framework die beste Wahl. | |||
\section{Django} | |||
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse vgl. [She09]. Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert. | |||
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse (vgl. [She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert. | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=0.6\textwidth]{figures/MVP} | |||
\caption{Vereinfachter MVP ([She09])} | |||
\caption{Vereinfachter MVP [She09]} | |||
\hfill | |||
\end{figure} | |||
@@ -28,7 +28,7 @@ Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen \textit | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=0.5\textwidth]{figures/request-response-cycle} | |||
\caption{Request-Response-Kreislauf des Django Frameworks ([Nev15])} | |||
\caption{Request-Response-Kreislauf des Django Frameworks [Nev15]} | |||
\hfill | |||
\end{figure} | |||
@@ -71,7 +71,7 @@ Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hie | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=0.5\textwidth]{figures/ldap-tree} | |||
\caption{Beispiel eines LDAP-Trees ([Orc10])} | |||
\caption{Beispiel eines LDAP-Trees [Orc10]} | |||
\hfill | |||
\end{figure} | |||
@@ -90,12 +90,12 @@ Die im Folgenden aufgeführten Bibliotheken sind im Prototyp zur Anwendung gelan | |||
\subsection {Taggable-Manager} | |||
Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. Der darin enthaltene Taggable Manager verwendet Django's Contenttype Framework, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder app\_label und model machen die Modelle eindeutig zuweisbar. Instanzen des Contenttypes präsentieren und speichern die Informationen und Erstellen automatisch neue Instanzen, wenn Modelle hinzugefügt werden. Zudem stehen Methoden zur Verfügung, die das Abrufen und Arbeiten mit Instanzen der einzelnen Modelle erleichtern. | |||
Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden ([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ßerdem 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([Gay10]): | |||
Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile eingefügt (vgl. [Gay10]): | |||
\\ | |||
\noindent\hspace*{10mm}% | |||
\$ pip install django-taggit | |||
{\tt \$ pip install django-taggit } | |||
\\ | |||
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. | |||
@@ -105,9 +105,9 @@ Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank int | |||
---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. | |||
Django-hitcount dient zum zählen der Besucher einer Seite ([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 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. | |||
Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich django-post-office ([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 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} | |||
@@ -133,7 +133,3 @@ Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles berei | |||
Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben muss eine eigens verfasste CSS-Datei nach der Verlinkung von Bootstrap in die Website eingebunden werden. Der Parser liest die Datei von oben nach unten, Links nach Rechts. Liest dieser also zu erst die Bootstrap Bibliothek und speichert diese, so überschreiben die Styles die danach kommen, die bereits gelesenen Eingaben. Die Styles, die inline auf ein Tag angewendet werden sind somit die bestimmenden Eigenschaften. Natürlich sollten Stildefinitionen niemals inline eingepflegt werden, da dies zu einem sehr unübersichtlichen und wartungsintensiven Code führen. | |||
\section{Cron} | |||
@@ -15,7 +15,7 @@ Zu Beginn der Arbeit wird, des sich aus der Forschungsfrage ergebenden Problems | |||
\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 \textit{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 üppigen Extension-Bibliothek kostenlose Erweiterungen eingebunden. Unter Anderem sind die folgenden Add-on's während der Arbeit zum Einsatz gekommen (vgl. [Mic18]): | |||
\begin{itemize} | |||
\item Python von Microsoft (Linting und Debugging) | |||
@@ -23,36 +23,40 @@ Zum Entwickeln des Prototypen wird die Open-Source- Entwicklungsumgebung Visual | |||
\item Python Extension Pack (Django Code-Vervollständigung) | |||
\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 \textit {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 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. | |||
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 \glqq mysite\grqq\ 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 \_\_init\_\_.py und wsgi.py sind trivial und deshalb wird hier nicht weiter darauf eingegangen. Im Ordner \glqq thisisenv\grqq\ sind alle Bibliotheken und Add-on's der virtuellen Umgebung hinterlegt. Der Fokus dieser Arbeit liegt im Ordner \glqq application\grqq. 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 \glqq Funktionen\grqq\ 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 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. | |||
\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 \textit{UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \textit{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 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. | |||
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 diese integriert werden müssen (vgl. [Dja18]). Mit der folgenden Eingabe | |||
\\ | |||
\begin{addmargin}[0pt]{0pt} | |||
\noindent\hspace*{10mm}% | |||
\$ python3 manage.py makemigrations | |||
\texttt{ \$ python3 manage.py makemigrations} | |||
\\ | |||
\end{addmargin} | |||
werden die neun Tabellen der Modelle erstellt. Um diese dann auch anwenden zu können, muss der Befehl | |||
\\ | |||
\begin{addmargin}[0pt]{0pt} | |||
\noindent\hspace*{10mm}% | |||
\$ python3 manage.py migrate | |||
\texttt{ \$ python3 manage.py migrate} | |||
\\ | |||
\end{addmargin} | |||
darauffolgend ebenso in die Kommandozeile eingegeben werden.\\ | |||
\textbf{UserModel:} | |||
\begin{addmargin}[25pt]{0pt} | |||
Hierbei ist das Authentifizierungssystem von Django mit einem \textit{UserModel} bereits angelegt. Dies muss für den Prototyp um das Feld \glqq tags \grqq\ erweitert werden, sodass ein Benutzer folgende Felder aufweist (vgl. [Fou18a]): | |||
Hierbei ist das Authentifizierungssystem von Django mit einem \texttt{UserModel} bereits angelegt. Dies muss für den Prototyp um das Feld \texttt{tags} erweitert werden, sodass ein Benutzer folgende Felder aufweist (vgl. [Fou18a]): | |||
\begin{itemize} | |||
\item username, fist\_name, last\_name, email, groups, user\_permissions, is\_staff, is\_active, is\_superuser, last\_login, date\_joined, tags | |||
\end{itemize} | |||
Das Feld \textit{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 \textit{CustomUser} dafür verantwortlich das neue Feld mit dem \textit{Default-User} zu verknüpfen. Durch das \textit{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \textit{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 \textit{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 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. \\ | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=1\textwidth]{figures/custommodelcode} | |||
@@ -65,11 +69,11 @@ In models.py ist der \textit{CustomUser} dafür verantwortlich das neue Feld mit | |||
\textbf{PostModel:} | |||
\begin{addmargin}[25pt]{0pt} | |||
Das \textit{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 Post enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com gehören dazu folgende: | |||
\begin{itemize} | |||
\item author, title, text, created\_date, published\_date, tags | |||
\end{itemize} | |||
Der Autor ist durch einen \textit{ForeignKey} mit dem \textit{UserModel} verbunden. Diese sogenannte \textit{ManyToOne} Verbindung reicht hier aus um einem Post den Autor, also dem eingeloggten User, zuzuweisen. Title ist ein \textit{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wir deshalb als \textit{TextField} deklariert. Erstellungsdatum und Publikation sind beides \textit{DateTimeField}s. Ersteres muss vom Ersteller angegeben werden, Zweiteres kann zunächst offen gelassen werden durch die Zusatzangabe \glqq null=True\grqq. 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 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. | |||
\\ | |||
\end{addmargin} | |||
@@ -77,20 +81,20 @@ Der Autor ist durch einen \textit{ForeignKey} mit dem \textit{UserModel} verbund | |||
\textbf{Gesamtmodellierung:} | |||
\begin{addmargin}[25pt]{0pt} | |||
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \glqq User\grqq\ und \glqq Post\grqq. 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 booleschen Felder werden im Kapitel Berechtigung der User genauer erörtert. | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=0.9\textwidth]{figures/datamodel} | |||
\caption{Datenmodellierung von User und Post} | |||
\caption{Datenmodellierung von \texttt{User} und \texttt{Post}} | |||
\hfill | |||
\end{figure} | |||
\end{addmargin} | |||
\subsection{Verwaltung im Administrator-Back-end} | |||
In diesem Kapitel wird beschrieben wie das Administrations-back-end genutzt werden kann. Es ist jedoch zu beachten, dass die Applikation vorwiegend von Dozenten und Angestellten der Hochschule ohne Administratorrechte verwendet werden soll. Die gestaffelten Berechtigungen werden im Kapitel \glqq Berechtigung der User \grqq\ genauer beschreiben. | |||
In diesem Kapitel wird beschrieben wie das Administrations-back-end genutzt werden kann. Es ist jedoch zu beachten, dass die Applikation vorwiegend von Dozenten und Angestellten der Hochschule ohne Administratorrechte verwendet werden soll. Die gestaffelten Berechtigungen werden im Kapitel Berechtigung der User genauer beschreiben. | |||
Ein Django-Projekt bildet bereits beim Einrichten, \textit{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. | |||
\subsection{Berechtigung der User} | |||
@@ -100,12 +104,12 @@ Das gestaffeltes Berechtigungsmanagement ist im Prototyp notwendig um den Umgang | |||
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 \glqq User Permissions\grqq\ 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 \glqq taggit \textbar Tag \textbar can delete Tag\grqq\ und schiebt es von der Auswahl zu den Berechtigungen. | |||
Durch das Setzen des booleschen Wert \glqq is\_staff\grqq\ auf \glqq True\grqq\ 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. 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. | |||
\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 relevant sind. \\ | |||
\begin{figure}[!h] | |||
\centering | |||
@@ -120,24 +124,24 @@ Das Verwalten der Artikel soll von berechtigten Nutzern im Front-end stattfinden | |||
\\ | |||
Einen neuen Artikel erstellen: | |||
Das \glqq +\grqq\ 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 \glqq Tags \grqq\ 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 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. | |||
Speichert der Benutzer nun den Artikel, so werden im Back-end die Daten wir folgt verarbeitet. In der View \glqq post\_new \grqq\ 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 \textit{Keywort} \glqq commit=false \grqq\ 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 \textit{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 \textit{PostModel} die \textit{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 \glqq form.save\_m2m() \grqq\ aufrufen zu können. Dieser Befehl zwingt die Daten der \textit{ManyToMany} Relation zu speichern. | |||
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. | |||
Die eindeutige Zuordnung der Eingabe im Front-end zur Verarbeitung der Artikel im Back-end ist mit einem \textit{Primary Key} realisiert. Das \textit{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 \textit{AutoField} im Feld \glqq Id \grqq\ und zählt bei jedem neu Erstellen eines Objekts hoch. Somit sind alle Objekte eindeutig zuordenbar und können mit dem Kommando \glqq post.pk \grqq\ 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. 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. | |||
\\ | |||
\\ | |||
Einen bereits vorhandenen Artikel löschen: | |||
In der Detailansicht eines Artikels ist es möglich diesen durch klicken auf den Button \glqq Löschen \grqq\ zu entfernen. Die View \glqq post\_remove \grqq\ selektiert über den im Template mitgegebenen \textit{Primary Key} das Objekt und speichert dies in der Variable \glqq post\grqq\. 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 (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 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. | |||
\\ | |||
\\ | |||
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 \textit{Primary Key} der Artikel einer Variable \glqq post\grqq\ 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 \textit{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. 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). | |||
Betätigt der Benutzer den \glqq Speichern-Button\grqq\ 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. \textit{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 \textit{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. | |||
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.\\ | |||
\begin{figure}[!h] | |||
\centering | |||
@@ -147,9 +151,17 @@ Betätigt der Benutzer den \glqq Speichern-Button\grqq\ im Front-end wird die be | |||
\end{figure} | |||
\subsection{Abonnieren} | |||
--- Tags als eingeloggter User abonnieren und verwalten Front-end und Admin-Backend? | |||
Die Startseite des Prototypen soll individualisierbar sein und nur vom eingeloggten Benutzer selbst abonnierte Informationen anzeigen. Sortiert nach Datum werden dann alle Artikel untereinander visualisiert. | |||
Das Abonnieren bestimmter Themengebiete ist eines der wichtigsten Funktionen im Prototyp. | |||
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 Artikel 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. | |||
Im Prototyp findet man die Abonnier-Funktion in der Menüleiste unter Suche. Hier erscheint ein zwei-geteiltes Layout, welches auf der rechten Seite in einer \texttt{Tag-Cloud} alle bereits abonnierten Tags anzeigt 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 weitere \texttt{Tag-Cloud}, die diese darstellt. | |||
Die Eingabe des zu abonnierenden Tags wird durch ein Formular realisiert. | |||
\subsection{Filtern} | |||
Tag-cloud? Filtern nach abonnierten Posts, alle Posts und Posts mit bestimmten Tags |
@@ -182,7 +182,15 @@ | |||
@article{Django-4, | |||
author = "Django Software Foundation", | |||
title = "Cross Site Request Forgery protection¶", | |||
title = "Cross Site Request Forgery protection", | |||
year = "2018", | |||
note = "https://docs.djangoproject.com/en/dev/ref/csrf/" | |||
} | |||
@article{Sario, | |||
author = "Sario Marketing GmbH", | |||
title = "Tagging", | |||
year = "2018", | |||
note = "https://www.textbroker.de/tagging" | |||
} | |||
@@ -16,3 +16,125 @@ | |||
[15/Nov/2018 11:31:11] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]> | |||
[15/Nov/2018 11:48:01] INFO [mysite:157] None | |||
[15/Nov/2018 11:48:29] INFO [mysite:157] hi | |||
[15/Nov/2018 17:44:00] INFO [mysite:157] hi | |||
[15/Nov/2018 17:45:30] INFO [mysite:157] hi | |||
[15/Nov/2018 17:46:41] INFO [mysite:157] hi | |||
[15/Nov/2018 17:46:57] INFO [mysite:157] hi | |||
[15/Nov/2018 17:47:53] INFO [mysite:157] hi | |||
[15/Nov/2018 17:48:27] INFO [mysite:157] hi | |||
[15/Nov/2018 17:49:18] INFO [mysite:157] hi | |||
[15/Nov/2018 17:49:51] INFO [mysite:157] hi | |||
[15/Nov/2018 17:51:05] INFO [mysite:157] hi | |||
[15/Nov/2018 18:33:51] INFO [mysite:157] hi | |||
[15/Nov/2018 18:34:10] INFO [mysite:157] hi | |||
[15/Nov/2018 18:34:36] INFO [mysite:157] hi | |||
[15/Nov/2018 18:35:08] INFO [mysite:157] hi | |||
[15/Nov/2018 18:35:33] INFO [mysite:157] hi | |||
[15/Nov/2018 18:35:40] INFO [mysite:157] hi | |||
[15/Nov/2018 18:36:04] INFO [mysite:157] hi | |||
[15/Nov/2018 18:36:37] INFO [mysite:157] hi | |||
[15/Nov/2018 18:37:59] INFO [mysite:157] hi | |||
[15/Nov/2018 18:38:04] INFO [mysite:157] None | |||
[15/Nov/2018 18:38:05] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]> | |||
[15/Nov/2018 18:38:06] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]> | |||
[15/Nov/2018 18:38:06] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]> | |||
[15/Nov/2018 18:38:18] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]> | |||
[15/Nov/2018 18:38:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]> | |||
[15/Nov/2018 18:38:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]> | |||
[15/Nov/2018 18:38:26] INFO [mysite:157] None | |||
[15/Nov/2018 18:38:56] INFO [mysite:157] None | |||
[15/Nov/2018 18:39:03] INFO [mysite:157] None | |||
[15/Nov/2018 18:39:30] INFO [mysite:157] None | |||
[15/Nov/2018 18:40:05] INFO [mysite:157] None | |||
[15/Nov/2018 18:40:14] INFO [mysite:157] None | |||
[15/Nov/2018 18:40:25] INFO [mysite:157] None | |||
[15/Nov/2018 18:40:36] INFO [mysite:157] None | |||
[15/Nov/2018 18:40:46] INFO [mysite:157] None | |||
[15/Nov/2018 18:41:09] INFO [mysite:157] None | |||
[15/Nov/2018 18:41:23] INFO [mysite:157] None | |||
[15/Nov/2018 18:42:09] INFO [mysite:157] None | |||
[15/Nov/2018 18:42:23] INFO [mysite:157] None | |||
[15/Nov/2018 18:43:17] INFO [mysite:157] None | |||
[15/Nov/2018 18:43:37] INFO [mysite:157] None | |||
[16/Nov/2018 13:07:18] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]> | |||
[16/Nov/2018 13:07:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]> | |||
[16/Nov/2018 13:07:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]> | |||
[16/Nov/2018 13:10:03] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]> | |||
[16/Nov/2018 13:10:03] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:10:03] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:10:34] INFO [mysite:157] None | |||
[16/Nov/2018 13:11:18] INFO [mysite:162] post method | |||
[16/Nov/2018 13:11:18] INFO [mysite:165] form is valid | |||
[16/Nov/2018 13:11:18] INFO [mysite:169] ['hi', 'first', 'test', 'bayern', 'second', 'bla', 'sunday', 'studienbüro', 'two', 'visual studio code', 'wow', 'strange', 'hi there'] | |||
[16/Nov/2018 13:11:18] INFO [mysite:172] two | |||
[16/Nov/2018 13:11:18] INFO [mysite:174] worked out | |||
[16/Nov/2018 13:11:18] INFO [mysite:157] None | |||
[16/Nov/2018 13:11:39] INFO [mysite:157] test | |||
[16/Nov/2018 13:11:52] INFO [mysite:59] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:12:55] INFO [mysite:146] <QuerySet []> | |||
[16/Nov/2018 13:13:27] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: second>, <Tag: first>, <Tag: test>, <Tag: bayern>]> | |||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: teeeest>, <Post: Bavaria>]> | |||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet []> | |||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Bavaria>]> | |||
[16/Nov/2018 13:28:47] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]> | |||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]> | |||
[16/Nov/2018 13:28:50] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]> | |||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]> | |||
[16/Nov/2018 13:28:52] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]> | |||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]> | |||
[16/Nov/2018 13:33:26] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: second>, <Tag: first>, <Tag: test>, <Tag: bayern>]> | |||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: teeeest>, <Post: Bavaria>]> | |||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet []> | |||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Bavaria>]> | |||
[16/Nov/2018 13:33:28] INFO [mysite:156] None | |||
[17/Nov/2018 14:55:06] INFO [mysite:156] None | |||
[17/Nov/2018 14:56:39] INFO [mysite:156] None | |||
[17/Nov/2018 15:00:30] INFO [mysite:156] None | |||
[17/Nov/2018 15:00:42] INFO [mysite:156] None | |||
[17/Nov/2018 15:00:45] INFO [mysite:156] None | |||
[17/Nov/2018 15:01:04] INFO [mysite:156] None | |||
[17/Nov/2018 15:01:47] INFO [mysite:156] None | |||
[17/Nov/2018 15:03:00] INFO [mysite:156] None | |||
[17/Nov/2018 15:03:20] INFO [mysite:156] None | |||
[17/Nov/2018 15:03:37] INFO [mysite:156] None | |||
[17/Nov/2018 15:04:41] INFO [mysite:156] None | |||
[17/Nov/2018 15:06:26] INFO [mysite:156] None | |||
[17/Nov/2018 15:06:36] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]> | |||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]> | |||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]> | |||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]> | |||
[17/Nov/2018 15:06:42] INFO [mysite:156] None | |||
[17/Nov/2018 15:09:44] INFO [mysite:156] None | |||
[17/Nov/2018 15:10:11] INFO [mysite:156] None | |||
[17/Nov/2018 15:10:36] INFO [mysite:156] None | |||
[17/Nov/2018 15:10:46] INFO [mysite:156] None | |||
[17/Nov/2018 15:11:14] INFO [mysite:156] None | |||
[17/Nov/2018 15:11:23] INFO [mysite:156] None | |||
[17/Nov/2018 15:11:35] INFO [mysite:156] None | |||
[17/Nov/2018 15:11:44] INFO [mysite:156] None | |||
[17/Nov/2018 15:11:52] INFO [mysite:156] None | |||
[17/Nov/2018 15:13:06] INFO [mysite:156] None | |||
[17/Nov/2018 15:17:31] INFO [mysite:156] None | |||
[17/Nov/2018 15:17:50] INFO [mysite:156] None | |||
[17/Nov/2018 15:18:42] INFO [mysite:156] None | |||
[17/Nov/2018 15:19:25] INFO [mysite:156] None | |||
[17/Nov/2018 15:19:34] INFO [mysite:156] None | |||
[17/Nov/2018 15:19:59] INFO [mysite:156] None | |||
[17/Nov/2018 15:20:13] INFO [mysite:156] None | |||
[17/Nov/2018 15:20:21] INFO [mysite:156] None | |||
[17/Nov/2018 15:20:29] INFO [mysite:164] post method | |||
[17/Nov/2018 15:20:29] INFO [mysite:167] form is valid | |||
[17/Nov/2018 15:20:29] INFO [mysite:171] ['hi', 'first', 'test', 'bayern', 'second', 'bla', 'sunday', 'studienbüro', 'two', 'visual studio code', 'wow', 'strange', 'hi there'] | |||
[17/Nov/2018 15:20:29] INFO [mysite:174] second | |||
[17/Nov/2018 15:20:29] INFO [mysite:176] worked out | |||
[17/Nov/2018 15:20:29] INFO [mysite:156] None |