Browse Source

updated pyton versions and wrote hilfsbibliotheken

master
Esther Kleinhenz 2 years ago
parent
commit
a577e47acc
100 changed files with 13143 additions and 566 deletions
  1. 34
    7
      Dockerfile
  2. 2
    2
      application/forms.py
  3. 2
    12
      application/templates/student_page.html
  4. 9
    5
      application/views.py
  5. 0
    0
      busybox.tar
  6. 36
    0
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/AcknowledgmentsDedicationSentence/acknowledgements.aux
  7. 4
    1
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux
  8. 18
    0
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl
  9. 41
    34
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.blg
  10. 3
    3
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof
  11. 160
    117
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.log
  12. 20
    16
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.out
  13. BIN
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.synctex.gz
  14. 8
    4
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc
  15. 1
    1
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux
  16. 1
    1
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux
  17. 1
    1
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux
  18. 12
    8
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux
  19. 2
    2
      doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux
  20. BIN
      doc/bachelorarbeit_EstherKleinhenz/bachelorabeit_EstherKleinhenz.pdf
  21. 4
    1
      doc/bachelorarbeit_EstherKleinhenz/chapters/einleitung.tex
  22. 13
    0
      doc/bachelorarbeit_EstherKleinhenz/chapters/ergebnis.tex
  23. 34
    37
      doc/bachelorarbeit_EstherKleinhenz/chapters/framework.tex
  24. 1
    1
      doc/bachelorarbeit_EstherKleinhenz/chapters/prototyp.tex
  25. BIN
      doc/bachelorarbeit_EstherKleinhenz/figures/decorator_example(unused).png
  26. 31
    0
      doc/bachelorarbeit_EstherKleinhenz/references/References_2.bib
  27. 6
    9
      doc/bachelorarbeit_EstherKleinhenz/titlepage/titlepage.tex
  28. 93
    0
      log.txt
  29. 24
    20
      requirements.txt
  30. 4
    0
      start.sh
  31. 11
    0
      thesisenv/bin/gunicorn
  32. 11
    0
      thesisenv/bin/gunicorn_django
  33. 11
    0
      thesisenv/bin/gunicorn_paster
  34. 59
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/DESCRIPTION.rst
  35. 0
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/INSTALLER
  36. 90
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/METADATA
  37. 99
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/RECORD
  38. 6
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/WHEEL
  39. 9
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/entry_points.txt
  40. 1
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/metadata.json
  41. 1
    0
      thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/top_level.txt
  42. 8
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/__init__.py
  43. 264
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/_compat.py
  44. 4
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/__init__.py
  45. 192
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/base.py
  46. 120
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/django_wsgi.py
  47. 160
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/djangoapp.py
  48. 210
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/pasterapp.py
  49. 78
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py
  50. 620
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/arbiter.py
  51. 2362
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/argparse_compat.py
  52. 1749
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/config.py
  53. 70
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/debug.py
  54. 23
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/errors.py
  55. 452
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/glogging.py
  56. 9
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/__init__.py
  57. 68
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/_sendfile.py
  58. 259
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/body.py
  59. 109
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/errors.py
  60. 343
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/message.py
  61. 51
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/parser.py
  62. 80
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/unreader.py
  63. 420
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/http/wsgi.py
  64. 0
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/instrument/__init__.py
  65. 124
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/instrument/statsd.py
  66. 0
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/management/__init__.py
  67. 0
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/management/commands/__init__.py
  68. 113
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/management/commands/run_gunicorn.py
  69. 84
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/pidfile.py
  70. 53
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/reloader.py
  71. 592
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/selectors.py
  72. 762
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/six.py
  73. 233
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/sock.py
  74. 548
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/util.py
  75. 22
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/__init__.py
  76. 168
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/_gaiohttp.py
  77. 143
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/async.py
  78. 257
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/base.py
  79. 17
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/gaiohttp.py
  80. 135
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/geventlet.py
  81. 233
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/ggevent.py
  82. 371
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/gthread.py
  83. 130
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/gtornado.py
  84. 208
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/sync.py
  85. 56
    0
      thesisenv/lib/python3.6/site-packages/gunicorn/workers/workertmp.py
  86. 0
    8
      thesisenv/lib/python3.6/site-packages/hitcount/models.py
  87. 72
    37
      thesisenv/lib/python3.6/site-packages/pkg_resources/__init__.py
  88. 71
    15
      thesisenv/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py
  89. 71
    25
      thesisenv/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py
  90. 1
    1
      thesisenv/lib/python3.6/site-packages/pkg_resources/extern/__init__.py
  91. 3
    2
      thesisenv/lib/python3.6/site-packages/pkg_resources/py31compat.py
  92. 0
    36
      thesisenv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst
  93. 0
    1
      thesisenv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/metadata.json
  94. 1
    0
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/INSTALLER
  95. 0
    0
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/LICENSE
  96. 15
    10
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/METADATA
  97. 146
    148
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/RECORD
  98. 1
    1
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/WHEEL
  99. 0
    0
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/dependency_links.txt
  100. 0
    0
      thesisenv/lib/python3.6/site-packages/setuptools-40.5.0.dist-info/entry_points.txt

+ 34
- 7
Dockerfile View File

@@ -1,19 +1,46 @@
# The first instruction is what image we want to base our container on
# We Use an official Python runtime as a parent image
FROM python:3.6
#FROM python:3.6

# FROM directive instructing base image to build upon
FROM python:3.6.6

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1
#ENV PYTHONUNBUFFERED 1

# App directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install azure event hub client dependencies
#COPY p /usr/src/app/

# Bundle app source
COPY . /usr/src/app

# COPY startup script into known file location in container
COPY start.sh /start.sh

# create root directory for our project in the container
RUN mkdir /esther_kleinhenz_ba
#RUN mkdir /esther_kleinhenz_ba

# EXPOSE port 8000 to allow communication to/from server
#EXPOSE 8000

RUN set -x \
&& buildDeps='curl gcc libc6-dev libsqlite3-dev libssl-dev make xz-utils zlib1g-dev'

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Set the working directory to /esther_kleinhenz_ba
WORKDIR /esther_kleinhenz_ba
#WORKDIR /esther_kleinhenz_ba

# CMD specifcies the command to execute to start the server running.
CMD ["/start.sh"]
# done!

# Copy the current directory contents into the container at /esther_kleinhenz_ba
ADD . /esther_kleinhenz_ba/
#ADD . /esther_kleinhenz_ba/

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

+ 2
- 2
application/forms.py View File

@@ -16,7 +16,7 @@ class PostForm(forms.ModelForm):
fields = ('title', 'text', 'published_date','tags')

class NewTagForm(forms.ModelForm):
m_tags = TagField()
tags = TagField()
class Meta:
model = CustomUser
fields = ['m_tags']
fields = ['tags']

+ 2
- 12
application/templates/student_page.html View File

@@ -1,16 +1,6 @@
{% extends "base.html" %} {% block content %} {% load taggit_templatetags2_tags %} {% get_taglist as tags for 'application.post'%}
{% extends "base.html" %} {% block content %} {% load taggit_templatetags2_tags %}
{% get_taglist as tags for 'application.post'%}

<div id="">
<ul>
{% for tag in tags %}
<li>{{tag}}
<a class="btn btn-outline-dark" href="{% url 'tag_remove' tag.slug %}">
<span class="glyphicon glyphicon-remove">Remove</span>
</a>
</li>
{{ result }} {% endfor %}
</ul>
</div>
<div>
<form class="post-form" method="post">
{% csrf_token %} {{form.as_p}}

+ 9
- 5
application/views.py View File

@@ -126,17 +126,21 @@ def post_remove(request, pk):

@login_required
def tag_remove(request, slug=None):
log = logging.getLogger('mysite')
user_instance = get_object_or_404(CustomUser, user=request.user)
log.info(u)
tag = Tag.get_object_or_404(Tag, slug = slug)
log.info(tag)
if slug:
tag = get_object_or_404(Tag, slug=slug)
tag.delete()
user_instance.tags.remove(tag)
save_m2m()
return redirect('student_page')
return redirect('student_page')


@login_required
def student_page(request):
log = logging.getLogger('mysite')
user_instance = get_object_or_404(CustomUser, user=request.user)
log.info(user_instance)
if request.method == "POST":
log.info('post method')
form = NewTagForm(request.POST, instance=user_instance)
@@ -147,7 +151,7 @@ def student_page(request):
obj.save()
tag_names = [tag.name for tag in Tag.objects.all()]
log.info(tag_names)
m_tags = form.cleaned_data['m_tags']
m_tags = form.cleaned_data['tags']
m_tags = ' '.join(str(m_tags) for m_tags in m_tags)
log.info(m_tags)
if m_tags in tag_names:

+ 0
- 0
busybox.tar View File


+ 36
- 0
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/AcknowledgmentsDedicationSentence/acknowledgements.aux View File

@@ -0,0 +1,36 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{Acknowledgements}{iii}{chapter*.2}}
\@setckpt{AcknowledgmentsDedicationSentence/acknowledgements}{
\setcounter{page}{4}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{0}
\setcounter{section}{0}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\setcounter{float@type}{8}
\setcounter{parentequation}{0}
\setcounter{lstnumber}{1}
\setcounter{ContinuedFloat}{0}
\setcounter{subfigure}{0}
\setcounter{subtable}{0}
\setcounter{r@tfl@t}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{2}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
}

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

@@ -42,6 +42,9 @@
\bibcite{King}{{Kin17}{}{{}}{{}}}
\bibcite{Leipner}{{Lei13}{}{{}}{{}}}
\bibcite{Ndukwe}{{Ndu17}{}{{}}{{}}}
\bibcite{Ong}{{Ong18}{}{{}}{{}}}
\bibcite{Shabda}{{Sha09}{}{{}}{{}}}
\bibcite{Shelest}{{She09}{}{{}}{{}}}
\providecommand\NAT@force@numbers{}\NAT@force@numbers
\@writefile{toc}{\contentsline {chapter}{Referenzen}{19}{chapter*.11}}
\bibcite{Timm}{{Tim15}{}{{}}{{}}}
\providecommand\NAT@force@numbers{}\NAT@force@numbers

+ 18
- 0
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl View File

@@ -50,6 +50,18 @@ Nnenna Ndukwe.
\newblock
https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why.

\bibitem[Ong18]{Ong}
Selwin Ong.
\newblock django-post\_office git repository.
\newblock 2018.
\newblock https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst.

\bibitem[Sha09]{Shabda}
Shabda.
\newblock Understanding decorators.
\newblock 2009.
\newblock https://www.agiliq.com/blog/2009/06/understanding-decorators/.

\bibitem[She09]{Shelest}
Alexy Shelest.
\newblock Model view controller, model view presenter, and model view viewmodel
@@ -58,4 +70,10 @@ Alexy Shelest.
\newblock
https://www.codeproject.com/Articles/42830/Model-View-Controller-Model-View-Presenter-and-Mod.

\bibitem[Tim15]{Timm}
Damon Timm.
\newblock django-hitcount documentation.
\newblock 2015.
\newblock https://django-hitcount.readthedocs.io/en/latest/overview.html.

\end{thebibliography}

+ 41
- 34
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.blg View File

@@ -11,6 +11,10 @@ A level-1 auxiliary file: chapters/ausblick.aux
A level-1 auxiliary file: chapters/fazit.aux
The style file: alpha.bst
Database file #1: ../references/References_2.bib
Repeated entry---line 78 of file ../references/References_2.bib
: @article{Ong
: ,
I'm skipping whatever remains of this entry
Warning--empty journal in Dixit
Warning--empty journal in Python
Warning--empty journal in Gaynor
@@ -18,46 +22,49 @@ Warning--empty journal in Herzog
Warning--empty journal in King
Warning--empty journal in Leipner
Warning--empty journal in Ndukwe
Warning--empty journal in Ong
Warning--empty journal in Shabda
Warning--empty journal in Shelest
You've used 8 entries,
Warning--empty journal in Timm
You've used 11 entries,
2543 wiz_defined-function locations,
611 strings with 6085 characters,
and the built_in function-call counts, 2196 in all, are:
= -- 216
> -- 64
< -- 8
+ -- 16
- -- 16
* -- 106
:= -- 390
add.period$ -- 32
call.type$ -- 8
change.case$ -- 40
chr.to.int$ -- 8
cite$ -- 16
duplicate$ -- 112
empty$ -- 161
format.name$ -- 32
if$ -- 426
626 strings with 6410 characters,
and the built_in function-call counts, 3011 in all, are:
= -- 297
> -- 88
< -- 11
+ -- 22
- -- 22
* -- 145
:= -- 533
add.period$ -- 44
call.type$ -- 11
change.case$ -- 55
chr.to.int$ -- 11
cite$ -- 22
duplicate$ -- 154
empty$ -- 221
format.name$ -- 44
if$ -- 585
int.to.chr$ -- 1
int.to.str$ -- 0
missing$ -- 8
newline$ -- 51
num.names$ -- 24
pop$ -- 48
missing$ -- 11
newline$ -- 69
num.names$ -- 33
pop$ -- 66
preamble$ -- 1
purify$ -- 48
purify$ -- 66
quote$ -- 0
skip$ -- 88
skip$ -- 120
stack$ -- 0
substring$ -- 56
substring$ -- 77
swap$ -- 0
text.length$ -- 8
text.prefix$ -- 8
text.length$ -- 11
text.prefix$ -- 11
top$ -- 0
type$ -- 64
warning$ -- 8
while$ -- 16
width$ -- 10
write$ -- 106
(There were 8 warnings)
type$ -- 88
warning$ -- 11
while$ -- 22
width$ -- 14
write$ -- 145
(There was 1 error message)

+ 3
- 3
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof View File

@@ -2,11 +2,11 @@
\babel@toc {german}{}
\addvspace {10\p@ }
\addvspace {10\p@ }
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{6}{figure.caption.5}
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\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\relax }}{9}{figure.caption.8}
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.9}
\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 }}{12}{figure.caption.10}
\addvspace {10\p@ }
\addvspace {10\p@ }

+ 160
- 117
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.log View File

@@ -1,4 +1,4 @@
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 15 OCT 2018 21:49
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 2 NOV 2018 22:59
entering extended mode
\write18 enabled.
file:line:error style messages enabled.
@@ -1043,17 +1043,17 @@ Underfull \hbox (badness 10000) in paragraph at lines 48--57
[]

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 85.
(babel) in language on input line 82.
[2])
\openout2 = `abstract/abstract.aux'.

@@ -1102,23 +1102,30 @@ Package babel Info: Redefining german shorthand "~



] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc)
\tf@toc=\write6
\openout6 = `bachelorabeit_EstherKleinhenz.toc'.

] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
(babel) in language on input line 28.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
[3]
(babel) in language on input line 28.
[3])
\tf@toc=\write6
\openout6 = `bachelorabeit_EstherKleinhenz.toc'.



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 50.
Package babel Info: Redefining german shorthand "|
@@ -1131,10 +1138,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
[4


]
[4]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
@@ -1160,6 +1164,8 @@ Package babel Info: Redefining german shorthand "~
[1




]
\openout2 = `chapters/einleitung.aux'.

@@ -1212,33 +1218,27 @@ Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
(babel) in language on input line 12.
[3]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 13.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 13.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
(babel) in language on input line 13.
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
)

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 57.
Package babel Info: Redefining german shorthand "|
@@ -1251,7 +1251,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 57.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 57.
[4]
[4]
\openout2 = `chapters/framework.aux'.

(./chapters/framework.tex
@@ -1263,23 +1263,16 @@ 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 8.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 7.
(babel) in language on input line 8.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 7.
(babel) in language on input line 8.
File: figures/MVP.png Graphic file (type bmp)
<figures/MVP.png>

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

LaTeX Font Info: Try loading font information for TS1+aer on input line 21.
LaTeX Font Info: No file TS1aer.fd. on input line 21.

LaTeX Font Warning: Font shape `TS1/aer/m/n' undefined
(Font) using `TS1/cmr/m/n' instead
(Font) for symbol `textbullet' on input line 21.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 22.
Package babel Info: Redefining german shorthand "|
@@ -1298,132 +1291,160 @@ Package babel Info: Redefining german shorthand "~


]
LaTeX Font Info: Try loading font information for TS1+aer on input line 22.
LaTeX Font Info: No file TS1aer.fd. on input line 22.


LaTeX Font Warning: Font shape `TS1/aer/m/n' undefined
(Font) using `TS1/cmr/m/n' instead
(Font) for symbol `textbullet' on input line 22.

File: figures/request-response-cycle.png Graphic file (type bmp)
<figures/request-response-cycle.png>


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

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 36.
(babel) in language on input line 37.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 36.
(babel) in language on input line 37.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 36.
(babel) in language on input line 37.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 51.
(babel) in language on input line 40.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 51.
(babel) in language on input line 40.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 51.
(babel) in language on input line 40.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 51.
(babel) in language on input line 40.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 51.
(babel) in language on input line 40.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 51.
(babel) in language on input line 40.
[6]
Underfull \vbox (badness 10000) has occurred while \output is active []
Underfull \vbox (badness 2951) has occurred while \output is active []

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 53.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 53.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 53.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 53.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 53.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 53.
(babel) in language on input line 52.
[7]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
(babel) in language on input line 56.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
(babel) in language on input line 56.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
(babel) in language on input line 56.
File: figures/virt-env-terminal.png Graphic file (type bmp)
<figures/virt-env-terminal.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 80.
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 80.
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 80.
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 80.
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 80.
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 80.
(babel) in language on input line 73.
[8]
File: figures/ldap-tree.png Graphic file (type bmp)
<figures/ldap-tree.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 95.
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 95.
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 95.
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 84.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 84.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 84.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 86.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 86.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 86.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 86.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 86.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 86.
[9]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 118.
(babel) in language on input line 104.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 118.
(babel) in language on input line 104.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 118.

Underfull \vbox (badness 10000) has occurred while \output is active []

(babel) in language on input line 104.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 120.
(babel) in language on input line 108.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 120.
(babel) in language on input line 108.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 120.
(babel) in language on input line 108.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 120.
(babel) in language on input line 108.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 120.
(babel) in language on input line 108.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 120.
(babel) in language on input line 108.
[10]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 115.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 115.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 115.
File: figures/bootstrap-head-tag.png Graphic file (type bmp)
<figures/bootstrap-head-tag.png>
File: figures/bootstrap-class-example.png Graphic file (type bmp)
<figures/bootstrap-class-example.png>


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

)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
(babel) in language on input line 128.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
[11]
(babel) in language on input line 128.
[11]
File: figures/bootstrap-class-example.png Graphic file (type bmp)
<figures/bootstrap-class-example.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 140.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 140.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 140.
)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "|
@@ -1661,21 +1682,43 @@ Underfull \hbox (badness 10000) in paragraph at lines 46--52
[]


Underfull \hbox (badness 10000) in paragraph at lines 54--60
Underfull \hbox (badness 10000) in paragraph at lines 54--58
[]\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 60--64
[]\T1/aer/m/n/12 Shabda. Un-der-stan-ding de-co-ra-tors. 2009.
[]


Underfull \hbox (badness 10000) in paragraph at lines 66--72
[]\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 54--60
Underfull \hbox (badness 10000) in paragraph at lines 66--72
\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 54--60
Underfull \hbox (badness 10000) in paragraph at lines 66--72
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller-
[]

)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 72.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 72.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 72.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 72.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 72.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 72.
[19])
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 77.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 77.
@@ -1689,7 +1732,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 77.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 77.
[19]
[20]
Package atveryend Info: Empty hook `AfterLastShipout' on input line 77.
(/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/titlepage/titlepage.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/abstract/abstract.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/einleitung.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux))
Package atveryend Info: Empty hook `AtVeryEndDocument' on input line 77.
@@ -1704,12 +1747,12 @@ Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 77.
)
(\end occurred when \ifnum on line 5 was incomplete)
Here is how much of TeX's memory you used:
26561 strings out of 492970
476474 string characters out of 6133939
547394 words of memory out of 5000000
30175 multiletter control sequences out of 15000+600000
554220 words of font info for 61 fonts, out of 8000000 for 9000
26572 strings out of 492970
476605 string characters out of 6133939
546800 words of memory out of 5000000
30185 multiletter control sequences out of 15000+600000
555998 words of font info for 62 fonts, out of 8000000 for 9000
1348 hyphenation exceptions out of 8191
58i,11n,50p,10437b,892s stack positions out of 5000i,500n,10000p,200000b,80000s
58i,12n,50p,10437b,943s stack positions out of 5000i,500n,10000p,200000b,80000s

Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (25 pages).
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (26 pages).

+ 20
- 16
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.out View File

@@ -5,19 +5,23 @@
\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}{section.2.1}% 8
\BOOKMARK [1][-]{section.2.2}{Erweiterungen}{chapter.2}% 9
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 10
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 11
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 12
\BOOKMARK [1][-]{section.3.1}{Organisation}{chapter.3}% 13
\BOOKMARK [2][-]{subsection.3.1.1}{Verwaltung\040im\040Administrator-Backend}{section.3.1}% 14
\BOOKMARK [2][-]{subsection.3.1.2}{Berechtigung\040der\040User}{section.3.1}% 15
\BOOKMARK [1][-]{section.3.2}{Funktion}{chapter.3}% 16
\BOOKMARK [2][-]{subsection.3.2.1}{Abonnieren}{section.3.2}% 17
\BOOKMARK [2][-]{subsection.3.2.2}{Filtern}{section.3.2}% 18
\BOOKMARK [2][-]{subsection.3.2.3}{Benachrichtigung}{section.3.2}% 19
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 20
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 21
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 22
\BOOKMARK [0][-]{chapter*.11}{Referenzen}{}% 23
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten\040Django's}{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 [1][-]{section.2.2}{Erweiterungen}{chapter.2}% 11
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 12
\BOOKMARK [2][-]{subsection.2.2.2}{Hilfsbibliotheken}{section.2.2}% 13
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 14
\BOOKMARK [1][-]{section.2.4}{Cron}{chapter.2}% 15
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 16
\BOOKMARK [1][-]{section.3.1}{Organisation}{chapter.3}% 17
\BOOKMARK [2][-]{subsection.3.1.1}{Verwaltung\040im\040Administrator-Backend}{section.3.1}% 18
\BOOKMARK [2][-]{subsection.3.1.2}{Berechtigung\040der\040User}{section.3.1}% 19
\BOOKMARK [1][-]{section.3.2}{Funktionen}{chapter.3}% 20
\BOOKMARK [2][-]{subsection.3.2.1}{Abonnieren}{section.3.2}% 21
\BOOKMARK [2][-]{subsection.3.2.2}{Filtern}{section.3.2}% 22
\BOOKMARK [2][-]{subsection.3.2.3}{Benachrichtigung}{section.3.2}% 23
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 24
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 25
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 26
\BOOKMARK [0][-]{chapter*.11}{Referenzen}{}% 27

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


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

@@ -7,15 +7,19 @@
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{4}{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}{6}{subsection.2.1.1}
\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2}
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Django's}{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 {section}{\numberline {2.2}Erweiterungen}{9}{section.2.2}
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{9}{subsection.2.2.1}
\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{10}{subsection.2.2.2}
\contentsline {section}{\numberline {2.3}Bootstrap}{11}{section.2.3}
\contentsline {section}{\numberline {2.4}Cron}{12}{section.2.4}
\contentsline {chapter}{\numberline {3}Prototyp}{13}{chapter.3}
\contentsline {section}{\numberline {3.1}Organisation}{13}{section.3.1}
\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{13}{subsection.3.1.1}
\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{13}{subsection.3.1.2}
\contentsline {section}{\numberline {3.2}Funktion}{13}{section.3.2}
\contentsline {section}{\numberline {3.2}Funktionen}{13}{section.3.2}
\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{13}{subsection.3.2.1}
\contentsline {subsection}{\numberline {3.2.2}Filtern}{13}{subsection.3.2.2}
\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{14}{subsection.3.2.3}

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

@@ -28,7 +28,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{21}
\setcounter{bookmark@seq@number}{25}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}

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

@@ -33,7 +33,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{21}
\setcounter{bookmark@seq@number}{25}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}

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

@@ -32,7 +32,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{22}
\setcounter{bookmark@seq@number}{26}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}

+ 12
- 8
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux View File

@@ -5,16 +5,20 @@
\@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\relax }}{6}{figure.caption.5}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{6}{subsection.2.1.1}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\relax }}{7}{figure.caption.6}}
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2}}
\@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{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\relax }}{9}{figure.caption.8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}}
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{9}{section.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{9}{subsection.2.2.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{10}{subsection.2.2.2}}
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{11}{section.2.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.9}}
\@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 }}{12}{figure.caption.10}}
\@writefile{toc}{\contentsline {section}{\numberline {2.4}Cron}{12}{section.2.4}}
\@setckpt{chapters/framework}{
\setcounter{page}{13}
\setcounter{equation}{0}
@@ -26,7 +30,7 @@
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{2}
\setcounter{section}{3}
\setcounter{section}{4}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
@@ -43,7 +47,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{11}
\setcounter{bookmark@seq@number}{15}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}

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

@@ -7,7 +7,7 @@
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Organisation}{13}{section.3.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{13}{subsection.3.1.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{13}{subsection.3.1.2}}
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Funktion}{13}{section.3.2}}
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Funktionen}{13}{section.3.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{13}{subsection.3.2.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Filtern}{13}{subsection.3.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{14}{subsection.3.2.3}}
@@ -39,7 +39,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{19}
\setcounter{bookmark@seq@number}{23}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}

BIN
doc/bachelorarbeit_EstherKleinhenz/bachelorabeit_EstherKleinhenz.pdf View File


+ 4
- 1
doc/bachelorarbeit_EstherKleinhenz/chapters/einleitung.tex View File

@@ -5,9 +5,12 @@ Schon seit geraumer Zeit ist bekannt, dass das Versenden von Informationen über

\section{Ausgangssituation}
Alle Informationen der Fakultät Elektrotechnik Feinwerktechnik Informationstechnik, kurz efi, werden über die globalen Verteiler des Hochschulinternen Postfaches versendet. Viele dieser Daten sind jedoch nur für eine geringe Schnittmenge der Empfänger relevant und lassen sich nur schwer priorisieren. Das ständig überlastete Postfach muss somit regelmä"sig gepflegt werden. Einen massiven Administrativen Aufwand bedeutet es, E-Mails zu filtern und nach persönlichem Ermessen zu verwalten.
---genauer sagen woher ich mir sicher bin, dass das postfach überlastet ist
Zudem leidet die Nachhaltigkeit der Informationen. Möchten die Empfänger ältere E-Mails abrufen, mussten diese meist schon entfernt werden um Platz für den neuen, eintreffenden E-Mail-Verkehr zu schaffen.
Diese Situation führt dazu, dass Empfänger die Informationen meist nicht lesen und sofort entfernen. Die Ersteller haben keinerlei Möglichkeiten zu überprüfen ob und wie viele Studierende und Dozenten eingehende Nachrichten öffnen und lesen.
---Forschungsfrage

\section{Ziel der Arbeit}
Ziel der Arbeit ist es, durch die Einbindung einer Social Media Plattform den Speicheraufwand des Hochschulpostfaches für Studierende der Efi-Fakultät zu reduzieren. Die Flut an E-Mails soll durch das Verwenden eines personalisierte Dashboard gedrosselt werden. Hierbei wird zunächst der Fokus auf die grundlegenden Funktionen der Website gelegt. Dazu gehört das Abonnieren, einpflegen von neuen und löschen von alten Nachrichten.
Zudem sollen die Autoren benachrichtigt werden, in welchem Umfang die hochgeladenen Informationen bereits abonniert und gelesen wurden.
Zudem sollen die Autoren benachrichtigt werden, in welchem Umfang die hochgeladenen Informationen bereits abonniert und gelesen wurden.
---zu kurz

+ 13
- 0
doc/bachelorarbeit_EstherKleinhenz/chapters/ergebnis.tex View File

@@ -2,3 +2,16 @@
\label{ch:ergebnis}
\subsection{Evaluierung}


Eine weitere hilfreiche Erweiterung ist pylint. Das Tool sucht nicht nur nach Fehlern im Code, sondern versucht diesen sauber und einheitlich zu gestalten. Hierbei wird auf den Code-Standard PEP-8 geprüft [Dix18]. Die folgende Liste zeigt eine Kurzfassung der wichtigsten Regeln:

\begin{itemize}
\item Einrückung, meist 4 Leerzeichen
\item Maximale Zeichenanzahl pro Zeile
\item Zwei Leerzeile zwischen Klassen und Funktionen
\item Eine Leerzeile zwischen Methoden innerhalb einer Klasse
\item Leerzeichen in Ausdrücke und Anweisungen vermeiden
\item Die Reihenfolge der Importe: Standartbibliotheken, Drittanbieterbibliotheken, Lokale Anwendungen
\item Konventionen der Namensgebung von Funktionen, Modulen usw.
\end{itemize}
Natürlich sind dies Vorgaben, die eingehalten werden können, aber nicht notwendig sind um den Code fertig kompilieren und ausgeben zu lassen.

+ 34
- 37
doc/bachelorarbeit_EstherKleinhenz/chapters/framework.tex View File

@@ -1,22 +1,23 @@
\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 ausschlie"slich Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website([Ndu17]). Die vielen abstrakten Datentypen, wie dynamische Arrays und Wörterbücher, sind gro"sflächig einsetzbar.
--- Warum genau python?
Ein entscheidender Vorteil hierbei ist das dazugehörige Framework Django, auf das im folgenden Kapitel genauer eingegangen wird.
---Ist pyton nur serverseitig?

\section{Django}
Django ist ein Web-Framework, das auf einer Model-View-Presenter (MVP) Architektur basiert. Ähnlich wie der Model-View-Controller sind die Interaktionen zwischen Model und View die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen (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([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.5\textwidth]{figures/MVP}
\caption{Vereinfachter MVP}
\includegraphics[width=0.6\textwidth]{figures/MVP}
\caption{Vereinfachter MVP ([She09])}
\hfill
\end{figure}

Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht darstellen. Der User gibt eine URL im Browser ein und sendet sie an den Web-Server.
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.

Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem es den Request zum passenden Objekt weiterleitet. Hier wird der Applikation eine Callback-Funktion zur Verfügung gestellt [Kin17]. Au"serdem werden folgende Schritte durchgeführt:
Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem es den Request zum passenden Objekt weiterleitet. Hier wird der Applikation eine Callback-Funktion zur Verfügung gestellt (vgl. [Kin17]). Au"serdem werden folgende Schritte durchgeführt:
\begin{itemize}
\item Die Middleware-Klassen aus der settings.py werden geladen
\item Die Methoden der Listen Request, View, Response und Excpetion werden geladen
@@ -24,42 +25,37 @@ Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem e
\end{itemize}

Der WSGI-Handler fungiert also als Pförtner und Manager zwischen dem Web-Server und dem Django-Projekt.
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen urlresolver. Durch die explizite Zuweisung der vorhandenen Seiten, kann dieser über die regulären Ausdrücke der url.py-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Wie bereits erwähnt, ist es möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Nun kann das Template, die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und einen Response an den Web-Server schicken. Die fertige Seite ist beim Klienten im Browserfenster zum rendern bereit (vgl. Abbildung 2.2.).
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen \textit {urlresolver}(vgl. ). Durch die explizite Zuweisung der vorhandenen Seiten, kann dieser über die regulären Ausdrücke der url.py-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Es ist möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Nun kann das Template, die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und einen Response an den Web-Server schicken. Die fertige Seite ist beim Klienten im Browserfenster zum rendern bereit (vgl. [Kin17], Abbildung 2.2.).

\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{figures/request-response-cycle}
\caption{Request-Response-Kreislauf des Django Frameworks}
\caption{Request-Response-Kreislauf des Django Frameworks ([Nev15])}
\hfill
\end{figure}

\subsection {Besonderheiten}
\subsection {Besonderheiten Django's}
Das Django-Framework bringt einige Besonderheiten mit sich, die beim implementiern des Prototypen von Bedeutung sind. Diese werden im Folgenden beschrieben.

Die Administratoroberfläche ist eines der hilfreichsten Werkzeugen des gesamten Frameworks. Es stellt die Metadaten der Modelle aus dem Code visuell dar. Verifizierte Benutzer können die Daten nicht nur schnell erfassen, sondern diese auch editieren und verwalten. Das Recht, das Admin-Backend uneingeschränkt zu benutzen, ist dem sogenannten superuser vorenthalten. Dieser kann beim erstmaligen zuweisen nur über die Kommandozeile eingerichtet werden. Ist bereits ein superuser vorhanden, kann dieser im Admin-Backend weiteren Benutzern den gleichen Handlungsfreiraum einräumen. Zudem gibt es noch weitere Stufen der Zugangsberechtigungen, Staff- und Active-Status, die für eine breitere Gruppe von Benutzern geeignet ist.
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden dürfen, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit
\\
\noindent\hspace*{10mm}%
from django.contrib.auth.decorators import login\_required
\\
Direkt über den Beginn der Funktion in view.py, oder auch single-view-function, wird zudem folgende Zeile ergänzt:
Vor der Definition der Funktion wird dann folgende Zeile ergänzt:
\\
\noindent\hspace*{10mm}%
\makeatletter @login\_required
\\
Natürlich lassen sich die Decoratoren auch für andere Zwecke vor Funktionen platzieren. Begrenzte Zugänge zu den Views können durch die Art der Anfrage realisiert werden. Der Benutzer muss also zum Beispiel durch GET auf eine Seite zugreifen wollen um Einsicht zu erhalten.

Benutzerdefinierte Decorator sind im Django-Framework möglich, darauf wird hier aber nicht weiter eingegangen.

Natürlich lassen sich Decorator auch für andere Zwecke vor Funktionen platzieren. Unter Anderem werden so die Views vor möglichen Angriffen, wie Cross-Site-Scripting, geschützt.

Durch den einfachen Aufbau ist es au"serdem möglich diese selbst zu implementieren. Ein einfaches Beispiel wäre das prüfen des, an die Funktion übergebenen, Parameter. Sollen nur positive Zahlen verarbeitet werden, so kann der Decorator alle anderen Eingaben abfangen.


\subsection{Virtuelle Umgebung}

\section{Erweiterungen}

Die Programmiersprache Python bringt viele hilfreiche Erweiterungen mit sich. Die im folgenden aufgeführten sind hauptsächlich für die Paketverwaltung der Applikation zuständig.

Wird ein neues Projekt gestartet, ist es üblich, verschiedensten Programme und Module dafür zu verwenden. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden [Fou18]. Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Diese besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal benutzten. Die folgende Abbildung (2.3) zeigt das Erstellen eines neunen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Anfang der Zeile, bedeutet das, diese ist jetzt aktiv.
Wird ein neues Projekt gestartet, ist es üblich, verschiedensten Programme und Module zu verwenden. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden [Fou18]. Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Diese besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal starten. Die folgende Abbildung (2.3) zeigt das Erstellen eines neunen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Kommandozeilenanfang, bedeutet das, diese ist jetzt aktiv.

\begin{figure}[!h]
\centering
@@ -70,18 +66,8 @@ Wird ein neues Projekt gestartet, ist es üblich, verschiedensten Programme und

Die Umgebung ist jetzt bereit befüllt zu werden. Um die Pakete und Module kollisionsfrei zu installieren ist es empfehlenswert einen Package-Manager zu verwenden. Mit pip können diese installiert, geupdated und gelöscht werden. Au"serdem kann der Manager Abhängigkeiten, wenn nötig, überschreiben und optimieren. Falls ein, sich von der neuesten Version unterscheidendes, Programm installiert werden soll, so ist dies ebenso möglich.

Eine weitere hilfreiche Erweiterung ist pylint. Das Tool sucht nicht nur nach Fehlern im Code, sondern versucht diesen sauber und einheitlich zu gestalten. Hierbei wird auf den Code-Standard PEP-8 geprüft [Dix18]. Die folgende Liste zeigt eine Kurzfassung der wichtigsten Regeln:

\begin{itemize}
\item Einrückung, meist 4 Leerzeichen
\item Maximale Zeichenanzahl pro Zeile
\item Zwei Leerzeile zwischen Klassen und Funktionen
\item Eine Leerzeile zwischen Methoden innerhalb einer Klasse
\item Leerzeichen in Ausdrücke und Anweisungen vermeiden
\item Die Reihenfolge der Importe: Standartbibliotheken, Drittanbieterbibliotheken, Lokale Anwendungen
\item Konventionen der Namensgebung von Funktionen, Modulen usw.
\end{itemize}
Natürlich sind dies Vorgaben, die eingehalten werden können, aber nicht notwendig sind um den Code fertig kompilieren und ausgeben zu lassen.
\subsection{Lightweight Directory Access Protocol}

Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hier bearbeitende Bachelor-Arbeit eingebunden werden. Dies ist ein Internetprotokoll, welches die Kommunikation mit dem Hochschulinternen Active Directory verwaltet. Es wird eingesetzt um Benutzer so schnell und effizient wie möglich durch eine bereits existierende Datenbank abzufragen und zu authentifizieren. Der Aufbau ist mit einem Baum zu vergleichen (vgl. Abbildung 2.4.). Die Wurzel besteht aus sehr allgemeinen Informationen, umso näher man den Blättern kommt, umso spezifischer werden diese. Ein Objekt in der Struktur wird durch einen einmaligen Namen identifiziert, der aus den gesamten hinterlegten Informationen besteht. Der Name für den in der Abbildung 2.4 dargestellten Baum wäre \glqq cn=John Doe, ou=People, dc=sun.com\grqq.

@@ -92,8 +78,11 @@ Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hie
\hfill
\end{figure}

\section {Erweiterungen}
Django bringt viele hilfreiche Erweiterungen mit sich, die mit einem Packagemanager einfach in die virtuelle Umgebung geladen werden können. Um das passende Add-on für ein Projekt zu finden, bietet die Plattform djangopackages.org alle Erweiterungen in übersichtlichen Tabellen mit Eigenschaften und Bewertung an.

\subsection {Taggable-Manager}
Django-taggit ist eine Erweiterung von Alex Gaynor, einem Entwickler aus Washingtion DC. Das Add-on ermöglicht das Verwenden von Tags die automatisch mit einem eindeutigen Slug versehen werden. 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.
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.

@@ -103,7 +92,7 @@ Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile e
\$ 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 zu sagen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden folgende Befehle in die Kommandozeile eingefügt:
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 folgende Befehle in die Kommandozeile eingefügt:
\\
\noindent\hspace*{10mm}%
\$ python3 manage.py makemigrations \\
@@ -112,13 +101,21 @@ Au"serdem muss taggit in der settings.py unter INSTALLED\_APPS ergänzt werden.
\\
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde. Neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jedes Wort, dass durch ein Komma oder ein Leerzeichen getrennt ist als ein Tag. Soll dieses jedoch aus mehreren Wörtern bestehen so müssen diese mit Anführungszeichen umfasst werden. Standardmäßig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, Tags sind also case sensitive. Ändern kann man das, indem der Boolean TAGGIT\_CASE\_INSENSITIVE in der settings.py auf True gestellt wird.

\subsection {Hilfsbibliotheken}
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ö"sser 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.

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.

--- evtl. logger addon ---



\section{Bootstrap}
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb, zunächst Firmenintern, an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte. Sie merkten, das die neue Bibliothek, die daraus entstand, nicht nur auf Ihre eigene Website anwendbar, sondern so flexible ist, dass jede Art von Website davon profitieren könnte. 2011 entschieden Sie sich Bootstrap für die Öffentlichkeit frei zugänglich zu machen. Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen interessierten Programmierern weiterentwickelt und ist somit stark gewachsen. Version 2.0 verfügt au"serdem über die Fähigkeit Websites responsive auf verschiedenste mobile Endgeräte anzupassen.
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb, zunächst Firmenintern, an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte. Sie merkten, das die neue Bibliothek, die daraus entstand, nicht nur auf Ihre eigene Website anwendbar, sondern so flexible ist, dass jede Art von Website davon profitieren könnte. Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen Programmierern weiterentwickelt und ist somit stark gewachsen. Version 2.0 verfügt au"serdem über die Fähigkeit Websites responsive auf verschiedenste mobile Endgeräte anzupassen.

Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen. Zudem befinden sich auch Erweiterungen des JavaScript-Frameworks jQuery in der Bibliothek, die weiterführende Funktionen beinhalten wie zum Beispiel Filter oder Dropdown-Menüs. Das Paket kann einfach eingebunden werden im head-tag einer HTML-Datei (vgl. Abbildung 2.3). Das bedeutet, dass Medie-Queries oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser.
Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen. Zudem befinden sich auch Erweiterungen des JavaScript-Frameworks jQuery in der Bibliothek, die weiterführende Funktionen beinhalten wie zum Beispiel Filter oder Dropdown-Menüs. Das Paket kann einfach eingebunden werden im head-tag einer HTML-Datei (vgl. Abbildung 2.3). Das bedeutet, dass Media-Queries oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser.

\begin{figure}[!h]
\centering
@@ -127,7 +124,7 @@ Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, di
\hfill
\end{figure}

Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles bereits automatisch auf die darin vorkommenden Tags, wie Links und Überschriften, angewandt. Dies ist jedoch nur ein sehr kleiner Teil den die Bibliothek zur Verfügung stellt. Möchte man Bootstrap umfangreich nutzen so lassen sich die Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eintragen (vlg. Abbildung 2.4.).
Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles bereits automatisch auf die darin vorkommenden Tags, wie Links und Überschriften, angewendet. Dies ist jedoch nur ein sehr kleiner Teil den die Bibliothek zur Verfügung stellt. Möchte man Bootstrap umfangreich nutzen so lassen sich die Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eintragen (vlg. Abbildung 2.4.).

\begin{figure}[!h]
\centering
@@ -140,5 +137,5 @@ Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben



\section{Cron}


+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/chapters/prototyp.tex View File

@@ -12,7 +12,7 @@ Näher auf CustomUserModel eingehen, Diagramm erstellen und einbinden
Welche Berechtigungen gibt es im Prototyp, welche werden vom Active Directory übernommen?


\section{Funktion}
\section{Funktionen}
Nötige Funktionen

\subsection{Abonnieren}

BIN
doc/bachelorarbeit_EstherKleinhenz/figures/decorator_example(unused).png View File


+ 31
- 0
doc/bachelorarbeit_EstherKleinhenz/references/References_2.bib View File

@@ -53,3 +53,34 @@
year = "2018",
note = "https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code"
}
@article{Shabda,
author = "Shabda",
title = "Understanding decorators",
year = "2009",
note = "https://www.agiliq.com/blog/2009/06/understanding-decorators/"
}
@article{Timm,
author = "Damon Timm",
title = "django-hitcount Documentation",
year = "2015",
note = "https://django-hitcount.readthedocs.io/en/latest/overview.html"
}
@article{Ong,
author = "Selwin Ong",
title = "django-post\_office git Repository",
year = "2018",
note = "https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst"
}
@article{Ong,
author = "Ryan Nevius",
title = "django-post\_office git Repository",
year = "2015",
note = "https://ryannevius.com"
}


+ 6
- 9
doc/bachelorarbeit_EstherKleinhenz/titlepage/titlepage.tex View File

@@ -16,7 +16,7 @@
\line(1,0){1}\\

\vspace{2.0cm}
\textbf{\huge{Esther Kleinhenz}}\\
\textbf{\huge{Esther Beate Kleinhenz}}\\
\vspace{0.4cm}
{\Large \textbf{Matrikelnummer: }2649270}\\
\vspace{2.5cm}
@@ -55,10 +55,7 @@ Nürnberg, {\today}\\
%\indent verfasst.
%\vspace{1.5cm}

\indent Hiermit erkläre ich, dass die vorliegende Arbeit von mir selbständig verfasst und nicht\\
\indent anderweitig für Prüfungszwecke vorgelegt wurde, keine anderen als die angegebenen\\
\indent Quellen oder Hilfsmittel benutzt sowie wörtliche oder sinngemäße Zitate als solche\\
\indent gekennzeichnet wurden.
Hiermit erkläre ich, dass die vorliegende Arbeit von mir selbständig verfasst und nicht anderweitig für Prüfungszwecke vorgelegt wurde, keine anderen als die angegebenen. Quellen oder Hilfsmittel benutzt sowie wörtliche oder sinngemäße Zitate als solche gekennzeichnet wurden.

\vspace{0.5cm}

@@ -68,15 +65,15 @@ Nürnberg, {\today}\\

\vspace{1.0cm}

\indent Katja Cornelia Hader \\
\indent E-mail: {haderka56442@th-nuernberg.de}
\indent Esther Beate Kleinhenz \\
\indent E-mail: {kleinhenzes60188@th-nuernberg.de}


\vspace{\fill}
\indent Studiengang Wirtschaftsinformatik\\
\indent Studiengang Media Engineering\\
\indent Georg Simon Ohm\\
\indent Technische Hochschule Nürnberg\\
\indent Keßlerplatz 12\\
\indent Ke"slerplatz 12\\
\indent 90489 Nürnberg\\
\indent Deutschland


+ 93
- 0
log.txt View File

@@ -472,3 +472,96 @@
[30/Oct/2018 17:01:30] INFO [mysite:140] form is valid
[30/Oct/2018 17:01:30] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 17:01:30] INFO [mysite:148] testag
[31/Oct/2018 14:51:36] INFO [mysite:141] CustomUser object (2)
[31/Oct/2018 14:51:39] INFO [mysite:141] CustomUser object (2)
[31/Oct/2018 14:52:57] INFO [mysite:142] CustomUser object (2)
[31/Oct/2018 14:53:00] INFO [mysite:142] CustomUser object (2)
[31/Oct/2018 14:54:10] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:54:12] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:09] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:38] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:41] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:56:20] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:29] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:31] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:43] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:59:00] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:18:53] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:19:02] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:19:04] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:20:10] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:21:24] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:21:27] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:24:55] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:27:16] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:27:59] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:28:02] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:29:13] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:29:17] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:32:43] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 17:32:45] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 17:42:25] INFO [mysite:186] None
[31/Oct/2018 17:43:06] INFO [mysite:186] None
[31/Oct/2018 17:43:07] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:43:13] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:44:14] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:44:17] INFO [mysite:175] <QuerySet [<Tag: hi>]>
[31/Oct/2018 17:44:17] INFO [mysite:178] <QuerySet [<Post: Hi there>]>
[31/Oct/2018 17:45:09] INFO [mysite:175] <QuerySet [<Tag: hi>]>
[31/Oct/2018 17:45:09] INFO [mysite:178] <QuerySet [<Post: Hi there>]>
[31/Oct/2018 17:45:15] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:45:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:45:24] INFO [mysite:146] post method
[31/Oct/2018 17:45:24] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 17:46:00] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:46:04] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:46:04] INFO [mysite:146] post method
[31/Oct/2018 17:46:05] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 17:46:05] INFO [mysite:156] hi
[31/Oct/2018 17:46:05] INFO [mysite:158] worked out
[31/Oct/2018 17:46:05] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:10] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:13] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:13] INFO [mysite:146] post method
[31/Oct/2018 17:51:14] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:51:14] INFO [mysite:146] post method
[31/Oct/2018 17:51:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:51:24] INFO [mysite:146] post method
[31/Oct/2018 17:51:39] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:56:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 18:04:35] INFO [mysite:146] post method
[31/Oct/2018 18:04:35] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:04:35] INFO [mysite:157] worked out
[31/Oct/2018 18:06:17] INFO [mysite:146] post method
[31/Oct/2018 18:06:18] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:06:18] INFO [mysite:157] worked out
[31/Oct/2018 18:07:46] INFO [mysite:146] post method
[31/Oct/2018 18:07:47] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:07:47] INFO [mysite:157] worked out
[31/Oct/2018 18:09:17] INFO [mysite:146] post method
[31/Oct/2018 18:09:18] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:09:40] INFO [mysite:146] post method
[31/Oct/2018 18:09:40] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:09:47] INFO [mysite:146] post method
[31/Oct/2018 18:09:48] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:10:12] INFO [mysite:146] post method
[31/Oct/2018 18:10:12] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:10:12] INFO [mysite:157] worked out
[31/Oct/2018 18:22:34] INFO [mysite:144] post method
[31/Oct/2018 18:22:51] INFO [mysite:145] post method
[31/Oct/2018 18:22:51] INFO [mysite:148] form is valid
[31/Oct/2018 18:22:51] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:10] INFO [mysite:145] post method
[31/Oct/2018 18:23:10] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:10] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:10] INFO [mysite:156] hi
[31/Oct/2018 18:23:10] INFO [mysite:158] worked out
[31/Oct/2018 18:23:19] INFO [mysite:145] post method
[31/Oct/2018 18:23:19] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:19] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:19] INFO [mysite:156] hi
[31/Oct/2018 18:23:19] INFO [mysite:158] worked out
[31/Oct/2018 18:23:23] INFO [mysite:145] post method
[31/Oct/2018 18:23:23] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:23] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:23] INFO [mysite:156] tehere

+ 24
- 20
requirements.txt View File

@@ -1,32 +1,36 @@
amqp==1.4.9
anyjson==0.3.3
astroid==1.6.5
altgraph==0.10.2
astroid==1.6.4
autopep8==1.3.5
billiard==3.3.0.23
celery==3.1.26.post2
croniter==0.3.25
Django==2.1.2
django-celery==3.2.2
backports-abc==0.5
backports.functools-lru-cache==1.5
bdist-mpkg==0.5.0
configparser==3.5.0
Django==1.11.15
django-classy-tags==0.8.0
django-debug-toolbar==1.10.1
django-hitcount==1.3.0
django-post-office==3.1.0
django-taggit==0.23.0
django-taggit-templatetags2==1.6.1
enum34==1.1.6
futures==3.1.1
isort==4.3.4
jsonfield==2.0.2
kombu==3.0.37
lazy-object-proxy==1.3.1
ldap3==2.5
macholib==1.5.1
mccabe==0.6.1
pyasn1==0.4.3
modulegraph==0.10.4
mysql-connector-python==8.0.12
nose==1.3.7
numpy==1.8.2
protobuf==3.6.1
py2app==0.7.3
pyasn1==0.4.4
pyasn1-modules==0.2.2
pycodestyle==2.4.0
pyldap==3.0.0.post1
pylint==1.9.2
python-dateutil==2.7.3
pylint==1.9.1
pyparsing==2.0.1
python-dateutil==1.5
python-ldap==3.1.0
pytz==2018.4
pytz==2013.7
scipy==1.1.0
singledispatch==3.4.0.3
six==1.11.0
sqlparse==0.2.4
tornado==5.1
wrapt==1.10.11

+ 4
- 0
start.sh View File

@@ -0,0 +1,4 @@
#!/bin/bash

# Start Gunicorn processes
python3 manage.py runserver

+ 11
- 0
thesisenv/bin/gunicorn View File

@@ -0,0 +1,11 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.wsgiapp import run

if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(run())

+ 11
- 0
thesisenv/bin/gunicorn_django View File

@@ -0,0 +1,11 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.djangoapp import run

if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(run())

+ 11
- 0
thesisenv/bin/gunicorn_paster View File

@@ -0,0 +1,11 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from gunicorn.app.pasterapp import run

if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(run())

+ 59
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/DESCRIPTION.rst View File

@@ -0,0 +1,59 @@
Gunicorn
--------

.. image::
https://secure.travis-ci.org/benoitc/gunicorn.png?branch=master
:alt: Build Status
:target: https://travis-ci.org/benoitc/gunicorn

Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork
worker model ported from Ruby's Unicorn_ project. The Gunicorn server is broadly
compatible with various web frameworks, simply implemented, light on server
resource usage, and fairly speedy.

Feel free to join us in `#gunicorn`_ on Freenode_.

Documentation
-------------

The documentation is hosted at http://docs.gunicorn.org.

Installation
------------

Gunicorn requires **Python 2.x >= 2.6** or **Python 3.x >= 3.2**.

Install from PyPI::

$ pip install gunicorn


Usage
-----

Basic usage::

$ gunicorn [OPTIONS] APP_MODULE

Where ``APP_MODULE`` is of the pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. The
module name can be a full dotted path. The variable name refers to a WSGI
callable that should be found in the specified module.

Example with test app::

$ cd examples
$ gunicorn --workers=2 test:app


License
-------

Gunicorn is released under the MIT License. See the LICENSE_ file for more
details.

.. _Unicorn: http://unicorn.bogomips.org/
.. _`#gunicorn`: http://webchat.freenode.net/?channels=gunicorn
.. _Freenode: http://freenode.net
.. _LICENSE: http://github.com/benoitc/gunicorn/blob/master/LICENSE



thesisenv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/INSTALLER → thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/INSTALLER View File


+ 90
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/METADATA View File

@@ -0,0 +1,90 @@
Metadata-Version: 2.0
Name: gunicorn
Version: 19.6.0
Summary: WSGI HTTP Server for UNIX
Home-page: http://gunicorn.org
Author: Benoit Chesneau
Author-email: benoitc@e-engura.com
License: MIT
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Other Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Topic :: Internet
Classifier: Topic :: Utilities
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content

Gunicorn
--------

.. image::
https://secure.travis-ci.org/benoitc/gunicorn.png?branch=master
:alt: Build Status
:target: https://travis-ci.org/benoitc/gunicorn

Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork
worker model ported from Ruby's Unicorn_ project. The Gunicorn server is broadly
compatible with various web frameworks, simply implemented, light on server
resource usage, and fairly speedy.

Feel free to join us in `#gunicorn`_ on Freenode_.

Documentation
-------------

The documentation is hosted at http://docs.gunicorn.org.

Installation
------------

Gunicorn requires **Python 2.x >= 2.6** or **Python 3.x >= 3.2**.

Install from PyPI::

$ pip install gunicorn


Usage
-----

Basic usage::

$ gunicorn [OPTIONS] APP_MODULE

Where ``APP_MODULE`` is of the pattern ``$(MODULE_NAME):$(VARIABLE_NAME)``. The
module name can be a full dotted path. The variable name refers to a WSGI
callable that should be found in the specified module.

Example with test app::

$ cd examples
$ gunicorn --workers=2 test:app


License
-------

Gunicorn is released under the MIT License. See the LICENSE_ file for more
details.

.. _Unicorn: http://unicorn.bogomips.org/
.. _`#gunicorn`: http://webchat.freenode.net/?channels=gunicorn
.. _Freenode: http://freenode.net
.. _LICENSE: http://github.com/benoitc/gunicorn/blob/master/LICENSE



+ 99
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/RECORD View File

@@ -0,0 +1,99 @@
../../../bin/gunicorn,sha256=QwZgUsXVoI-G5n_rSOnlnDW47F0cn8H6EfcHYM3Bxio,249
../../../bin/gunicorn_django,sha256=IrksqvDXDtGcoAjIGDaWlg-LS07HRWgzjUyieZBLIAY,251
../../../bin/gunicorn_paster,sha256=4Em2ld6n94yvE2d4U1GC9gdFFh0KRHKDbiLdM2a3LSQ,251
gunicorn-19.6.0.dist-info/DESCRIPTION.rst,sha256=gCCsiCS_cxp9BYBUISH3yQgOJ7Qwf1doRlU848N7V9A,1398
gunicorn-19.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
gunicorn-19.6.0.dist-info/METADATA,sha256=WLiYNVHetUjDGxLR4TJX37K32PU6hCDZUlA80r8GApE,2614
gunicorn-19.6.0.dist-info/RECORD,,
gunicorn-19.6.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110
gunicorn-19.6.0.dist-info/entry_points.txt,sha256=O4lN00p02r6nZQ_iK-fMXLjj_JK6fAWdl23_5czAK-I,231
gunicorn-19.6.0.dist-info/metadata.json,sha256=J8wtgZ1uHf39U63vZr-tBK7tivgZI45J5WaIqk2D1ZU,1737
gunicorn-19.6.0.dist-info/top_level.txt,sha256=cdMaa2yhxb8do-WioY9qRHUCfwf55YztjwQCncaInoE,9
gunicorn/__init__.py,sha256=nCZCS-r49yi9ZJS3WLqDEwHpqQIJpwloTFaDXtdeFbE,255
gunicorn/__pycache__/__init__.cpython-36.pyc,,
gunicorn/__pycache__/_compat.cpython-36.pyc,,
gunicorn/__pycache__/arbiter.cpython-36.pyc,,
gunicorn/__pycache__/argparse_compat.cpython-36.pyc,,
gunicorn/__pycache__/config.cpython-36.pyc,,
gunicorn/__pycache__/debug.cpython-36.pyc,,
gunicorn/__pycache__/errors.cpython-36.pyc,,
gunicorn/__pycache__/glogging.cpython-36.pyc,,
gunicorn/__pycache__/pidfile.cpython-36.pyc,,
gunicorn/__pycache__/reloader.cpython-36.pyc,,
gunicorn/__pycache__/selectors.cpython-36.pyc,,
gunicorn/__pycache__/six.cpython-36.pyc,,
gunicorn/__pycache__/sock.cpython-36.pyc,,
gunicorn/__pycache__/util.cpython-36.pyc,,
gunicorn/_compat.py,sha256=IgADLDObcvKcQWExjqm4XgWNULhwigfBC7u8td-xNqQ,8719
gunicorn/app/__init__.py,sha256=GuqstqdkizeV4HRbd8aGMBn0Q8IDOyRU1wMMNqNe5GY,127
gunicorn/app/__pycache__/__init__.cpython-36.pyc,,
gunicorn/app/__pycache__/base.cpython-36.pyc,,
gunicorn/app/__pycache__/django_wsgi.cpython-36.pyc,,
gunicorn/app/__pycache__/djangoapp.cpython-36.pyc,,
gunicorn/app/__pycache__/pasterapp.cpython-36.pyc,,
gunicorn/app/__pycache__/wsgiapp.cpython-36.pyc,,
gunicorn/app/base.py,sha256=PTMXTIbczObiDEcwW2yO1iwQHUCqRJuziv-2RI0uPbk,5746
gunicorn/app/django_wsgi.py,sha256=y57mCZPtg6_bZH8gXO_L5MdWs88kg__-6J8ewszmyLo,4363
gunicorn/app/djangoapp.py,sha256=r1q0BvE7P5Dp4uQpMp60cQU-H5TAM86ieNAM3WjSlWM,5026
gunicorn/app/pasterapp.py,sha256=05rRnbj_UC-vpvUoSrihe7XewtVXt7kEuHpo0ztXHW8,6124
gunicorn/app/wsgiapp.py,sha256=GXVU4rl44bKZp7ZTyRdG5A4l7h_iUtQWM1dQDFQ_JO0,2156
gunicorn/arbiter.py,sha256=8NIWHmdQ6PvNkJjBx4Y7ELdM1WQG8S3PnOLjTp0iTGs,19218
gunicorn/argparse_compat.py,sha256=gsHDGwo4BSJWHdiaEXy0Emr96NKC0LDYmK5nB7PE8Qc,87791
gunicorn/config.py,sha256=xlqyO2KbiMg2dqEkd_Z2gLIr5S9M8KkaXW7c4NibqKA,47330
gunicorn/debug.py,sha256=9z2i59LfELYi3VvbwyrIKezYrQuowVAsWfSLZI75TDI,2303
gunicorn/errors.py,sha256=CNtO7hfBdqJADoEyPGME2kTW8QcxlUWmmA1NfOEJvSQ,632
gunicorn/glogging.py,sha256=zrEWgA8czmyZSj3OefEPbAem4pooS5k57RHtZOI0rBk,14582
gunicorn/http/__init__.py,sha256=b4TF3x5F0VYOPTOeNYwRGR1EYHBaPMhZRMoNeuD5-n0,277
gunicorn/http/__pycache__/__init__.cpython-36.pyc,,
gunicorn/http/__pycache__/_sendfile.cpython-36.pyc,,
gunicorn/http/__pycache__/body.cpython-36.pyc,,
gunicorn/http/__pycache__/errors.cpython-36.pyc,,
gunicorn/http/__pycache__/message.cpython-36.pyc,,
gunicorn/http/__pycache__/parser.cpython-36.pyc,,
gunicorn/http/__pycache__/unreader.cpython-36.pyc,,
gunicorn/http/__pycache__/wsgi.cpython-36.pyc,,
gunicorn/http/_sendfile.py,sha256=lJZV7IsyJIjij9QQNlrSHIDClrcVrI1xD0vmILredwc,2256
gunicorn/http/body.py,sha256=SbFMqhFR_V1AKg1Bm0grZL5gmhJu2zf_8Xz2Kaj-mao,7355
gunicorn/http/errors.py,sha256=57KmM6CA7UldH7ZfYRSF8drsh95iI5sVoTEHoQrlcSI,2446
gunicorn/http/message.py,sha256=YyuWhQ77Ac5_fNOhyyYqO2GO1iqe7nTOzni-TEsDovg,11365
gunicorn/http/parser.py,sha256=IRMvp0veP4wL8Z4vgNV72CPydCNPdNNIy9u-DlDvvSo,1294
gunicorn/http/unreader.py,sha256=1D9E3QD8BBkCrJ4BvIDUdZngT4n7Q1H-X-GLqF19iT4,2024
gunicorn/http/wsgi.py,sha256=nJQZ2yAADyeCkGWj4QFGxxHicaF5wgOp3iqOpGKCntM,13222
gunicorn/instrument/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
gunicorn/instrument/__pycache__/__init__.cpython-36.pyc,,
gunicorn/instrument/__pycache__/statsd.cpython-36.pyc,,
gunicorn/instrument/statsd.py,sha256=Oo1vLvtYzqAwX476tX5IGa0G_5bUE_zIL0NTx_9Y0Ao,4489
gunicorn/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
gunicorn/management/__pycache__/__init__.cpython-36.pyc,,
gunicorn/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
gunicorn/management/commands/__pycache__/__init__.cpython-36.pyc,,
gunicorn/management/commands/__pycache__/run_gunicorn.cpython-36.pyc,,
gunicorn/management/commands/run_gunicorn.py,sha256=ulaIXOdJWshs4lI7uVTJ2frvRLGtSCktMmRnWRc3yGk,3638
gunicorn/pidfile.py,sha256=_SYX5zNhgpgUgws_R3VwClcqUWRSPOXl-5MDRI9rH74,2272
gunicorn/reloader.py,sha256=Z8XJ581yTqOmrPkheJav-qdsJZS9z2JdYojhocOY6Sc,1533
gunicorn/selectors.py,sha256=14_UESrpE3AQKXWKeeAUG9vBTzJ0yTYDGtEo6xOtlDY,18997
gunicorn/six.py,sha256=6N-6RCENPfBtMpN5UmgDfDKmJebbbuPu_Dk3Zf8ngww,27344
gunicorn/sock.py,sha256=OBZ7u3fNygNEUsM8M1x-bY9b1rQYcj64sjbj8pUu-eE,7124
gunicorn/util.py,sha256=GKpnIaJ_u2ZyJDDJBeHdmOp6xf0iIFDqrg4hEzyjlnA,15723
gunicorn/workers/__init__.py,sha256=Z57G1WjnZDCG52C8PgiXF4mKRKqlv81b2GHkhOJiO6A,774
gunicorn/workers/__pycache__/__init__.cpython-36.pyc,,
gunicorn/workers/__pycache__/_gaiohttp.cpython-36.pyc,,
gunicorn/workers/__pycache__/async.cpython-36.pyc,,
gunicorn/workers/__pycache__/base.cpython-36.pyc,,
gunicorn/workers/__pycache__/gaiohttp.cpython-36.pyc,,
gunicorn/workers/__pycache__/geventlet.cpython-36.pyc,,
gunicorn/workers/__pycache__/ggevent.cpython-36.pyc,,
gunicorn/workers/__pycache__/gthread.cpython-36.pyc,,
gunicorn/workers/__pycache__/gtornado.cpython-36.pyc,,
gunicorn/workers/__pycache__/sync.cpython-36.pyc,,
gunicorn/workers/__pycache__/workertmp.cpython-36.pyc,,
gunicorn/workers/_gaiohttp.py,sha256=CFKiyLNqWqemhDvDovb-JqMRTMNz50gZUwwOpIjrpHw,5071
gunicorn/workers/async.py,sha256=i5JrhOBmXREcoVNJaCXmSKHzYSUeWomsNwmGxlEFHzE,5397
gunicorn/workers/base.py,sha256=FuFHTWOjLBdzel08h39ymFhy1EuGbse1lDUD4HX2gRI,8643
gunicorn/workers/gaiohttp.py,sha256=GIkR9AnyaZ8b1Pt7It35iIK6EPwe2JSUgt55u7nw9qo,500
gunicorn/workers/geventlet.py,sha256=zX5q8vyHCJ2JZ4imlsMHidoMlvK67jl5x-2eD6-VRlQ,3796
gunicorn/workers/ggevent.py,sha256=we70lCiiyHwaW75kqM40KOsX7FKyZiRvjT2EPROKt5c,6838
gunicorn/workers/gthread.py,sha256=YCtzA8SdWY6jeJs-8MTqpes4V-9kxy4D1TJNQ-CxafI,12077
gunicorn/workers/gtornado.py,sha256=kGNYyqwZMpItoLjM_-6wTWGUtThchSNpz9MszqrwlBU,4372
gunicorn/workers/sync.py,sha256=_vd1JATNLG4MgJppNJG5KWBIzLGYqRzhEAQVz9H11LI,7153
gunicorn/workers/workertmp.py,sha256=6QINPBrriLvezgkC_hclOOeXLi_owMt_SOA5KPEIN-A,1459

+ 6
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/WHEEL View File

@@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.24.0)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any


+ 9
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/entry_points.txt View File

@@ -0,0 +1,9 @@

[console_scripts]
gunicorn=gunicorn.app.wsgiapp:run
gunicorn_django=gunicorn.app.djangoapp:run
gunicorn_paster=gunicorn.app.pasterapp:run

[paste.server_runner]
main=gunicorn.app.pasterapp:paste_server

+ 1
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/metadata.json View File

@@ -0,0 +1 @@
{"extensions": {"python.exports": {"console_scripts": {"gunicorn_django": "gunicorn.app.djangoapp:run", "gunicorn_paster": "gunicorn.app.pasterapp:run", "gunicorn": "gunicorn.app.wsgiapp:run"}, "paste.server_runner": {"main": "gunicorn.app.pasterapp:paste_server"}}, "python.details": {"contacts": [{"email": "benoitc@e-engura.com", "role": "author", "name": "Benoit Chesneau"}], "project_urls": {"Home": "http://gunicorn.org"}, "document_names": {"description": "DESCRIPTION.rst"}}, "python.commands": {"wrap_console": {"gunicorn_django": "gunicorn.app.djangoapp:run", "gunicorn_paster": "gunicorn.app.pasterapp:run", "gunicorn": "gunicorn.app.wsgiapp:run"}}}, "license": "MIT", "classifiers": ["Development Status :: 4 - Beta", "Environment :: Other Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Internet", "Topic :: Utilities", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Internet :: WWW/HTTP :: WSGI :: Server", "Topic :: Internet :: WWW/HTTP :: Dynamic Content"], "name": "gunicorn", "generator": "bdist_wheel (0.24.0)", "version": "19.6.0", "metadata_version": "2.0", "summary": "WSGI HTTP Server for UNIX", "test_requires": [{"requires": ["pytest (==2.8.3)", "pytest-cov (==1.7.0)"]}]}

+ 1
- 0
thesisenv/lib/python3.6/site-packages/gunicorn-19.6.0.dist-info/top_level.txt View File

@@ -0,0 +1 @@
gunicorn

+ 8
- 0
thesisenv/lib/python3.6/site-packages/gunicorn/__init__.py View File

@@ -0,0 +1,8 @@
# -*- coding: utf-8 -
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

version_info = (19, 6, 0)
__version__ = ".".join([str(v) for v in version_info])
SERVER_SOFTWARE = "gunicorn/%s" % __version__

+ 264
- 0
thesisenv/lib/python3.6/site-packages/gunicorn/_compat.py View File

@@ -0,0 +1,264 @@
import sys

from gunicorn import six

PY26 = (sys.version_info[:2] == (2, 6))
PY33 = (sys.version_info >= (3, 3))


def _check_if_pyc(fname):
"""Return True if the extension is .pyc, False if .py
and None if otherwise"""
from imp import find_module
from os.path import realpath, dirname, basename, splitext

# Normalize the file-path for the find_module()
filepath = realpath(fname)
dirpath = dirname(filepath)
module_name = splitext(basename(filepath))[0]

# Validate and fetch
try:
fileobj, fullpath, (_, _, pytype) = find_module(module_name, [dirpath])
except ImportError:
raise IOError("Cannot find config file. "
"Path maybe incorrect! : {0}".format(filepath))
return pytype, fileobj, fullpath


def _get_codeobj(pyfile):
""" Returns the code object, given a python file """
from imp import PY_COMPILED, PY_SOURCE

result, fileobj, fullpath = _check_if_pyc(pyfile)

# WARNING:
# fp.read() can blowup if the module is extremely large file.
# Lookout for overflow errors.
try:
data = fileobj.read()
finally:
fileobj.close()

# This is a .pyc file. Treat accordingly.
if result is PY_COMPILED:
# .pyc format is as follows:
# 0 - 4 bytes: Magic number, which changes with each create of .pyc file.
# First 2 bytes change with each marshal of .pyc file. Last 2 bytes is "\r\n".
# 4 - 8 bytes: Datetime value, when the .py was last changed.
# 8 - EOF: Marshalled code object data.
# So to get code object, just read the 8th byte onwards till EOF, and
# UN-marshal it.
import marshal
code_obj = marshal.loads(data[8:])

elif result is PY_SOURCE:
# This is a .py file.
code_obj = compile(data, fullpath, 'exec')

else:
# Unsupported extension
raise Exception("Input file is unknown format: {0}".format(fullpath))

# Return code object
return code_obj

if six.PY3:
def execfile_(fname, *args):
if fname.endswith(".pyc"):
code = _get_codeobj(fname)
else:
code = compile(open(fname, 'rb').read(), fname, 'exec')
return six.exec_(code, *args)

def bytes_to_str(b):
if isinstance(b, six.text_type):
return b
return str(b, 'latin1')

import urllib.parse

def unquote_to_wsgi_str(string):
return _unquote_to_bytes(string).decode('latin-1')

_unquote_to_bytes = urllib.parse.unquote_to_bytes

else:
def execfile_(fname, *args):
""" Overriding PY2 execfile() implementation to support .pyc files """
if fname.endswith(".pyc"):
return six.exec_(_get_codeobj(fname), *args)
return execfile(fname, *args)

def bytes_to_str(s):
if isinstance(s, unicode):
return s.encode('utf-8')
return s

import urllib
unquote_to_wsgi_str = urllib.unquote


# The following code adapted from trollius.py33_exceptions
def _wrap_error(exc, mapping, key):
if key not in mapping:
return
new_err_cls = mapping[key]
new_err = new_err_cls(*exc.args)

# raise a new exception with the original traceback
six.reraise(new_err_cls, new_err,
exc.__traceback__ if hasattr(exc, '__traceback__') else sys.exc_info()[2])

if PY33:
import builtins

BlockingIOError = builtins.BlockingIOError
BrokenPipeError = builtins.BrokenPipeError
ChildProcessError = builtins.ChildProcessError
ConnectionRefusedError = builtins.ConnectionRefusedError
ConnectionResetError = builtins.ConnectionResetError
InterruptedError = builtins.InterruptedError
ConnectionAbortedError = builtins.ConnectionAbortedError
PermissionError = builtins.PermissionError
FileNotFoundError = builtins.FileNotFoundError
ProcessLookupError = builtins.ProcessLookupError

def wrap_error(func, *args, **kw):
return func(*args, **kw)
else:
import errno
import select
import socket

class BlockingIOError(OSError):
pass

class BrokenPipeError(OSError):
pass

class ChildProcessError(OSError):
pass

class ConnectionRefusedError(OSError):
pass

class InterruptedError(OSError):
pass

class ConnectionResetError(OSError):
pass

class ConnectionAbortedError(OSError):
pass

class PermissionError(OSError):
pass

class FileNotFoundError(OSError):
pass

class ProcessLookupError(OSError):
pass

_MAP_ERRNO = {
errno.EACCES: PermissionError,
errno.EAGAIN: BlockingIOError,
errno.EALREADY: BlockingIOError,
errno.ECHILD: ChildProcessError,
errno.ECONNABORTED: ConnectionAbortedError,
errno.ECONNREFUSED: ConnectionRefusedError,
errno.ECONNRESET: ConnectionResetError,
errno.EINPROGRESS: BlockingIOError,
errno.EINTR: InterruptedError,
errno.ENOENT: FileNotFoundError,
errno.EPERM: PermissionError,
errno.EPIPE: BrokenPipeError,
errno.ESHUTDOWN: BrokenPipeError,
errno.EWOULDBLOCK: BlockingIOError,
errno.ESRCH: ProcessLookupError,
}

def wrap_error(func, *args, **kw):
"""
Wrap socket.error, IOError, OSError, select.error to raise new specialized
exceptions of Python 3.3 like InterruptedError (PEP 3151).
"""