Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a54647577 | ||
|
|
b2798a6630 | ||
|
|
61a87a7461 | ||
|
|
d098531700 | ||
|
|
faaa66aa8e | ||
|
|
db60f32c07 | ||
|
|
25b0385a87 | ||
|
|
97b1b47d6d | ||
|
|
86061ae781 | ||
|
|
986847837b | ||
|
|
65a4227435 | ||
|
|
c928ab63cd | ||
|
|
ea30b13c12 | ||
|
|
1816bb8386 | ||
|
|
4a324f52c7 | ||
|
|
8a3f8a56e5 | ||
|
|
f5afb1e012 | ||
|
|
18f48df6a1 | ||
|
|
94573dc28b | ||
|
|
b03b106fd8 |
No files matched your search
@@ -1,4 +1,5 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
||||
from django.contrib.auth.models import User
|
||||
@@ -6,19 +7,22 @@ from django.contrib.auth.models import User
|
||||
from .models import Post, CustomUser
|
||||
|
||||
|
||||
|
||||
#external code customised
|
||||
#import from https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model
|
||||
#start ---
|
||||
class CustomUserInline(admin.StackedInline):
|
||||
model = CustomUser
|
||||
can_delete = False
|
||||
verbose_name_plural = 'customUsers'
|
||||
|
||||
|
||||
# Define a new User admin
|
||||
class UserAdmin(BaseUserAdmin):
|
||||
inlines = (CustomUserInline, )
|
||||
|
||||
|
||||
# Re-register UserAdmin
|
||||
admin.site.unregister(User)
|
||||
admin.site.register(User, UserAdmin)
|
||||
|
||||
admin.site.register(Post)
|
||||
|
||||
#end ---
|
||||
@@ -3,15 +3,22 @@ from datetime import datetime
|
||||
|
||||
from .models import Post, CustomUser
|
||||
from django.forms import ModelForm, ValidationError
|
||||
|
||||
from taggit.forms import *
|
||||
|
||||
|
||||
#extended code customised
|
||||
#import from https://tutorial.djangogirls.org/en/django_forms/
|
||||
class PostForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = Post
|
||||
fields = ('title', 'text', 'published_date','tags')
|
||||
|
||||
|
||||
class NewTagForm(forms.ModelForm):
|
||||
tags = TagField()
|
||||
|
||||
class Meta:
|
||||
model = CustomUser
|
||||
fields = ['tags']
|
||||
@@ -1,24 +1,29 @@
|
||||
from django.db import models
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils import timezone
|
||||
|
||||
from taggit.managers import TaggableManager
|
||||
from datetime import datetime
|
||||
from croniter import croniter
|
||||
|
||||
|
||||
|
||||
#external code customised
|
||||
#import from https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model
|
||||
class CustomUser(models.Model):
|
||||
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
|
||||
#add tags to User Model with possibility to leave empty
|
||||
tags = TaggableManager(blank=True)
|
||||
|
||||
|
||||
#external code customised
|
||||
#import from https://tutorial.djangogirls.org/en/django_models/
|
||||
class Post(models.Model):
|
||||
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
||||
title = models.CharField(max_length=200)
|
||||
text = models.TextField()
|
||||
created_date = models.DateTimeField(
|
||||
default=timezone.now)
|
||||
published_date = models.DateTimeField(
|
||||
blank=True, null=True)
|
||||
created_date = models.DateTimeField(default=timezone.now)
|
||||
published_date = models.DateTimeField(blank=True, null=True)
|
||||
#add tags to Post Model
|
||||
tags = TaggableManager()
|
||||
|
||||
def publish(self):
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<a class="nav-link" href="{% url 'tag_list' %}">Dashboard</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
|
||||
<a class="nav-link" href="{% url 'search_add' %}">Suche</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus">+</span></a>
|
||||
@@ -52,7 +52,7 @@
|
||||
<a class="nav-link" href="{% url 'tag_list' %}">Dashboard</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
|
||||
<a class="nav-link" href="{% url 'search_add' %}">Suche</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus">+</span></a>
|
||||
@@ -60,12 +60,12 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'post_draft_list' %}" class="top-menu"><span class="glyphicon glyphicon-edit">Entwürfe</span></a>
|
||||
</li>
|
||||
{% else %}
|
||||
{% elif user.is_authenticated %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'tag_list' %}">{{user.get_username}}'s Dashboard</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
|
||||
<a class="nav-link" href="{% url 'search_add' %}">Suche</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
@@ -112,9 +112,10 @@
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="content container">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="col-md-12">
|
||||
{% block content %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -125,5 +126,4 @@
|
||||
<script src="{% static 'js/app.js' %}"></script>
|
||||
<script src="{% static 'bootstrap/js/bootstrap.bundle.js' %}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,14 +1,24 @@
|
||||
<!--
|
||||
marked parts of the template is external code
|
||||
import from https://tutorial.djangogirls.org/en/template_extending/
|
||||
-->
|
||||
{% extends 'base.html' %}{% block content %}
|
||||
{% load hitcount_tags %}
|
||||
<div class="post">
|
||||
<div class="col-md-8">
|
||||
|
||||
<!-- imported start -->
|
||||
<div class="post">
|
||||
{% if post.published_date %}
|
||||
<div class="date">
|
||||
{{ post.published_date }}
|
||||
</div>
|
||||
{% else %}
|
||||
<a class="btn btn-outline-dark" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
|
||||
<!-- imported end -->
|
||||
|
||||
{% endif %} {% if user.is_staff and user == post.author %}
|
||||
|
||||
<!-- imported start -->
|
||||
<a class="btn btn-outline-dark" href="{% url 'post_edit' pk=post.pk %}">
|
||||
<span class="glyphicon glyphicon-pencil">Bearbeiten</span>
|
||||
</a>
|
||||
@@ -18,20 +28,17 @@
|
||||
{% endif %}
|
||||
<h1>{{ post.title }}</h1>
|
||||
<p>{{ post.text|linebreaksbr }}</p>
|
||||
<p>
|
||||
Tags:
|
||||
{% for tag in post.tags.all %}
|
||||
<a href="{% url 'blog_search_list_view' %}">{{ tag.name }} </a>
|
||||
{% if not forloop.last %}, {% endif %}
|
||||
{% endfor %}
|
||||
</p>
|
||||
<p>
|
||||
Autor: {{ post.author }}
|
||||
</p>
|
||||
<!-- imported end -->
|
||||
Tags: {% for tag in post.tags.all %}
|
||||
<a href="{% url 'post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
|
||||
{% if not forloop.last %}, {% endif %} {% endfor %} <p>
|
||||
{{ post.author }}
|
||||
{% if user.is_staff %}
|
||||
<p>
|
||||
{% get_hit_count for post %} Benutzer haben diesen Post bereits gelesen!
|
||||
</p>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,11 +1,20 @@
|
||||
<!--
|
||||
external code
|
||||
import from https://tutorial.djangogirls.org/en/template_extending/
|
||||
-->
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<h1> Unveröffentliche Artikel<br>
|
||||
</h1>
|
||||
{% for post in posts %}
|
||||
<div class="post">
|
||||
<div class="post mt-5">
|
||||
<p class="date">created: {{ post.created_date|date:'d-m-Y' }}</p>
|
||||
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
|
||||
<p>{{ post.text|truncatechars:200 }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
@@ -1,9 +1,16 @@
|
||||
<!--
|
||||
external code
|
||||
import from https://tutorial.djangogirls.org/en/template_extending/
|
||||
-->
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="mx-auto">
|
||||
<h1>Artikel-Editor</h1>
|
||||
<form method="POST" class="post-form">{% csrf_token %}
|
||||
<form method="POST" class="mt-5 post-form">{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="save btn btn-outline-dark">Sichern</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,27 +1,50 @@
|
||||
<!--
|
||||
marked parts of the template is external code
|
||||
import from https://tutorial.djangogirls.org/en/template_extending/
|
||||
-->
|
||||
{% extends 'base.html' %} {% block content %}
|
||||
{% if tag %} Posts tagged with "{{ tag.name }}" {% endif %}
|
||||
<div class="row">
|
||||
{% if tag %} <div class="mx-auto">
|
||||
<h2> Artikel mit dem Tag "{{ tag.name }}" </h2>
|
||||
</div>{% endif %}
|
||||
</div>
|
||||
<!-- imported start -->
|
||||
<div class="row">
|
||||
<div class="mx-auto">
|
||||
<h1> Artikleübersicht </h1>
|
||||
</div>
|
||||
</div>
|
||||
<!-- imported end -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
{% if messages %}
|
||||
<div class="messages">
|
||||
{% for message in messages %}
|
||||
<p {% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<!-- imported start -->
|
||||
{% endif %}
|
||||
{% for post in posts %}
|
||||
<div class="post">
|
||||
{% for post in posts %}
|
||||
<div class="mt-5 post">
|
||||
<div class="date">
|
||||
{{ post.published_date }}
|
||||
</div>
|
||||
<h1>
|
||||
<h2>
|
||||
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a>
|
||||
</h1>
|
||||
</h2>
|
||||
<p>{{ post.text|linebreaks }}</p>
|
||||
<!-- imported end -->
|
||||
|
||||
Tags: {% for tag in post.tags.all %}
|
||||
<a href="{% url 'post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
|
||||
{% if not forloop.last %}, {% endif %} {% endfor %} <p>
|
||||
{{ post.author }}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -28,5 +28,28 @@
|
||||
<input type="hidden" name="next" value="{{ next }}" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div>
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div>
|
||||
{% for post in posts %}
|
||||
<div class="mt-5 post">
|
||||
<div class="date">
|
||||
{{ post.published_date }}
|
||||
</div>
|
||||
<h2>
|
||||
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a>
|
||||
</h2>
|
||||
<p>{{ post.text|linebreaks }}</p>
|
||||
Tags: {% for tag in post.tags.all %}
|
||||
<a href="{% url 'post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
|
||||
{% if not forloop.last %}, {% endif %} {% endfor %} <p>
|
||||
{{ post.author }}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,16 +1,24 @@
|
||||
<!--
|
||||
marked parts of the template is external code
|
||||
import from https://github.com/fizista/django-taggit-templatetags2
|
||||
-->
|
||||
{% extends "base.html" %} {% block content %}
|
||||
|
||||
<!-- imported start -->
|
||||
{% load taggit_templatetags2_tags %}
|
||||
<div class="container-fluid">
|
||||
<div class="modal-body row">
|
||||
<div class="col-md-8">
|
||||
<p> Alle Tags im Überblick<br>
|
||||
</p>
|
||||
<div class="col-md-5">
|
||||
<div style="border:solid; text-align:center;padding:5px;">
|
||||
<div class="container">
|
||||
<div class="row equal">
|
||||
<div class="col-md-6">
|
||||
<h1> Alle Tags im Überblick<br>
|
||||
</h1>
|
||||
<div class="col-md-8" style="zoom: 1.6">
|
||||
<div style="text-align:center;padding:5px;">
|
||||
{% get_tagcloud as tags for 'application' %}
|
||||
{% include_tagcloud 'application.Post' %}
|
||||
</div>
|
||||
</div>
|
||||
<!-- imported end -->
|
||||
|
||||
<div style="padding-bottom:40px;">
|
||||
</div>
|
||||
Tag-Suche
|
||||
@@ -24,7 +32,7 @@
|
||||
</button>
|
||||
</span>
|
||||
</form>
|
||||
<div>
|
||||
<div class="pt-4">
|
||||
{% for post in posts %}
|
||||
<div class="post">
|
||||
<div class="date">
|
||||
@@ -44,23 +52,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<p> Bereits abonnierten Tags
|
||||
</p>
|
||||
<div class="col-md-6">
|
||||
<h1> Bereits abonnierten Tags
|
||||
</h1>
|
||||
<div class="col-md-10">
|
||||
{% if tags %}
|
||||
<div style="border:solid; text-align:center;padding:5px;">
|
||||
<div style="text-align:center;padding-top:40px;">
|
||||
{% for tag in tagsuser %}
|
||||
{{ tag.name }}
|
||||
{% if not forloop.last %}, {% endif %}
|
||||
<a class="text-white bg-dark p-3" href="{% url 'post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div style="padding-bottom:40px;">
|
||||
<div style="padding-bottom:145px;">
|
||||
</div>
|
||||
<div class="mx-auto">
|
||||
<div>
|
||||
Abonniere deine Tags hier!
|
||||
</div>
|
||||
<form class="post-form" method="post">
|
||||
{% csrf_token %} {{form.as_p}}
|
||||
<button type="submit" class="save btn btn-outline-dark">Sichern</button>
|
||||
@@ -72,5 +81,6 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,14 +0,0 @@
|
||||
{% extends "base.html" %} {% block content %} {% load taggit_templatetags2_tags %}
|
||||
{% get_taglist as tags for 'application.post'%}
|
||||
|
||||
<div>
|
||||
<form class="post-form" method="post">
|
||||
{% csrf_token %} {{form.as_p}}
|
||||
<button type="submit" class="save btn btn-outline-dark">Save</button>
|
||||
</form>
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div {% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -1,21 +1,31 @@
|
||||
<!--
|
||||
marked parts of the template is external code
|
||||
import from https://tutorial.djangogirls.org/en/template_extending/
|
||||
-->
|
||||
{% extends "base.html" %} {% block content %}
|
||||
{% load taggit_templatetags2_tags %}
|
||||
|
||||
<div>
|
||||
<div class="row">
|
||||
<div class="mx-auto">
|
||||
<h1>
|
||||
Dein Newsfeed ...
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
<a id="search_submit" href="/posts" class="save btn btn-outline-dark">alle Artikel
|
||||
</a>
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div>
|
||||
|
||||
<!-- imported start -->
|
||||
{% for post in posts %}
|
||||
<div class="post">
|
||||
<div class="mt-5 post">
|
||||
<div class="date">
|
||||
{{ post.published_date }}
|
||||
</div>
|
||||
<h1>
|
||||
<h2>
|
||||
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a>
|
||||
</h1>
|
||||
</h2>
|
||||
<!-- imported end -->
|
||||
|
||||
<p>{{ post.text|linebreaks }}</p>
|
||||
Tags: {% for tag in post.tags.all %}
|
||||
<a href="{% url 'post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
|
||||
@@ -24,5 +34,13 @@
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5 col-md-4">
|
||||
<div class="float-right">
|
||||
<a id="search_submit" href="/posts" class="save btn btn-outline-dark">alle Artikel
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,20 +0,0 @@
|
||||
{% extends 'base.html' %} {% block content %}
|
||||
{% if tag %} Posts tagged with "{{ tag.name }}" {% endif %}
|
||||
{% for post in posts %}
|
||||
<div class="post">
|
||||
<div class="date">
|
||||
{{ post.published_date }}
|
||||
</div>
|
||||
<h1>
|
||||
<a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a>
|
||||
</h1>
|
||||
<p>{{ post.text|linebreaks }}</p>
|
||||
Tags: {% for tag in post.tags.all %}
|
||||
<a href="{% url 'student_page_remove' tag.slug %}">{{ tag.name }}</a>
|
||||
{% if not forloop.last %}, {% endif %} {% endfor %} <p>
|
||||
{{ post.author }}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -2,17 +2,18 @@ from django.conf import settings
|
||||
from django.conf.urls import url
|
||||
from django.conf.urls import include
|
||||
from django.urls import path
|
||||
from taggit_templatetags2 import urls as taggit_templatetags2_urls
|
||||
from . import views
|
||||
import debug_toolbar
|
||||
|
||||
from . import views
|
||||
|
||||
from taggit_templatetags2 import urls as taggit_templatetags2_urls
|
||||
import debug_toolbar
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.tag_list, name='tag_list'),
|
||||
url(r'^tag/(?P<slug>[-\w]+)/$', views.post_list, name='post_list_by_tag'),
|
||||
url(r'^posts/$', views.post_list, name='post_list'),
|
||||
url(r'^search/', views.blog_search_list_view, name='blog_search_list_view'),
|
||||
url(r'^search/result/$', views.blog_search_list_view, name='post_list_by_search'),
|
||||
url(r'^search/', views.search_add, name='search_add'),
|
||||
url(r'^search/result/$', views.search_add, name='post_list_by_search'),
|
||||
url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
|
||||
url(r'^post/new/$', views.post_new, name='post_new'),
|
||||
url(r'^post/(?P<pk>\d+)/edit/$', views.post_edit, name='post_edit'),
|
||||
@@ -22,10 +23,8 @@ urlpatterns = [
|
||||
url(r'^tags/', include('taggit_templatetags2.urls')),
|
||||
]
|
||||
|
||||
"""
|
||||
url(r'^student/(?P<slug>[-\w]+)/remove/$', views.tag_remove, name='tag_remove'),
|
||||
"""
|
||||
|
||||
#external code
|
||||
#import from https://django-debug-toolbar.readthedocs.io/en/latest/installation.html
|
||||
if settings.DEBUG:
|
||||
import debug_toolbar
|
||||
urlpatterns += [
|
||||
|
||||
@@ -1,28 +1,21 @@
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django.utils import timezone
|
||||
from .models import Post, CustomUser
|
||||
from taggit.models import Tag
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
from .forms import PostForm, NewTagForm
|
||||
from django.shortcuts import redirect
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
import sys
|
||||
import collections
|
||||
from taggit_templatetags2.views import TagCanvasListView
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib import messages
|
||||
from post_office.models import EmailTemplate
|
||||
from post_office import mail
|
||||
|
||||
from hitcount.models import HitCount
|
||||
from hitcount.views import HitCountMixin
|
||||
|
||||
|
||||
import logging
|
||||
import mysite.settings
|
||||
import operator
|
||||
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import redirect
|
||||
from django.utils import timezone
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from .models import Post, CustomUser
|
||||
from taggit.models import Tag
|
||||
from .forms import PostForm, NewTagForm
|
||||
from django.contrib import messages
|
||||
from post_office import mail
|
||||
from hitcount.models import HitCount
|
||||
from hitcount.views import HitCountMixin
|
||||
|
||||
|
||||
def navlogin(request):
|
||||
@@ -47,7 +40,9 @@ def navlogin(request):
|
||||
context = {'error': error}
|
||||
return render(request, 'index.html', context)
|
||||
|
||||
|
||||
#external code customised
|
||||
#import from https://tutorial.djangogirls.org/en/django_forms/
|
||||
#start ---
|
||||
@login_required
|
||||
def post_list(request, slug=None):
|
||||
log = logging.getLogger('mysite')
|
||||
@@ -55,7 +50,6 @@ def post_list(request, slug=None):
|
||||
if slug:
|
||||
tag = get_object_or_404(Tag, slug=slug)
|
||||
posts = posts.filter(tags__in=[tag])
|
||||
log.info(posts)
|
||||
return render(request, 'post_list.html', locals())
|
||||
|
||||
|
||||
@@ -123,57 +117,41 @@ def post_remove(request, pk):
|
||||
messages.info(request, 'Der Artikel "' + post.title + '" wurde gelöscht')
|
||||
post.delete()
|
||||
return redirect('post_list')
|
||||
|
||||
|
||||
""" @login_required
|
||||
def tag_remove(request, slug=None):
|
||||
log = logging.getLogger('mysite')
|
||||
user_instance = get_object_or_404(CustomUser, user=request.user)
|
||||
tag = Tag.get_object_or_404(Tag, slug = slug)
|
||||
log.info(tag)
|
||||
if slug:
|
||||
user_instance.tags.remove(tag)
|
||||
save_m2m()
|
||||
return redirect('student_page') """
|
||||
#end ---
|
||||
|
||||
@login_required
|
||||
def tag_list(request):
|
||||
log = logging.getLogger('mysite')
|
||||
u = User.objects.get(username=request.user)
|
||||
posts = Post.objects.none()
|
||||
if u:
|
||||
tags_user = Tag.objects.filter(customuser__user = u)
|
||||
log.info(tags_user)
|
||||
for tag in tags_user:
|
||||
posts = Post.objects.filter(tags__in=[tag]).order_by('-published_date')
|
||||
query = Post.objects.filter(tags__in=[tag]).order_by('-published_date')
|
||||
posts = list(set(posts)|set(query))
|
||||
log.info(posts)
|
||||
return render(request, 'tag_list.html', locals())
|
||||
return render(request, 'tag_list.html', {'posts': posts})
|
||||
|
||||
def blog_search_list_view(request):
|
||||
log = logging.getLogger('mysite')
|
||||
@login_required
|
||||
def search_add(request):
|
||||
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
|
||||
if request.method == 'GET':
|
||||
search_query = request.GET.get('search_box', None)
|
||||
log.info(search_query)
|
||||
posts = posts.filter(tags__name__in=[search_query])
|
||||
log = logging.getLogger('mysite')
|
||||
u = User.objects.get(username=request.user)
|
||||
if u:
|
||||
tagsuser = Tag.objects.filter(customuser__user = u)
|
||||
user_instance = get_object_or_404(CustomUser, user=request.user)
|
||||
if request.method == "POST":
|
||||
log.info('post method')
|
||||
form = NewTagForm(request.POST, instance=user_instance)
|
||||
if form.is_valid():
|
||||
log.info('form is valid')
|
||||
obj = form.save(commit=False)
|
||||
obj.user = request.user
|
||||
tag_names = [tag.name for tag in Tag.objects.all()]
|
||||
log.info(tag_names)
|
||||
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:
|
||||
log.info('worked out')
|
||||
obj.tags.add(m_tags)
|
||||
obj.save()
|
||||
messages.info(request, 'Der Tag "' + m_tags + '" wurde gespeichert')
|
||||
@@ -182,10 +160,14 @@ def blog_search_list_view(request):
|
||||
messages.info(request, 'Sorry !! Den Tag den du suchst gibt es leider nicht!')
|
||||
else:
|
||||
form = NewTagForm()
|
||||
return render(request, 'blog_search_list_view.html', locals())
|
||||
return render(request, 'search_add.html', locals())
|
||||
|
||||
|
||||
#external code customised
|
||||
#import from https://github.com/ui/django-post_office
|
||||
mail.send(
|
||||
'kleinhenz.e@gmail.com', # List of email addresses also accepted
|
||||
# List of email addresses also accepted
|
||||
'kleinhenz.e@gmail.com',
|
||||
'esther.kleinhenz@web.de',
|
||||
subject='My email',
|
||||
message='Hi there!',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{Abstract}{ii}{figure.caption.1}}
|
||||
\@writefile{toc}{\contentsline {chapter}{Abstract}{ii}{Doc-Start}}
|
||||
\@setckpt{abstract/abstract}{
|
||||
\setcounter{page}{3}
|
||||
\setcounter{equation}{0}
|
||||
@@ -20,6 +20,10 @@
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -27,11 +31,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{1}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\providecommand*\new@tpo@label[2]{}
|
||||
\catcode `"\active
|
||||
\AC@reset@newl@bel
|
||||
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
|
||||
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
|
||||
\global\let\oldcontentsline\contentsline
|
||||
@@ -18,6 +17,7 @@
|
||||
\global\let\hyper@last\relax
|
||||
\gdef\HyperFirstAtBeginDocument#1{#1}
|
||||
\providecommand*\HyPL@Entry[1]{}
|
||||
\AC@reset@newl@bel
|
||||
\@input{titlepage/titlepage.aux}
|
||||
\HyPL@Entry{0<</S/D>>}
|
||||
\babel@aux{german}{}
|
||||
@@ -25,7 +25,7 @@
|
||||
\HyPL@Entry{1<</S/r>>}
|
||||
\@input{abstract/abstract.aux}
|
||||
\HyPL@Entry{5<</S/D>>}
|
||||
\@writefile{toc}{\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.4}}
|
||||
\@writefile{toc}{\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.3}}
|
||||
\@input{chapters/einleitung.aux}
|
||||
\@input{chapters/framework.aux}
|
||||
\@input{chapters/prototyp.aux}
|
||||
@@ -37,24 +37,25 @@
|
||||
\bibdata{references/References_2}
|
||||
\bibcite{Bootstrap}{{BA11}{}{{}}{{}}}
|
||||
\bibcite{Computer}{{Com18}{}{{}}{{}}}
|
||||
\bibcite{Oracle}{{Coo10}{}{{}}{{}}}
|
||||
\bibcite{Dixit}{{Dix18}{}{{}}{{}}}
|
||||
\bibcite{Djangogirls}{{Dja18}{}{{}}{{}}}
|
||||
\bibcite{Djangogirls}{{Dja18a}{}{{}}{{}}}
|
||||
\bibcite{Djangogirls-2}{{Dja18b}{}{{}}{{}}}
|
||||
\bibcite{Moodle}{{Dok15}{}{{}}{{}}}
|
||||
\bibcite{Moodle-2}{{Dok18}{}{{}}{{}}}
|
||||
\bibcite{Fiok}{{Fio14}{}{{}}{{}}}
|
||||
\bibcite{Schlede}{{FMS17}{}{{}}{{}}}
|
||||
\bibcite{Django-4}{{Fou18a}{}{{}}{{}}}
|
||||
\bibcite{Django}{{Fou18b}{}{{}}{{}}}
|
||||
\bibcite{Django-2}{{Fou18c}{}{{}}{{}}}
|
||||
\bibcite{Django-3}{{Fou18d}{}{{}}{{}}}
|
||||
\@writefile{toc}{\contentsline {chapter}{Referenzen}{26}{chapter*.16}}
|
||||
\bibcite{Python}{{Fou18e}{}{{}}{{}}}
|
||||
\@writefile{toc}{\contentsline {chapter}{Referenzen}{33}{chapter*.24}}
|
||||
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}}
|
||||
\bibcite{Sario}{{Gmb18}{}{{}}{{}}}
|
||||
\bibcite{Hellmuth}{{Hel12}{}{{}}{{}}}
|
||||
\bibcite{Herzog}{{Her16}{}{{}}{{}}}
|
||||
\bibcite{King}{{Kin17}{}{{}}{{}}}
|
||||
\bibcite{Leipner}{{Lei13}{}{{}}{{}}}
|
||||
\bibcite{Microsoft}{{Mic18}{}{{}}{{}}}
|
||||
\bibcite{Ndukwe}{{Ndu17}{}{{}}{{}}}
|
||||
\bibcite{Nevius}{{Nev15}{}{{}}{{}}}
|
||||
\bibcite{Ong}{{Ong18}{}{{}}{{}}}
|
||||
\bibcite{Otto}{{Ott11}{}{{}}{{}}}
|
||||
\bibcite{Otto-2}{{Ott12}{}{{}}{{}}}
|
||||
|
||||
@@ -12,25 +12,30 @@ The Computer~Language Company.
|
||||
\newblock 2018.
|
||||
\newblock https://www.pcmag.com/encyclopedia/term/58231/user-permissions.
|
||||
|
||||
\bibitem[Coo10]{Oracle}
|
||||
Oracle Cooperation.
|
||||
\newblock About ldap.
|
||||
\newblock 2010.
|
||||
\newblock https://docs.oracle.com/cd/E19182-01/820-6573/6nht2e5a4/index.html.
|
||||
|
||||
\bibitem[Dix18]{Dixit}
|
||||
Chitrank Dixit.
|
||||
\newblock Pep-8 tutorial: Code standards in python.
|
||||
\newblock 2018.
|
||||
\newblock
|
||||
https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code.
|
||||
|
||||
\bibitem[Dja18]{Djangogirls}
|
||||
\bibitem[Dja18a]{Djangogirls}
|
||||
Djangogirls.
|
||||
\newblock Creating a blog post model.
|
||||
\newblock 2018.
|
||||
\newblock https://tutorial.djangogirls.org/en/django\_models/.
|
||||
|
||||
\bibitem[Dja18b]{Djangogirls-2}
|
||||
Djangogirls.
|
||||
\newblock We inspire women to fall in love with programming.
|
||||
\newblock 2018.
|
||||
\newblock https://djangogirls.org/.
|
||||
|
||||
\bibitem[Dok15]{Moodle}
|
||||
Moodle Dokumentation.
|
||||
\newblock Aufbau einer moodle-site.
|
||||
\newblock 2015.
|
||||
\newblock https://docs.moodle.org/35/de/Aufbau\_einer\_Moodle-Site.
|
||||
|
||||
\bibitem[Dok18]{Moodle-2}
|
||||
Moodle Dokumentation.
|
||||
\newblock Cron-job.
|
||||
\newblock 2018.
|
||||
\newblock https://docs.moodle.org/35/de/Cron-Job.
|
||||
|
||||
\bibitem[Fio14]{Fiok}
|
||||
Marzena Fiok.
|
||||
\newblock E-mail-flut sorgt für kostenlawine.
|
||||
@@ -38,13 +43,6 @@ Marzena Fiok.
|
||||
\newblock
|
||||
https://www.tecchannel.de/a/e-mail-flut-sorgt-fuer-kostenlawine,402338,3.
|
||||
|
||||
\bibitem[FMS17]{Schlede}
|
||||
Andreas~Donner Frank-Michael~Schlede, Thomas~Bär.
|
||||
\newblock Was ist ldap (lightweight directory access protocol)?
|
||||
\newblock 2017.
|
||||
\newblock
|
||||
https://www.ip-insider.de/was-ist-ldap-lightweight-directory-access-protocol-a-581204/.
|
||||
|
||||
\bibitem[Fou18a]{Django-4}
|
||||
Django~Software Foundation.
|
||||
\newblock Cross site request forgery protection.
|
||||
@@ -89,6 +87,13 @@ Sario~Marketing GmbH.
|
||||
\newblock 2018.
|
||||
\newblock https://www.textbroker.de/tagging.
|
||||
|
||||
\bibitem[Hel12]{Hellmuth}
|
||||
Dirk Hellmuth.
|
||||
\newblock Wenn e-mails zur last werden: Wege aus der mail-Überflutung.
|
||||
\newblock 2012.
|
||||
\newblock
|
||||
https://www.unternehmer.de/management-people-skills/138949-wenn-e-mails-zur-last-werden-wege-aus-der-mail-ueberflutung.
|
||||
|
||||
\bibitem[Her16]{Herzog}
|
||||
Stephan Herzog.
|
||||
\newblock Model view controller, model view presenter, and model view viewmodel
|
||||
@@ -112,12 +117,6 @@ Ingo Leipner.
|
||||
\newblock
|
||||
http://www.mz-web.de/wirtschaft/e-mail-flut-mails-bearbeiten-kommunikation-stress-zeit-sparen.
|
||||
|
||||
\bibitem[Mic18]{Microsoft}
|
||||
Microsoft.
|
||||
\newblock Extensions for the visual studio family of products.
|
||||
\newblock 2018.
|
||||
\newblock https://marketplace.visualstudio.com/.
|
||||
|
||||
\bibitem[Ndu17]{Ndukwe}
|
||||
Nnenna Ndukwe.
|
||||
\newblock Python is the back-end programming language of the future and
|
||||
@@ -126,9 +125,15 @@ Nnenna Ndukwe.
|
||||
\newblock
|
||||
https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why.
|
||||
|
||||
\bibitem[Nev15]{Nevius}
|
||||
Ryan Nevius.
|
||||
\newblock django-post\_office git repository.
|
||||
\newblock 2015.
|
||||
\newblock https://ryannevius.com.
|
||||
|
||||
\bibitem[Ong18]{Ong}
|
||||
Selwin Ong.
|
||||
\newblock django-post\_office git repository.
|
||||
\newblock Django request-response cycle.
|
||||
\newblock 2018.
|
||||
\newblock https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst.
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ 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
|
||||
Repeated entry---line 176 of file ../references/References_2.bib
|
||||
: @article{Djangogirls-2
|
||||
: ,
|
||||
I'm skipping whatever remains of this entry
|
||||
Warning--empty journal in Bootstrap
|
||||
Warning--empty journal in Computer
|
||||
Warning--empty journal in Oracle
|
||||
Warning--empty journal in Dixit
|
||||
Warning--empty journal in Djangogirls
|
||||
Warning--empty journal in Djangogirls-2
|
||||
Warning--empty journal in Moodle
|
||||
Warning--empty journal in Moodle-2
|
||||
Warning--empty journal in Fiok
|
||||
Warning--empty journal in Schlede
|
||||
Warning--empty journal in Django-4
|
||||
Warning--empty journal in Django
|
||||
Warning--empty journal in Django-2
|
||||
@@ -29,11 +29,12 @@ Warning--empty journal in Django-3
|
||||
Warning--empty journal in Python
|
||||
Warning--empty journal in Gaynor
|
||||
Warning--empty journal in Sario
|
||||
Warning--empty journal in Hellmuth
|
||||
Warning--empty journal in Herzog
|
||||
Warning--empty journal in King
|
||||
Warning--empty journal in Leipner
|
||||
Warning--empty journal in Microsoft
|
||||
Warning--empty journal in Ndukwe
|
||||
Warning--empty journal in Nevius
|
||||
Warning--empty journal in Ong
|
||||
Warning--empty journal in Otto
|
||||
Warning--empty journal in Otto-2
|
||||
@@ -42,45 +43,45 @@ Warning--empty journal in Shelest
|
||||
Warning--empty journal in Solutions
|
||||
Warning--empty journal in Timm
|
||||
Warning--empty publisher in Weigend
|
||||
You've used 27 entries,
|
||||
You've used 28 entries,
|
||||
2543 wiz_defined-function locations,
|
||||
703 strings with 8340 characters,
|
||||
and the built_in function-call counts, 7356 in all, are:
|
||||
= -- 726
|
||||
> -- 216
|
||||
< -- 27
|
||||
+ -- 58
|
||||
- -- 54
|
||||
* -- 355
|
||||
:= -- 1287
|
||||
add.period$ -- 108
|
||||
call.type$ -- 27
|
||||
change.case$ -- 134
|
||||
707 strings with 8346 characters,
|
||||
and the built_in function-call counts, 7629 in all, are:
|
||||
= -- 753
|
||||
> -- 224
|
||||
< -- 28
|
||||
+ -- 61
|
||||
- -- 56
|
||||
* -- 368
|
||||
:= -- 1334
|
||||
add.period$ -- 112
|
||||
call.type$ -- 28
|
||||
change.case$ -- 139
|
||||
chr.to.int$ -- 23
|
||||
cite$ -- 54
|
||||
duplicate$ -- 380
|
||||
empty$ -- 546
|
||||
format.name$ -- 106
|
||||
if$ -- 1436
|
||||
int.to.chr$ -- 5
|
||||
cite$ -- 56
|
||||
duplicate$ -- 394
|
||||
empty$ -- 566
|
||||
format.name$ -- 111
|
||||
if$ -- 1489
|
||||
int.to.chr$ -- 6
|
||||
int.to.str$ -- 0
|
||||
missing$ -- 28
|
||||
newline$ -- 165
|
||||
num.names$ -- 81
|
||||
pop$ -- 163
|
||||
missing$ -- 29
|
||||
newline$ -- 171
|
||||
num.names$ -- 84
|
||||
pop$ -- 170
|
||||
preamble$ -- 1
|
||||
purify$ -- 162
|
||||
purify$ -- 168
|
||||
quote$ -- 0
|
||||
skip$ -- 293
|
||||
skip$ -- 302
|
||||
stack$ -- 0
|
||||
substring$ -- 189
|
||||
substring$ -- 196
|
||||
swap$ -- 1
|
||||
text.length$ -- 27
|
||||
text.prefix$ -- 25
|
||||
text.length$ -- 28
|
||||
text.prefix$ -- 27
|
||||
top$ -- 0
|
||||
type$ -- 212
|
||||
warning$ -- 27
|
||||
while$ -- 54
|
||||
width$ -- 33
|
||||
write$ -- 353
|
||||
type$ -- 220
|
||||
warning$ -- 28
|
||||
while$ -- 56
|
||||
width$ -- 34
|
||||
write$ -- 366
|
||||
(There was 1 error message)
|
||||
@@ -2,17 +2,26 @@
|
||||
\babel@toc {german}{}
|
||||
\addvspace {10\p@ }
|
||||
\addvspace {10\p@ }
|
||||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{6}{figure.caption.5}
|
||||
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6}
|
||||
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}
|
||||
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8}
|
||||
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9}
|
||||
\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10}
|
||||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{5}{figure.caption.4}
|
||||
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{6}{figure.caption.5}
|
||||
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{7}{figure.caption.6}
|
||||
\contentsline {figure}{\numberline {2.4}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.7}
|
||||
\contentsline {figure}{\numberline {2.5}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{11}{figure.caption.8}
|
||||
\addvspace {10\p@ }
|
||||
\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{15}{figure.caption.11}
|
||||
\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12}
|
||||
\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13}
|
||||
\contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14}
|
||||
\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15}
|
||||
\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{14}{figure.caption.9}
|
||||
\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{16}{figure.caption.10}
|
||||
\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{17}{figure.caption.11}
|
||||
\contentsline {figure}{\numberline {3.4}{\ignorespaces Menü für eingeloggte Benutzer mit Adminrechte\relax }}{18}{figure.caption.12}
|
||||
\contentsline {figure}{\numberline {3.5}{\ignorespaces User Stories\relax }}{19}{figure.caption.13}
|
||||
\contentsline {figure}{\numberline {3.6}{\ignorespaces Prototyp Artikel-Editor.\relax }}{21}{figure.caption.14}
|
||||
\contentsline {figure}{\numberline {3.7}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{21}{figure.caption.15}
|
||||
\contentsline {figure}{\numberline {3.8}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{22}{figure.caption.16}
|
||||
\contentsline {figure}{\numberline {3.9}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{23}{figure.caption.17}
|
||||
\contentsline {figure}{\numberline {3.10}{\ignorespaces Prototyp Newsfeed Seite\relax }}{24}{figure.caption.18}
|
||||
\addvspace {10\p@ }
|
||||
\contentsline {figure}{\numberline {4.1}{\ignorespaces Vergleich der hochschulinternen E-Mails\relax }}{26}{figure.caption.19}
|
||||
\contentsline {figure}{\numberline {4.2}{\ignorespaces Details der relevanten E-Mails des Probanden\relax }}{27}{figure.caption.20}
|
||||
\contentsline {figure}{\numberline {4.3}{\ignorespaces Details der irrelevanten E-Mails des Probanden\relax }}{28}{figure.caption.21}
|
||||
\contentsline {figure}{\numberline {4.4}{\ignorespaces Vergleich der Anzahl von eintreffenden E-Mails zwischen aktueller Situation und unter Verwendung des Prototyps\relax }}{28}{figure.caption.22}
|
||||
\addvspace {10\p@ }
|
||||
\contentsline {figure}{\numberline {5.1}{\ignorespaces Cron-Tab der im Prototyp getesteten Benachrichtigung.\relax }}{32}{figure.caption.23}
|
||||
@@ -1,5 +1,5 @@
|
||||
\BOOKMARK [0][-]{figure.caption.1}{Abstract}{}% 1
|
||||
\BOOKMARK [0][-]{chapter*.4}{Abbildungsverzeichnis}{}% 2
|
||||
\BOOKMARK [0][-]{Doc-Start}{Abstract}{}% 1
|
||||
\BOOKMARK [0][-]{chapter*.3}{Abbildungsverzeichnis}{}% 2
|
||||
\BOOKMARK [0][-]{chapter.1}{Einleitung}{}% 3
|
||||
\BOOKMARK [1][-]{section.1.1}{Ausgangssituation}{chapter.1}% 4
|
||||
\BOOKMARK [1][-]{section.1.2}{Ziel\040der\040Arbeit}{chapter.1}% 5
|
||||
@@ -7,24 +7,23 @@
|
||||
\BOOKMARK [1][-]{section.2.1}{Django}{chapter.2}% 7
|
||||
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten\040Djangos}{section.2.1}% 8
|
||||
\BOOKMARK [2][-]{subsection.2.1.2}{Virtuelle\040Umgebung}{section.2.1}% 9
|
||||
\BOOKMARK [2][-]{subsection.2.1.3}{Lightweight\040Directory\040Access\040Protocol}{section.2.1}% 10
|
||||
\BOOKMARK [2][-]{subsection.2.1.4}{Sicherheit}{section.2.1}% 11
|
||||
\BOOKMARK [1][-]{section.2.2}{Erweiterungen}{chapter.2}% 12
|
||||
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 13
|
||||
\BOOKMARK [2][-]{subsection.2.2.2}{Hilfsbibliotheken}{section.2.2}% 14
|
||||
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 15
|
||||
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 16
|
||||
\BOOKMARK [1][-]{section.3.1}{Forschungsdesign}{chapter.3}% 17
|
||||
\BOOKMARK [1][-]{section.3.2}{Organisation}{chapter.3}% 18
|
||||
\BOOKMARK [2][-]{subsection.3.2.1}{Datenmodellierung}{section.3.2}% 19
|
||||
\BOOKMARK [2][-]{subsection.3.2.2}{Verwaltung\040im\040Administrator-Back-end}{section.3.2}% 20
|
||||
\BOOKMARK [2][-]{subsection.3.2.3}{Berechtigung\040der\040User}{section.3.2}% 21
|
||||
\BOOKMARK [1][-]{section.3.3}{Funktionen}{chapter.3}% 22
|
||||
\BOOKMARK [2][-]{subsection.3.3.1}{Verwalten}{section.3.3}% 23
|
||||
\BOOKMARK [2][-]{subsection.3.3.2}{Abonnieren}{section.3.3}% 24
|
||||
\BOOKMARK [2][-]{subsection.3.3.3}{Filtern}{section.3.3}% 25
|
||||
\BOOKMARK [2][-]{subsection.3.3.4}{Benachrichtigung}{section.3.3}% 26
|
||||
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 27
|
||||
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 28
|
||||
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 29
|
||||
\BOOKMARK [0][-]{chapter*.16}{Referenzen}{}% 30
|
||||
\BOOKMARK [2][-]{subsection.2.1.3}{Sicherheit}{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 [0][-]{chapter.3}{Prototyp}{}% 15
|
||||
\BOOKMARK [1][-]{section.3.1}{Forschungsdesign}{chapter.3}% 16
|
||||
\BOOKMARK [1][-]{section.3.2}{Organisation}{chapter.3}% 17
|
||||
\BOOKMARK [2][-]{subsection.3.2.1}{Datenmodellierung}{section.3.2}% 18
|
||||
\BOOKMARK [2][-]{subsection.3.2.2}{Berechtigungen\040der\040User}{section.3.2}% 19
|
||||
\BOOKMARK [1][-]{section.3.3}{Funktionen}{chapter.3}% 20
|
||||
\BOOKMARK [2][-]{subsection.3.3.1}{Verwaltung\040der\040Funktionen}{section.3.3}% 21
|
||||
\BOOKMARK [2][-]{subsection.3.3.2}{Artikel\040abonnieren}{section.3.3}% 22
|
||||
\BOOKMARK [2][-]{subsection.3.3.3}{Filtern\040von\040Artikeln}{section.3.3}% 23
|
||||
\BOOKMARK [0][-]{chapter.4}{Evaluation}{}% 24
|
||||
\BOOKMARK [1][-]{subsection.4.0.1}{Ergebnis}{chapter.4}% 25
|
||||
\BOOKMARK [2][-]{subsection.4.0.2}{Diskussion}{subsection.4.0.1}% 26
|
||||
\BOOKMARK [0][-]{chapter.5}{Schlussbetrachtung}{}% 27
|
||||
\BOOKMARK [1][-]{subsection.5.0.1}{Ausblick}{chapter.5}% 28
|
||||
\BOOKMARK [0][-]{chapter*.24}{Referenzen}{}% 29
|
||||
@@ -1,32 +1,31 @@
|
||||
\babel@toc {german}{}
|
||||
\babel@toc {german}{}
|
||||
\contentsline {chapter}{Abstract}{ii}{figure.caption.1}
|
||||
\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.4}
|
||||
\contentsline {chapter}{Abstract}{ii}{Doc-Start}
|
||||
\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.3}
|
||||
\contentsline {chapter}{\numberline {1}Einleitung}{2}{chapter.1}
|
||||
\contentsline {section}{\numberline {1.1}Ausgangssituation}{2}{section.1.1}
|
||||
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{3}{section.1.2}
|
||||
\contentsline {chapter}{\numberline {2}Framework}{5}{chapter.2}
|
||||
\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}
|
||||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1}
|
||||
\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2}
|
||||
\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3}
|
||||
\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4}
|
||||
\contentsline {section}{\numberline {2.2}Erweiterungen}{10}{section.2.2}
|
||||
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}
|
||||
\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{11}{subsection.2.2.2}
|
||||
\contentsline {section}{\numberline {2.3}Bootstrap}{12}{section.2.3}
|
||||
\contentsline {chapter}{\numberline {3}Prototyp}{14}{chapter.3}
|
||||
\contentsline {section}{\numberline {3.1}Forschungsdesign}{14}{section.3.1}
|
||||
\contentsline {section}{\numberline {3.2}Organisation}{15}{section.3.2}
|
||||
\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1}
|
||||
\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2}
|
||||
\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{18}{subsection.3.2.3}
|
||||
\contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3}
|
||||
\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}
|
||||
\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{22}{subsection.3.3.2}
|
||||
\contentsline {subsection}{\numberline {3.3.3}Filtern}{23}{subsection.3.3.3}
|
||||
\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{23}{subsection.3.3.4}
|
||||
\contentsline {chapter}{\numberline {4}Ergebnis}{24}{chapter.4}
|
||||
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{24}{subsection.4.0.1}
|
||||
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{25}{chapter.5}
|
||||
\contentsline {chapter}{Referenzen}{26}{chapter*.16}
|
||||
\contentsline {chapter}{\numberline {2}Framework}{4}{chapter.2}
|
||||
\contentsline {section}{\numberline {2.1}Django}{4}{section.2.1}
|
||||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{6}{subsection.2.1.1}
|
||||
\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{7}{subsection.2.1.2}
|
||||
\contentsline {subsection}{\numberline {2.1.3}Sicherheit}{8}{subsection.2.1.3}
|
||||
\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{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}{10}{section.2.3}
|
||||
\contentsline {chapter}{\numberline {3}Prototyp}{13}{chapter.3}
|
||||
\contentsline {section}{\numberline {3.1}Forschungsdesign}{13}{section.3.1}
|
||||
\contentsline {section}{\numberline {3.2}Organisation}{14}{section.3.2}
|
||||
\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{15}{subsection.3.2.1}
|
||||
\contentsline {subsection}{\numberline {3.2.2}Berechtigungen der User}{16}{subsection.3.2.2}
|
||||
\contentsline {section}{\numberline {3.3}Funktionen}{18}{section.3.3}
|
||||
\contentsline {subsection}{\numberline {3.3.1}Verwaltung der Funktionen}{18}{subsection.3.3.1}
|
||||
\contentsline {subsection}{\numberline {3.3.2}Artikel abonnieren}{20}{subsection.3.3.2}
|
||||
\contentsline {subsection}{\numberline {3.3.3}Filtern von Artikeln}{23}{subsection.3.3.3}
|
||||
\contentsline {chapter}{\numberline {4}Evaluation}{26}{chapter.4}
|
||||
\contentsline {subsection}{\numberline {4.0.1}Ergebnis}{29}{subsection.4.0.1}
|
||||
\contentsline {subsection}{\numberline {4.0.2}Diskussion}{29}{subsection.4.0.2}
|
||||
\contentsline {chapter}{\numberline {5}Schlussbetrachtung}{31}{chapter.5}
|
||||
\contentsline {subsection}{\numberline {5.0.1}Ausblick}{31}{subsection.5.0.1}
|
||||
\contentsline {chapter}{Referenzen}{33}{chapter*.24}
|
||||
@@ -1,7 +1,7 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@setckpt{chapters/ausblick}{
|
||||
\setcounter{page}{25}
|
||||
\setcounter{page}{31}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
@@ -12,13 +12,17 @@
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{4}
|
||||
\setcounter{section}{0}
|
||||
\setcounter{subsection}{1}
|
||||
\setcounter{subsection}{2}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{figure}{4}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{16}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{26}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -26,11 +30,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{28}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Ausgangssituation}{2}{section.1.1}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{3}{section.1.2}}
|
||||
\@setckpt{chapters/einleitung}{
|
||||
\setcounter{page}{5}
|
||||
\setcounter{page}{4}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
@@ -24,6 +24,10 @@
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{5}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -31,11 +35,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{5}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -1,12 +1,17 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Ergebnis}{24}{chapter.4}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Evaluation}{26}{chapter.4}}
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:ergebnis}{{4}{24}{Ergebnis}{chapter.4}{}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{24}{subsection.4.0.1}}
|
||||
\newlabel{ch:ergebnis}{{4}{26}{Evaluation}{chapter.4}{}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces Vergleich der hochschulinternen E-Mails\relax }}{26}{figure.caption.19}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces Details der relevanten E-Mails des Probanden\relax }}{27}{figure.caption.20}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Details der irrelevanten E-Mails des Probanden\relax }}{28}{figure.caption.21}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces Vergleich der Anzahl von eintreffenden E-Mails zwischen aktueller Situation und unter Verwendung des Prototyps\relax }}{28}{figure.caption.22}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Ergebnis}{29}{subsection.4.0.1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.2}Diskussion}{29}{subsection.4.0.2}}
|
||||
\@setckpt{chapters/ergebnis}{
|
||||
\setcounter{page}{25}
|
||||
\setcounter{page}{31}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
@@ -17,13 +22,17 @@
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{4}
|
||||
\setcounter{section}{0}
|
||||
\setcounter{subsection}{1}
|
||||
\setcounter{subsection}{2}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{figure}{4}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{16}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{26}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -31,11 +40,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{28}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{25}{chapter.5}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Schlussbetrachtung}{31}{chapter.5}}
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:zusammenfassung}{{5}{25}{Zusammenfassung und Ausblick}{chapter.5}{}}
|
||||
\newlabel{ch:zusammenfassung}{{5}{31}{Schlussbetrachtung}{chapter.5}{}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {5.0.1}Ausblick}{31}{subsection.5.0.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {5.1}{\ignorespaces Cron-Tab der im Prototyp getesteten Benachrichtigung.\relax }}{32}{figure.caption.23}}
|
||||
\@setckpt{chapters/fazit}{
|
||||
\setcounter{page}{26}
|
||||
\setcounter{page}{33}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
@@ -16,13 +18,17 @@
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{5}
|
||||
\setcounter{section}{0}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsection}{1}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{figure}{1}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{16}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{28}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -30,11 +36,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{29}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -1,32 +1,30 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Framework}{5}{chapter.2}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Framework}{4}{chapter.2}}
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:framework}{{2}{5}{Framework}{chapter.2}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{6}{figure.caption.5}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{10}{section.2.2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{11}{subsection.2.2.2}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{12}{section.2.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10}}
|
||||
\newlabel{ch:framework}{{2}{4}{Framework}{chapter.2}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Django}{4}{section.2.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{5}{figure.caption.4}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{6}{figure.caption.5}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{6}{subsection.2.1.1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{7}{subsection.2.1.2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{7}{figure.caption.6}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Sicherheit}{8}{subsection.2.1.3}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{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}{10}{section.2.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.7}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{11}{figure.caption.8}}
|
||||
\@setckpt{chapters/framework}{
|
||||
\setcounter{page}{14}
|
||||
\setcounter{page}{13}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{footnote}{13}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{2}
|
||||
@@ -35,9 +33,13 @@
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{6}
|
||||
\setcounter{figure}{5}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{13}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{14}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -45,11 +47,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{15}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -1,43 +1,50 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{14}{chapter.3}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{13}{chapter.3}}
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:prototyp}{{3}{14}{Prototyp}{chapter.3}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Forschungsdesign}{14}{section.3.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{15}{figure.caption.11}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Organisation}{15}{section.3.2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{16}{subsection.3.2.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{17}{figure.caption.12}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{18}{subsection.3.2.2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{18}{subsection.3.2.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{19}{figure.caption.13}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Funktionen}{20}{section.3.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces User Stories\relax }}{20}{figure.caption.14}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwalten}{20}{subsection.3.3.1}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{22}{subsection.3.3.2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{23}{figure.caption.15}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{23}{subsection.3.3.3}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{23}{subsection.3.3.4}}
|
||||
\newlabel{ch:prototyp}{{3}{13}{Prototyp}{chapter.3}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Forschungsdesign}{13}{section.3.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{14}{figure.caption.9}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Organisation}{14}{section.3.2}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{15}{subsection.3.2.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{16}{figure.caption.10}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Berechtigungen der User}{16}{subsection.3.2.2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von \texttt {User} und \texttt {Post}\relax }}{17}{figure.caption.11}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces Menü für eingeloggte Benutzer mit Adminrechte\relax }}{18}{figure.caption.12}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Funktionen}{18}{section.3.3}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwaltung der Funktionen}{18}{subsection.3.3.1}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces User Stories\relax }}{19}{figure.caption.13}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Artikel abonnieren}{20}{subsection.3.3.2}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces Prototyp Artikel-Editor.\relax }}{21}{figure.caption.14}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.7}{\ignorespaces Funktion post\_edit, Auszug aus views.py.\relax }}{21}{figure.caption.15}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.8}{\ignorespaces Prototyp Suche- und Abonnier-Seite\relax }}{22}{figure.caption.16}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.9}{\ignorespaces Funktion search\_add, Auszug aus views.py.\relax }}{23}{figure.caption.17}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern von Artikeln}{23}{subsection.3.3.3}}
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {3.10}{\ignorespaces Prototyp Newsfeed Seite\relax }}{24}{figure.caption.18}}
|
||||
\@setckpt{chapters/prototyp}{
|
||||
\setcounter{page}{24}
|
||||
\setcounter{page}{26}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{footnote}{3}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{3}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{4}
|
||||
\setcounter{subsection}{3}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{5}
|
||||
\setcounter{figure}{10}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{16}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{23}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -45,11 +52,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{26}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -18,6 +18,10 @@
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{4}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{0}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -25,9 +29,5 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{0}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
}
|
||||
@@ -19,6 +19,10 @@
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{float@type}{8}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{0}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{ContinuedFloat}{0}
|
||||
@@ -26,11 +30,7 @@
|
||||
\setcounter{subtable}{0}
|
||||
\setcounter{r@tfl@t}{0}
|
||||
\setcounter{AM@survey}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{Hy@AnnotLevel}{0}
|
||||
\setcounter{bookmark@seq@number}{0}
|
||||
\setcounter{NAT@ctr}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -3,9 +3,13 @@
|
||||
|
||||
\chapter*{Abstract}
|
||||
|
||||
Content of this Bachelor thesis is ....
|
||||
Das Ziel der vorliegenden Bachelor Arbeit ist es, zu beweisen, dass die E-Mail-Flut der Hochschule durch den Einsatz einer Social Media Plattform gedrosselt werden kann. Dazu wird ein Prototyp implementiert der ein personalisierbares Dashboard für Studierende bereitstellt.
|
||||
|
||||
Das Abonnieren von Nachrichten wird mit dem Einsatz von Tags umgesetzt. Benutzer des Systems, versehen die Nachrichten mit Schlagwörtern und machen die Informationen dadurch schneller zuweisbar. Durch die einfach Suche von Tags können Studierende diese nach eigenem Ermessen zum Dashboard hinzufügen.
|
||||
|
||||
Durch den Zähler einer jeden Nachricht können Autoren sehen, ob Informationen bereits gelesen wurden. Hierdurch lassen sich Schlüsse über die Nutzung der Applikation und die Relevanz des Artikels ziehen.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\vspace{\fill}
|
||||
\noindent \textbf{Keywords}: bla,bla Georg Simon Ohm, Wirtschaftsinformatik
|
||||
@@ -1,3 +1,42 @@
|
||||
\chapter{Zusammenfassung und Ausblick}
|
||||
\chapter{Schlussbetrachtung}
|
||||
\label{ch:zusammenfassung}
|
||||
Zusammenfassung...
|
||||
|
||||
Um die Forschungsfrage, \glqq Kann die E-Mail-Flut der Technischen Hochschule mit Hilfe einer Social Media Plattform gedrosselt und die Nachhaltigkeit der Informationen gewährleistet werden?", zu beantworten, wurde in dieser Arbeit ein Prototyp entwickelt.
|
||||
|
||||
Hierbei handelt es sich um eine Erweiterung der Fakultätsinternen Website. Mit Hilfe von Tags können Informationen abonniert und ein personalisiertes Dashboard zusammengestellt werden. Durch differenzierte Berechtigungen ist es realisierbar, bestimmten Benutzern das Einpflegen und Verwalten von Benachrichtigungen zu gewähren.
|
||||
|
||||
In der Evaluation wurde durch eine Kalkulation, stichprobenartig anhand eines Probanden dargelegt, in wie weit die eintreffenden Informationen im Postfach der Studierenden irrelevant sind und durch die individualisierbare Website eingespart werden können.
|
||||
|
||||
Diese wissenschaftliche Arbeit hat gezeigt, dass durch den Einsatz einer webbasierten Plattform, Informationen an verschiedenste Personen einer Einrichtung verteilt werde können. Durch die individuellen Konfigurationsmöglichkeiten sind die Empfänger nicht überfordert und können mit wenig Aufwand passende Themengebiete abonnieren. Die E-Mail-Flut wird stark verkleinert und der administrative Aufwand des Postfachs reduziert.
|
||||
|
||||
Im Folgenden wird beschrieben, wie der Prototyp erweitert und optimiert werden kann.
|
||||
|
||||
|
||||
\subsection{Ausblick}
|
||||
|
||||
Betrachtet wird der aktuelle Stand der Anwendung, wie dieser aufbauend optimiert und in Verwendung gebracht werden kann.
|
||||
|
||||
Der Umfang der verwendeten Tags wird äquivalent zur Dimension der verschiedenen Themen an Informationen stark ansteigen. Es bietet sich an, diese zukünftig in Gruppen zu unterteilen um die Datenbank logisch und performant aufbauen zu können. Zudem ist das automatische Anlegen von Metadaten der einzelnen Tags bei der Administration hilfreich. Beispiele hierfür wären, wann wurde das Schlagwort erstellt, wie oft taucht es in der Suche auf und wie viele Abonnenten besitzt dieses. In Folge dessen käme eine eigens entwickelte Datenkonstruktion für Tags in Frage, um den Taggable Manager abzulösen.
|
||||
|
||||
Eine weitere wichtige Eigenschaft von Informationsplattformen ist das regelmä"sige Abrufen der neusten Mitteilungen. Um das Interesse der Studierenden und Lehrenden aufrecht zu erhalten, kann ein Skript integriert werden, bekannt unter dem Name Cron, dass asynchrone Benachrichtigungen ermöglicht. Wird ein \texttt{Cron-Job} auf dem systeminternen Server ausgeführt, so wird zyklisch der Benutzer über Neuigkeiten per Mail informiert (vgl. [Dok18]).
|
||||
Im Prototyp wurde das Verfahren der asynchronen E-Mail-Benachrichtigung wie folgt getestet: Mit der Konfiguration des Shell-Skripts werden die Sendezyklen und die Inhalte festgelegt. Die Abbildung 5.1. zeigt den Cron-Tab, der wöchentlich gesendet werden soll ( \texttt{0 0 * * 0} ). Des weiteren werden die Pfade der Entwicklungsumgebung und des Servers mitgegeben. Um das Senden der Mails überwachen zu können, werden die Aktivitäten in ein Log-File geschrieben und sind im Administrator-Backend abrufbar. \\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{figures/crontab}
|
||||
\caption{Cron-Tab der im Prototyp getesteten Benachrichtigung.}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Des weiteren ist zur besseren Benutzung der Web-Erweiterung die Usability optimierbar. Die folgenden Punkte zeigen konkrete Möglichkeiten auf, die Gebrauchstauglichkeit für den User zu steigern:
|
||||
|
||||
\begin{itemize}
|
||||
\item Einbindung einer Tagcloud mit Verlinkungen zu Artikeln die diesen Tag enthalten.
|
||||
\item Die Auswahl an Tags für Autoren beim Einpflegen von Artikeln optimieren, zum Beispiel mit Vorschlägen ähnlicher Schlagwörter.
|
||||
\item Das Hinzufügen und Löschen von Tags mit Hilfe einer grafischen Schaltfläche realisieren. Sinnvoll wäre es hierbei die Bibliothek von Bootstrap zu erweitern.
|
||||
\end{itemize}
|
||||
|
||||
Zusammenfassend lässt sich feststellen, dass die Weiterarbeit am Prototyp unabdingbar ist um diesen später in die Fakultätswebsite einbinden zu können.
|
||||
|
||||
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
\chapter{Einleitung}
|
||||
Das elektronische Übertragen von Nachrichten ist aus der heutigen Zeit nicht mehr wegzudenken.
|
||||
In der Vergangenheit hat sich jedoch gezeigt, dass das Versenden von Informationen nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich, sich vernünftig mit den Informationen zu befassen"(vgl. [Ver13]). Nicht nur am Arbeitsplatz, sondern auch an Hochschulen wird Gebrauch davon gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Hierdurch steigen die irrelevanten Informationen unkontrollierbar schnell an. Infolgedessen, nimmt der benötigte Speicheraufwand der zahlreichen kommerziellen, aber auch internen E-Mail-Dienste enorm zu (vgl. [Fio14]).
|
||||
Das Dezimieren dieses Kommunikationswegs ist jedoch in vielen Fällen nicht möglich und Beschränkungen jeglicher Art werden als nicht sinnvoll erachtet.
|
||||
Eine Vielzahl an ungelesene E-Mails häufen sich täglich in den Postfächern eines Jeden an (vgl. [Hel12]). Das elektronische Übertragen von Nachrichten ist aus der heutigen Zeit nicht mehr wegzudenken.
|
||||
In der Vergangenheit hat sich jedoch gezeigt, dass das Versenden von Informationen nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich, sich vernünftig mit den Informationen zu befassen"(vgl. [Ver13]). Nicht nur am Arbeitsplatz, sondern auch an Hochschulen wird Gebrauch davon gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Hierdurch steigen die irrelevanten Informationen unkontrollierbar schnell an. Infolgedessen nimmt der benötigte Speicheraufwand der zahlreichen kommerziellen, aber auch internen E-Mail-Dienste enorm zu (vgl. [Fio14]).
|
||||
|
||||
Betrachtet man darüber hinaus den Lebenszyklus einer einzelnen E-Mail, wird deutlich, dass dieser nach dem Erstellen, Senden und Empfangen noch nicht abgeschlossen ist. Nachdem die Information vom Adressat geöffnet wurde, wird sie archiviert, muss aber jederzeit durch eine Suchabfrage sofort angezeigt werden können. Dies verdeutlicht den enormen Aufwand, das das Verwalten elektronischer Post mit sich bringt. Aufbauend auf dieser Problematik wird folgend die Ausgangssituation der Arbeit erläutert.
|
||||
|
||||
|
||||
\section{Ausgangssituation}
|
||||
Alle Informationen der Fakultät Elektrotechnik Feinwerktechnik Informationstechnik werden {\"u}ber die globalen Verteiler des Hochschulinternen Postfaches versendet. Viele dieser Daten sind jedoch nur f{\"u}r eine geringe Schnittmenge von Empf{\"a}ngern relevant und enthalten Mitteilungen oder Anhänge, die keinerlei Mehrwert den Einzelnen aufweisen k{\"o}nnen. Dadurch sind die Postf{\"a}ch der Studierenden und Dozenten schnell überlastet und k{\"o}nnen, ohne regelm{\"a}"sige Pflege, nicht in vollem Umfang genutzt werden. Zudem lassen sich Informationen schwer priorisieren und der massive administrative Aufwand für den Einzelnen, E-Mails selbstständig zu filtern und nach persönlichem Ermessen zu verwalten, steht in keinem Verhältnis zum Mehrwert eines performanten, aufgeräumten Postfaches.
|
||||
Alle Informationen der Fakultät Elektrotechnik Feinwerktechnik Informationstechnik werden {\"u}ber die globalen Verteiler des Hochschulinternen Postfaches versendet. Viele dieser Daten sind jedoch nur f{\"u}r eine geringe Schnittmenge von Empf{\"a}ngern relevant und enthalten Mitteilungen oder Anhänge, die keinerlei Mehrwert dem Einzelnen aufweisen k{\"o}nnen. Dadurch sind die Postf{\"a}cher der Studierenden schnell überlastet und k{\"o}nnen, ohne regelm{\"a}"sige Pflege, nicht in vollem Umfang genutzt werden. Zudem lassen sich Informationen schwer priorisieren und der massive administrative Aufwand für den Einzelnen, E-Mails selbstständig zu filtern und nach persönlichem Ermessen zu verwalten, steht in keinem Verhältnis zum Mehrwert eines performanten, aufgeräumten Postfaches.
|
||||
|
||||
Die Nachhaltigkeit der Informationen kann meist nicht gewährleistet werden. Grund dafür ist der mangelnde Speicherplatz, verursacht durch die ankommende Nachrichtenflut. M{\"o}chten die Empf{\"a}nger {\"a}ltere E-Mails abrufen, m{\"u}ssen diese meist entfernt werden um Platz f{\"u}r den neuen, eintreffenden E-Mail-Verkehr zu schaffen.
|
||||
Dies kann das Nichtlesen der Informationen seitens der Empfänger verursachen und führt im schlechtesten Fall zum voreiligen Entfernen von relevanten Nachrichten.
|
||||
|
||||
Die Ersteller der Nachrichten haben keinerlei M{\"o}glichkeiten zu {\"u}berpr{\"u}fen, ob und wie viele Studierende und Dozenten eingehende Nachrichten {\"o}ffnen und lesen. Eine solche Art der Transparenz wäre jedoch hilfreich, um Informationen inhaltlich zu optimieren und Überschriften treffender zu formulieren.
|
||||
Die Ersteller der Nachrichten haben keine M{\"o}glichkeiten zu {\"u}berpr{\"u}fen, wie viele Studierende eingehende Nachrichten lesen. Eine solche Art der Transparenz wäre jedoch hilfreich, um Informationen inhaltlich zu optimieren und Überschriften treffender zu formulieren.
|
||||
Aus dieser Situation ergibt sich folgende Forschungsfrage: \glqq Kann die E-Mail-Flut der Technischen Hochschule mit Hilfe einer Social Media Plattform gedrosselt und die Nachhaltigkeit der Informationen gewährleistet werden?"
|
||||
|
||||
\section{Ziel der Arbeit}
|
||||
Ziel der Arbeit ist es, durch die Einbindung einer Social Media Plattform in die bereits bestehenden Hochschulwebsite den Speicheraufwand des Postfaches f{\"u}r Studierende der Fakultät zu reduzieren. Durch selbständiges Prüfen der Nachrichtenseite nehmen die Zielgruppen Informationen bewusster wahr und können diese individuell an ihre aktuelle Situation anpassen. Das reduziert den administrativen Aufwand und verhindert Speicherengpässe im E-Mail-Postfach. Broadcast ähnliches Senden von Informationen ist hierdurch nur noch in den seltensten Fällen nötig.
|
||||
|
||||
Der Schwerpunkt dieser Arbeit liegt auf der prototypischen Umsetzung der Website-Erweiterung. Hierbei wird zunächst der Fokus auf die grundlegenden Funktionen gelegt. Dazu gehört das Abonnieren, das Einpflegen von neuen und das Löschen von alten Nachrichten. Um den Informationsfluss jedes Einzelnen nicht aus den Augen zu verlieren, soll in regelmä"sigen Abständen eine automatisierte E-Mail verschickt werden.
|
||||
Zudem sollen die Autoren einsehen können, in welchem Umfang die veröffentlichten Informationen bereits gelesen wurden. Dadurch lässt sich nach einer gewissen Zeit, feststellen, ob die Studierenden und Dozenten die Nachrichten für relevant erachten und die Plattform weiterhin als verlässliches Portal rentabel ist.
|
||||
Zudem sollen die Autoren einsehen können, in welchem Umfang die veröffentlichten Informationen bereits gelesen wurden. Dadurch lässt sich nach einer gewissen Zeit feststellen, ob die Studierenden und Dozenten die Nachrichten für relevant erachten und die Plattform weiterhin als verlässliches Portal rentabel ist.
|
||||
@@ -1,17 +1,83 @@
|
||||
\chapter{Ergebnis}
|
||||
\chapter{Evaluation}
|
||||
\label{ch:ergebnis}
|
||||
\subsection{Evaluierung}
|
||||
|
||||
Ziel dieses Kapitels ist es, zu evaluieren, ob der Prototyp dieser Arbeit die folgende Forschungsfrage beantworten kann:
|
||||
|
||||
\glqq Kann die E-Mail-Flut der Technischen Hochschule mit Hilfe einer Social Media Plattform gedrosselt und die Nachhaltigkeit der Informationen gewährleistet werden?"
|
||||
|
||||
Die Durchführung des Beweises ist realisierbar, indem der E-Mail-Verkehr beispielhaft anhand eines Probanden der Technische Hochschule Nürnberg dargestellt wird. Anschlie"send wird das Ergebnis veranschaulicht.
|
||||
|
||||
Um den Umfang der E-Mail-Flut einordnen zu können, wird das Postfach des Studierenden genauer analysiert. Hierbei handelt es sich um den E-Mail-Verkehr während des Sommersemesters 2018, welches vom 15.03 bis 30.09 andauert. Da die Relevanz der Informationen von den persönlichen Interessen und Aktivitäten des Probanden abhängig ist, kommen diesen Eigenschaften besondere Gewichtung zu. \\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1.0\textwidth]{figures/evaluation-1}
|
||||
\caption{Vergleich der hochschulinternen E-Mails}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Während des Semesters trafen in Summe 265 Nachrichten im Postfach des Probanden ein. Darunter sind 127 innerhalb der Fakultät befördert worden. Abbildung 4.1. verdeutlicht auf der linken Seite das Verhältnis zwischen den Nachrichten hochschulweit und innerhalb der Fakultät. Diese wurden von diversen Verteilern an den Probanden gesendet.
|
||||
Auf der rechten Seite der Abbildung 4.1. ist eine Übersicht der fakultätsinternen Verteiler dargestellt. Dabei wird verdeutlicht, dass über die Mailingliste der Studierenden mehr als die Hälfte aller Mitteilungen versendet wird.
|
||||
|
||||
Sortiert der Proband nun den Posteingang nach relevanten Informationen, so zeigt sich folgendes Ergebnis:\\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1.0\textwidth]{figures/evaluation-2}
|
||||
\caption{Details der relevanten E-Mails des Probanden}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Das Balkendiagramm der Abbildung 4.2. zeigt, wie viele hochschulweit versendeten Informationen bedeutsam für den Probanden sind. Detaillierter wird gezeigt, wie viele hiervon innerhalb der Fakultät (vgl. intern) von Interesse sind. Das bedeutet, dass 96 Nachrichten im Postfach relevant sind und davon 39 Nachrichten der Fakultät EFI entstammen. Fokussiert man die Themenübersicht wird deutlich, dass allgemeine Benachrichtigungen, wie Termine von Veranstaltungen, prüfungsrelevante Neuigkeiten oder Updates zu den Systemen der Hochschule den Interessenschwerpunkt bilden. Spezifischere Informationen, wie die des Language Centers, des International Office oder der Fachschaft EFI nehmen zwar einen geringeren Anteil ein, sind für den Probanden aber nicht vernachlässigbar.
|
||||
|
||||
Werden die eingehenden E-Mails betrachtet, die der Studierende als nicht relevant aussortiert hat, lassen sich bereits eindeutige Tendenzen erkennen. Wie in Abbildung 4.3. erkennbar ist, sind 169 Informationen, also 64 Prozent der Gesamtheit irrelevant. Extrahiert man davon die fakulätsinternen Benachrichtigungen, so ergibt sich die Anzahl 53. Prozentual lässt sich daraus berechnen, dass etwa 30 Prozent der überflüssigen E-Mails direkt von der EFI-Fakultät ausgehen.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1.0\textwidth]{figures/evaluation-3}
|
||||
\caption{Details der irrelevanten E-Mails des Probanden}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Bei Sondierung der Detailansicht auf der linken Seite der Abbildung 4.3., ist zu erkennen, dass meist die sehr spezifischen Informationen über Vorlesungen, Interessen oder Freizeitaktivitäten vom Probanden aussortiert werden. Hierbei lässt sich erschlie"sen, wie symptomatische Informationen trotz fehlender Relevanz, das Postfach überfluten.
|
||||
|
||||
Die beispielhafte Kalkulation der im Postfach des Probanden befindlichen E-Mails wird nun mit dem durch die Implementierung des Prototyps entstehenden Ergebnis verglichen.
|
||||
|
||||
Die Aufgabe der entwickelten Anwendung ist es, die Informationen statt per E-Mail, über eine Social Media Plattform zu publizieren. Dennoch sollen die Studierenden als regelmä"sige Erinnerung eine zusammenfassende Benachrichtigung erhalten. Stellt man die Anzahl, der über das Semester verteilten eintreffenden E-Mails des Probanden, den wöchentlichen Mitteilungen des Prototypen gegenüber, so ergibt sich folgendes Diagramm:\\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=0.4\textwidth]{figures/evaluation-5}
|
||||
\caption{Vergleich der Anzahl von eintreffenden E-Mails zwischen aktueller Situation und unter Verwendung des Prototyps}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Abbildung 4.4. zeigt deutlich, dass durch den Einsatz des Prototyps die Anzahl der Informationen im Postfach stark reduziert werden können. Der Proband würde etwa 90 Prozent seines Nachrichtenvolumens im System einsparen. Dadurch bestätigt sich die Hypothese: Die E-Mail-Flut der Hochschule wird durch den Einsatz einer Weberweiterung reduziert.
|
||||
|
||||
|
||||
\subsection{Ergebnis}
|
||||
|
||||
Werden alle Auswertungen der Evaluation zusammengefasst und betrachtet, so ist deutlich zu sehen, dass Benachrichtigungen der Hochschule zu ausgedehnt verteilt werden. Fakultätsübergreifende Themengebiete sind häufig über umfangreiche Verteiler an Einzelpersonen weitergegeben worden und erzeugen dabei eine schwer administrierbare Menge.
|
||||
|
||||
Der Fokus dieser Arbeit liegt auf dem reduzieren der E-Mail-Flut innerhalb der EFI-Fakultät. Wird der Prototyp auf der Hochschul-Website eingebunden, so kann die Problematik im Idealfall auf ein Kleinstes reduziert werden. Das Verhältnis zwischen irrelevanten und relevanten Informationen zeigt deutlich, dass über die Hälfte der Nachrichten keinerlei Bedeutsamkeit für den Probanden haben. Aufgrund dessen, lassen sich folgende Erkenntnisse festhalten. Die Website-Erweiterung vermeidet das Eintreffen der unwichtigen E-Mails und informiert Studierende über alle wichtigen Benachrichtigungen.
|
||||
|
||||
Werden die Informationen der gesamten Hochschule in das System eingetragen, so kann das Postfach lediglich für persönliche und organisatorische Absprachen innerhalb der Hochschule genutzt werden und der administrative Aufwand des E-Mail-Speichers kann aufs Kleinste beschränkt werden.
|
||||
|
||||
|
||||
\subsection{Diskussion}
|
||||
In diesem Kapitel wird das Ergebnis der Arbeit in Bezug auf die Forschungsfrage diskutiert. Au"serdem wird der Prototyp mit einem bereits vorhandenen Framework verglichen und in Bezug darauf eingeordnet.
|
||||
|
||||
Unter Verwendung der entwickelten Erweiterung kann die E-Mail-Flut der Hochschule gedrosselt werden. Die Evaluation anhand eines Probanden zeigt eindeutig das Potenzial, durch eine optimierte Personalisierbarkeit, die Anzahl von Nachrichten zu reduzieren. Anhand der beispielhaften Zählung der im Postfach vorhandenen E-Mails kann zudem festgehalten werden, dass eine Gro"szahl dieser als unnötig für Individuen einzustufen ist. Zu beachten ist jedoch, dass es sich bei der Bewertung nur um eine theoretische Annäherung eines realen Ergebnisses handelt.
|
||||
|
||||
Weitere Schritte, um den Einsatz des Prototypen finalisieren zu können, sind ein ausführliches Testing, was im Rahmen dieser Arbeit nicht untersucht wurde. Unter Beobachtung der einzubindenden Web-Erweiterung kann die Plattform für einen definierten Zeitraum genutzt werden und in Folge dessen eine detaillierte Aussage über die mögliche Reduzierung des Speicheraufwands im Postfach möglich sein.
|
||||
|
||||
Das Ergebnis dieser Arbeit wird im Folgenden mit Eigenschaften des Kursmanagementsystems Moodle verglichen.
|
||||
Die Struktur des Prototypen ist, wie in den oberen Kapiteln bereits erläutert, mit verschieden einordenbaren Tags realisiert. Bestimmte Benutzer können Informationen einpflegen und verwalten. In Moodle ist der Vorgang ähnlich realisiert. Hier können Lehrende Material und Informationen in verschiedenen Lernräumen hochladen. Das System ist, im Gegensatz zum Prototyp, sehr umfangreich. Als Benutzer ist es möglich, sich in diese Lernräume einzutragen und durch die Anmeldung aktuelle Benachrichtigungen zu erhalten. Sind manche Informationen in Moodle nur mit einem extra Passwort zugänglich, so ist das in der Erweiterung dieser Arbeit für alle Benutzer gleich verfügbar (vgl. [Dok15]).
|
||||
|
||||
Die Menge der Daten einer solchen Plattform sind nicht zu unterschätzen. Moodle verwendet unter anderem Caching-Tools und optimierte Prozesse, um die Datenbanken zu befüllen und schnellstmöglich abfragen zu können. In dieser Arbeit liegt der Schwerpunkt hingegen nicht auf der Optimierung einer Datenbank oder dem Verbessern der Performanz.
|
||||
|
||||
Zusammenfassend lässt sich sagen, dass Moodle ein zu umfangreiches Repertoire an Möglichkeiten bietet, im Gegensatz zum entwickelten Prototyp. Alle Funktionen, die in der Web-Erweiterung enthalten sind, lassen darauf schlie"sen, dass unter Betrachtung der Evaluation, der Prototyp zur Reduzierung der E-Mail-Flut beitragen kann.
|
||||
|
||||
|
||||
|
||||
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.
|
||||
@@ -1,10 +1,10 @@
|
||||
\chapter{Framework}
|
||||
\label{ch:framework}
|
||||
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website (vgl. [Ndu17]). Durch den modularen Aufbau ist es selbst für unerfahrene Entwickler möglich die Sprache schnell zu erlernen. Darüber hinaus bringt Python verschiedene Web-Service Tools mit sich, die beim implementieren einer Website viel Zeit sparen und das Aneignen von komplexen Protokollen redundant machen (vgl. [Sol17]).
|
||||
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt, welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und die einfache Syntax ermöglicht eine strukturierte Implementierung der Website (vgl. [Ndu17]). Durch den modularen Aufbau ist es selbst für unerfahrene Entwickler möglich, die Sprache schnell zu erlernen. Darüber hinaus bringt Python verschiedene Web-Service Tools mit sich, die beim Implementieren einer Website viel Zeit sparen und das Aneignen von komplexen Protokollen redundant machen (vgl. [Sol17]).
|
||||
Das dazugehörige Framework Django reduziert den Entwicklungsaufwand eines Prototypen erheblich und ist daher als zielführendes Framework die beste Wahl.
|
||||
|
||||
\section{Django}
|
||||
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse (vgl. [She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert.
|
||||
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse (vgl. [She09]). Durch die direkte Bindung von Daten und der View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -13,17 +13,18 @@ Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermö
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.
|
||||
Der Prozess vom Anfragen der URL über den Server bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.
|
||||
|
||||
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:
|
||||
Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. Das Interface WSGI (Web Server Gateway Interface) 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 Middleware-Klassen aus der \texttt{settings.py} werden geladen
|
||||
\item Die Methoden der Listen Request, View, Response und Excpetion werden geladen
|
||||
\item Die angeforderte URL wird aufgelöst
|
||||
\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 \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.).
|
||||
Der WSGI-Handler fungiert als Pförtner und Manager zwischen dem Web-Server und dem Django-Projekt.
|
||||
Um die URL aufzulösen, benötigt WSGI einen \textit {urlresolver}\footnote{ Urlsresolver verknüpft Url-Muster mit den passenden Views.}
|
||||
(vgl. [Dja18b]). Durch die explizite Zuweisung der vorhandenen Seiten kann dieser über die regulären Ausdrücke der \texttt{url.py}-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (\texttt{views.py}) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Unter anderem ist es möglich auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Anschlie"send 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. Das Template kann dann die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und eine 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
|
||||
@@ -33,27 +34,24 @@ Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen \textit
|
||||
\end{figure}
|
||||
|
||||
\subsection {Besonderheiten Djangos}
|
||||
Das Django-Framework bringt einige Besonderheiten mit sich, die beim implementiern des Prototypen von Bedeutung sind. Diese werden im Folgenden beschrieben.
|
||||
Das Django-Framework bringt einige Besonderheiten mit sich, die beim Implementieren 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, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit
|
||||
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 nutzen, ist dem \textit{Superuser}\footnote{ Superuser ist ein Benutzer, der alle Zugangsrechte im Framework erhält.} 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 Dekoratoren zur Verfügung. Soll eine bestimmte Seite nur von authentifizierten Benutzern besucht werden können, kann die Funktion mit einem Dekorator versehen werden:
|
||||
\\
|
||||
\begin{addmargin}[0pt]{0pt}
|
||||
\noindent\hspace*{10mm}%
|
||||
from django.contrib.auth.decorators import login\_required
|
||||
\texttt{\makeatletter @login\_required}
|
||||
\\
|
||||
Vor der Definition der Funktion wird dann folgende Zeile ergänzt:
|
||||
\\
|
||||
\noindent\hspace*{10mm}%
|
||||
\makeatletter @login\_required
|
||||
\\
|
||||
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.
|
||||
\end{addmargin}
|
||||
Natürlich lassen sich Dekoratoren auch für andere Zwecke vor Funktionen platzieren. Unter anderem werden so die Views vor möglichen Angriffen, wie \textit{Cross-Site-Scripting}\footnote{ Cross-Site-Scripting kann Webseiten verändern oder Passwörter abgreifen.}, 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.
|
||||
Durch den einfachen Aufbau ist es au"serdem möglich, Dekoratoren 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}
|
||||
|
||||
Wird eine prototypische Anwendung gestartet, ist es notwendig, verschiedensten Module zu verwenden und zu testen. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden [Fou18]. Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Sie 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.4) zeigt das Erstellen eines neuen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Kommandozeilenanfang, bedeutet das, diese ist jetzt aktiv.
|
||||
Wird eine prototypische Anwendung gestartet, ist es notwendig, verschiedenste Module zu verwenden und zu testen. Die Versionen dieser Module spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden (vgl. [Fou18]). Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Sie besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal starten. Abbildung 2.3. zeigt das Erstellen eines neuen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environments in Klammern am Kommandozeilenanfang, bedeutet das, dass diese jetzt aktiv ist.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -62,58 +60,54 @@ Wird eine prototypische Anwendung gestartet, ist es notwendig, verschiedensten M
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Um die Pakete und Module kollisionsfrei zu installieren ist es empfehlenswert einen Package-Manager zu verwenden. Mit pip, \glqq rekursives Akronym für pip Install Packages" (vgl. [Wei17, K. 23.1]), 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.
|
||||
|
||||
\subsection{Lightweight Directory Access Protocol}
|
||||
|
||||
Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hier bearbeitende Bachelor-Arbeit eingebunden werden, um später die Login-Daten im Hochschulinternen Netz abfragen zu können. Dies ist ein Internetprotokoll, welches die Kommunikation mit dem 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 (vgl. [Sch17]).
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=0.5\textwidth]{figures/ldap-tree}
|
||||
\caption{Beispiel eines LDAP-Trees [Orc10]}
|
||||
\hfill
|
||||
\end{figure}
|
||||
Um die Pakete und Module kollisionsfrei zu installieren, ist es empfehlenswert, einen Package-Manager zu verwenden. Mit \textit{pip}\footnote{ pip ist das rekursive Akronym für pip Install Packages. } (vgl. [Wei17, K. 23.1]) 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.
|
||||
|
||||
\subsection{Sicherheit}
|
||||
Beim Implementieren einer Website ist das Absichern vor schädlichen Attacken heutzutage unabdingbar. Django aktiviert einige Funktionen zum Schutz bereits beim Projektstart automatisch. Dazu gehört das Abwehren von \textit{Cross-Site-Scripting}, \textit{SQL-Injektion}, \textit{Clickjacking} und die Sicherstellung der \textit{Session-Security}.
|
||||
Beim Implementieren einer Website ist das Absichern vor schädlichen Attacken heutzutage unabdingbar. Django aktiviert einige Funktionen zum Schutz bereits beim Projektstart automatisch. Dazu gehört das Abwehren von \textit{Cross-Site-Scripting}, \textit{SQL-Injektion}\footnote{ SQL-Injection nutzt mangelnde Überprüfung von Metazeichen um Datenbankabfragen zu verändern.}, \textit{Clickjacking}\footnote{ Clickjacking ist eine Überlagerung von Internetseiten um Klicks zu manipulieren.}
|
||||
und die Sicherstellung der \textit{Session-Security}\footnote{ Session-Security setzen Cookies auch für Subdomäne beim Client. }.
|
||||
|
||||
Sollen die Formulare des Prototypen gegen \textit{Cross-Site-Request-Forgery} geschützt werden, muss aktiv ein \textit{Token} im Template gesetzt werden.
|
||||
|
||||
Ein solcher Angriff tritt auf wenn über einen bösartigen Link, eine Formularschaltfläche oder einfach dem eingebettetem JavaScript-Code die Daten im Server verändert werden sollen. Hierbei nutzt der Angreifer die Rechte eines eingeloggten Benutzers und kann somit Informationen im Back-end verfälschen. Um dies zu verhindern wird im Template des Prototypen, zwischen den Form-Tags der \textit{crsf-Token} eingefügt. Der Token setzt einen Cookie mit einer verschlüsselten Zufallszahl. Das Gleiche passiert im Template, wo ein, für den Benutzer nicht sichtbares, Form-Feld die gleiche verschlüsselte Zufallszahl erhält. Beide Zahlen erhalten zudem einen \textit{Salt}, ein generierter Zusatzwert, der das entschlüsseln dieser um ein vielfaches erschwert. Wird ein Request gesendet, vergleicht eine von Django initzialisierte \textit{Middleware} beide Zahlen. Sind diese nicht gleich, hat ein Dritter also die Informationen manipuliert, wird der 403 HTTP-Standart-Statuscode gesendet, welcher besagt, dass der Server eine Anfrage erhalten hat, diese aber nicht erfüllen wird.
|
||||
Der \textit{crsf-Token} greift nur wenn der POST-Request innerhalb der eigenen Website gesendet wird und nicht über URLs, die au"serhalb des Frameworks liegen (vgl. [Fou18a]).
|
||||
Ein solcher Angriff tritt auf, wenn über einen bösartigen Link, eine Formularschaltfläche oder einfach den eingebettetem JavaScript-Code die Daten im Server verändert werden sollen. Hierbei nutzt der Angreifer die Rechte eines eingeloggten Benutzers und kann somit Informationen im Backend verfälschen. Um dies zu verhindern, wird im Template des Prototypen zwischen den Form-Tags der \textit{crsf-Token}\footnote{ Token sind Komponente die eine Zugriffskontrolle von Benutzer druchführen können.}
|
||||
eingefügt. Der Token setzt einen Cookie mit einer verschlüsselten Zufallszahl. Das Gleiche passiert im Template, wo ein für den Benutzer nicht sichtbares Form-Feld die gleiche verschlüsselte Zufallszahl erhält. Beide Zahlen erhalten zudem einen \textit{Salt}, einen generierten Zusatzwert, der das Entschlüsseln dieser um ein vielfaches erschwert. Wird ein Request gesendet, vergleicht eine von Django initialisierte \textit{Middleware}\footnote{ Middleware ist ein Plug-in, dass Anfrage- und Antwortverarbeitung durchführt.} beide Zahlen. Stimmen diese nicht überein, hat also ein Dritter die Informationen manipuliert, wird der 403 HTTP-Standard-Statuscode gesendet, welcher besagt, dass der Server eine Anfrage erhalten hat, diese aber nicht erfüllen wird.
|
||||
Der \texttt{crsf-Token} greift nur, wenn der POST-Request innerhalb der eigenen Website gesendet wird und nicht über URLs, die au"serhalb des Frameworks liegen (vgl. [Fou18a]).
|
||||
|
||||
\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. Eine Vielzahl an Bibliotheken wurden für diese Arbeit getestet, aber wegen mangelnder Kompatibilität oder Funktionalität als nicht hilfreich erachtet und werden deshalb hier nicht weiter erwähnt.
|
||||
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 Bewertungen an. Eine Vielzahl an Bibliotheken wurden für diese Arbeit getestet, aber wegen mangelnder Kompatibilität oder Funktionalität als nicht hilfreich erachtet und deshalb hier nicht weiter erwähnt.
|
||||
Die im Folgenden aufgeführten Bibliotheken sind im Prototyp zur Anwendung gelangt.
|
||||
|
||||
\subsection {Taggable-Manager}
|
||||
Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. Der darin enthaltene Taggable Manager verwendet Django's Contenttype Framework, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder app\_label und model machen die Modelle eindeutig zuweisbar. Instanzen des Contenttypes präsentieren und speichern die Informationen und Erstellen automatisch neue Instanzen, wenn Modelle hinzugefügt werden. Zudem stehen Methoden zur Verfügung, die das Abrufen und Arbeiten mit Instanzen der einzelnen Modelle erleichtern.
|
||||
Um die Artikel besser priorisieren und die Informationsflut für Benutzer reduzieren zu können, wird im Prototyp mit Schlagwörtern gearbeitet. Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. Der darin enthaltene Taggable Manager setzt Django's Contenttype Framework ein, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder \texttt{app\_label} und \texttt{model} machen die Modelle eindeutig zuweisbar. Instanzen des Contenttyps 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 (vgl. [Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen lookup-Tabelle notwendig, die die Entitäten zweier Tabellen direkt verlinkt, anstatt diese generische zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass er Zugriff auf diese einheitlich geschieht. Au"serdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern.
|
||||
Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden (vgl. [Her16]). Durch die Verwendung eines echten Fremdschlüssels kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen \textit{Lookup-Tabelle}\footnote{ Eine Lookup-Tabelle speichert Daten statisch im Verhältnis zueinander.} notwendig, die die Entitäten zweier Tabellen direkt verlinkt, statt sie generisch zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass der Zugriff darauf einheitlich geschieht. Au"serdem ist es möglich, Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern.
|
||||
|
||||
Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile eingefügt (vgl. [Gay10]):
|
||||
Um django-taggit zu installieren, wird der folgende Befehl in die Kommandozeile eingefügt (vgl. [Gay10]):
|
||||
\\
|
||||
\begin{addmargin}[0pt]{0pt}
|
||||
\noindent\hspace*{10mm}%
|
||||
{\tt \$ pip install django-taggit }
|
||||
\texttt{\$ pip install django-taggit }
|
||||
\\
|
||||
Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert.
|
||||
Au"serdem muss taggit in der settings.py unter INSTALLED\_APPS ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschreiben werden.
|
||||
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.
|
||||
\end{addmargin}
|
||||
Im ˜\texttt{model.py} wird das Feld \texttt{tag} neu erstellt und als Taggable Manager definiert.
|
||||
Au"serdem muss taggit in der \texttt{settings.py} unter \texttt{INSTALLED\_APPS} ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschrieben werden.
|
||||
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde und neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jede Eingabe, die durch ein Komma oder ein Leerzeichen getrennt ist als einen Tag. Soll der Tag jedoch aus mehreren Wörtern bestehen, so müssen diese mit Anführungszeichen umfasst werden. Standardmä"sig unterscheidet der Taggable Manager zwischen Gro"s- und Kleinschreibung, Tags sind also case sensitive.
|
||||
|
||||
\subsection {Hilfsbibliotheken}
|
||||
---warum habe ich diese bibs gealden (beschreibung evtl in prototyp)
|
||||
Weitere Add-ons werden geladen um kleinere Funktionen der Website einfach umsetzen zu können. Zu diesen gehört django-taggit-templatetags, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Tags öfters vor als andere, so werden sie entsprechend grö"ser dargestellt.
|
||||
Weitere Add-ons werden geladen, um kleinere Funktionen der Website einfach umsetzen zu können.
|
||||
|
||||
Django-hitcount dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der HitCountDetailView in views.py die Variable hitcount verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der settings.py ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.
|
||||
Zu diesen gehört \texttt{django-taggit-templatetags}, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Schlagwörter öfter vor als andere, so werden sie entsprechend grö"ser dargestellt.
|
||||
|
||||
Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich django-post-office (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt werden, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Die Benachrichtigungen können asynchron versendet werden mit einem integrierten Planungsmanager. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.
|
||||
\texttt{Django-hitcount} dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Es lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten, so kann durch das integrieren der \texttt{HitCountDetailView} in \texttt{views.py} die Variable \texttt{hitcount} verwenden und im Frontend ausgeben. Eine weitere 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 von der View und vom Template. Die im Add-on integrierten Einstellungen, die in der \texttt{settings.py} ergänzt werden müssen, ermöglichen unter anderem das Begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.
|
||||
|
||||
Zum Versenden und Verwalten von E-Mails in Django eignet sich \texttt{django-post-office} (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Template angelegt, Anhänge verwaltet und das Versenden dieser im Log überprüft werden. Es ist möglich die Benachrichtigungen mithilfe eines eines Shell-Skript des Frameworks \texttt{Cron}\footnote{ Cron dient zur zeitbasierten Ausführung von definierten Aufgaben.} asynchron zu versenden. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.
|
||||
|
||||
|
||||
\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 (vgl. [Ott11]). 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 (vgl. [Ott12]).
|
||||
Um die Usability des Prototyps zu erhöhen, wird das Framework Bootstrap eingebunden.
|
||||
|
||||
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 (vgl. [Boo12]).
|
||||
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte (vgl. [Ott11]). Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen Programmierern weiterentwickelt und ist somit stark gewachsen. Ab Version 2.0 verfügt diese über die Fähigkeit, Websites \textit{responsiv}\footnote{ Responsive Webseiten sind auf allen Endgeräten angepasst darstellbar.} auf verschiedenste mobile Endgeräte anzupassen (vgl. [Ott12]).
|
||||
|
||||
Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen implizieren. 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 im head-tag einer HTML-Datei (vgl. Abbildung 2.4.) einfach eingebunden werden. Das bedeutet, dass \textit{Media-Queries}\footnote{ Media-Qeries setzen statische Umbrüche um Layouts verschiedener Endgeräte anzupassen.} 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 (vgl. [Boo12]).
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -122,7 +116,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, 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.).
|
||||
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. Bootstrap lässt sich umfangreicher nutzen, indem Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eingetragen werden (vlg. Abbildung 2.5.).
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -131,5 +125,5 @@ Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles berei
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben muss eine eigens verfasste CSS-Datei nach der Verlinkung von Bootstrap in die Website eingebunden werden. Der Parser liest die Datei von oben nach unten, Links nach Rechts. Liest dieser also zu erst die Bootstrap Bibliothek und speichert diese, so überschreiben die Styles die danach kommen, die bereits gelesenen Eingaben. Die Styles, die inline auf ein Tag angewendet werden sind somit die bestimmenden Eigenschaften. Natürlich sollten Stildefinitionen niemals inline eingepflegt werden, da dies zu einem sehr unübersichtlichen und wartungsintensiven Code führen.
|
||||
Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben, muss eine eigens verfasste CSS-Datei nach der Verlinkung von Bootstrap in die Website eingebunden werden. Der Parser liest die Datei von oben nach unten, links nach rechts. Liest dieser also zu erst die Bootstrap Bibliothek und speichert diese, so überschreiben die Styles, die danach kommen, die bereits gelesenen Eingaben. Die Styles, die inline auf ein Tag angewendet werden, sind somit die bestimmenden Eigenschaften.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
\chapter{Prototyp}
|
||||
\label{ch:prototyp}
|
||||
Um die wissenschaftliche Frage, nicht nur zu beantworten, sondern zu beweisen, wird in dieser Arbeit die Methode des Prototypings genutzt. Der Prototyp dient zum experimentellen Arbeiten und sichert eine strukturell fundierte Umsetzung des darauf folgenden Endprodukts. Der Fokus liegt dabei zunächst auf der Funktionalität der Anwendung. Prototyping wird als bevorzugte Methode gewählt um schnell ein Ergebnis zu erzielen (vgl. [Abr16]). Zudem soll aufbauend auf Diesem ein Produkt realisiert werden, das als Erweiterung in das Netzwerk der Hochschule integriert werden soll.
|
||||
Um die Forschungsfrage zu prüfen, wird in dieser Arbeit die Methode des Prototypings genutzt. Der Prototyp dient zum experimentellen Arbeiten und sichert eine strukturell fundierte Umsetzung des Endprodukts. Der Fokus liegt dabei zunächst auf der Funktionalität der Anwendung. Prototyping wird als bevorzugte Methode gewählt, um schnell ein Ergebnis zu erzielen (vgl. [Abr16]). Zudem soll darauf aufbauend ein Produkt realisiert werden, das als Erweiterung in das Netzwerk der Hochschule integriert wird.
|
||||
|
||||
\section{Forschungsdesign}
|
||||
Das Kapitel zeigt eine kurze Übersicht der Vorgehensweise und den Leitfaden an den sich die Implementierung des Prototyps anlehnt (vgl. Abbildung 3.1.).
|
||||
Zu Beginn der Arbeit wird, des sich aus der Forschungsfrage ergebenden Problems analysiert und alle wichtigen Anforderungen erfasst. Dies bildet die Basis für alle weitern notwendigen Schritte um am Ende eine sinnvolle Lösung bereitstellen zu können. Die Recherche dient der Sammlung aller notwendigen Werkzeuge und gibt einen Überblick über verschiedene Hilfsbibliotheken. Das Implementieren der Applikation kann nun auf Basis der Recherche durchgeführt werden. Dazu gehört das Testen verschiedener Bibliotheken und Erweiterungen um die bestmögliche Ergebnis zu eruieren. Abschlie"send wird die Funktionalität des Prototypen getestet und evaluiert ob die Forschungsfrage ausreichend beantwortet wird. Handlungsempfehlungen und mögliche Funktionen zum Erweitern finalisieren die Arbeit.
|
||||
Dieses Kapitel veranschaulicht eine kurze Übersicht der Vorgehensweise und den Leitfaden, an den sich die Implementierung des Prototyps anlehnt (vgl. Abbildung 3.1.).
|
||||
Zu Beginn der Arbeit wird das sich aus der Forschungsfrage ergebenden Problem analysiert und es werden alle wichtigen Anforderungen erfasst. Dies bildet die Basis für alle weitern notwendigen Schritte, um am Ende eine sinnvolle Lösung bereitstellen zu können. Die Recherche dient der Sammlung aller notwendigen Werkzeuge und gibt einen Überblick über verschiedene Hilfsbibliotheken. Die Implementierung der Applikation kann nun auf Basis der Recherche durchgeführt werden. Dazu gehört das Testen verschiedener Bibliotheken und Erweiterungen, um das bestmögliche Ergebnis zu eruieren. Abschlie"send wird die Funktionalität des Prototypen getestet und evaluiert, ob die Forschungsfrage ausreichend beantwortet wird. Handlungsempfehlungen und mögliche Funktionen zum Erweitern finalisieren die Arbeit.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -15,48 +15,38 @@ Zu Beginn der Arbeit wird, des sich aus der Forschungsfrage ergebenden Problems
|
||||
|
||||
\section{Organisation}
|
||||
|
||||
Zum Entwickeln des Prototypen wird die Open-Source- Entwicklungsumgebung Visual Studio Code von Microsoft verwendet. Die dynamische Oberfläche ist sehr performant, da sie wenig Speicherplatz bedarf und zunächst ohne grö"sere Ergänzungen sofort einsetzbar ist. Um den Code mit Shortcuts übersichtlicher zu gestalten und auf Python und Django abstimmen zu können werden aus der üppigen Extension-Bibliothek kostenlose Erweiterungen eingebunden. Unter Anderem sind die folgenden Add-on's während der Arbeit zum Einsatz gekommen (vgl. [Mic18]):
|
||||
|
||||
\begin{itemize}
|
||||
\item Python von Microsoft (Linting und Debugging)
|
||||
\item MagicPython von MagicStack Inc. (Syntax-Highlighter)
|
||||
\item Python Extension Pack (Django Code-Vervollständigung)
|
||||
\end{itemize}
|
||||
|
||||
Der entwickelte Syntax wird regelmä"sig auf das hochschulinterne Git-Repository geladen. Hier kann man mit Hilfe der verwendeten IDE bei der Überarbeitung im sogenannten \texttt{Working-Tree} die Änderungen visuell einsehen und wenn nötig bearbeiten. Es wird ausschlie"slich auf den Master-Branch gepusht, da nur ein Entwickler an dem Prototyp tätig ist. Lediglich zum Testen experimenteller Bibliotheken werden neue Branches angelegt und diese, falls Sie sich als hilfreich erweisen, mit dem Master-Branch fusionieren.
|
||||
|
||||
Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird dies im folgenden genauer beschrieben. Die unterste Projektebene wird durch die manage.py-Datei gebildet. Sie wird unter Anderem genutzt um den lokalen Server starten zu können. In der Ebene darüber findet sich im Ordner \texttt{mysite} die Datei settings.py. Hier werden die allgemeinen Einstellungen der Website vorgenommen, wie zum Beispiel das Integrieren der Erweiterungen und der Pfad zu den hinterlegten Templates. Au"serdem ist die urls.py dort zu finden, deren Funktion bereits im Kapitel Django erläutert wurde. Die \texttt{\_\_init\_\_.py} und wsgi.py sind trivial und deshalb wird hier nicht weiter darauf eingegangen. Im Ordner \texttt{thisisenv} sind alle Bibliotheken und Add-on's der virtuellen Umgebung hinterlegt. Der Fokus dieser Arbeit liegt im Ordner \texttt{application}. Hier sind die Datenbank-Migrationen, die Static-Files wie bootstrap und css, und alle Templates abgelegt. Zudem befindet sich hier die Logik des Prototypen, auf die im Kapitel \texttt{Funktionen} weiter eingegangen wird.
|
||||
Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird die Struktur im Folgenden genauer beschrieben. Die unterste Projektebene wird durch \texttt{manage.py} gebildet. Sie wird unter anderem genutzt, um den lokalen Server starten zu können. In der Ebene darüber findet sich im Ordner \texttt{mysite} die Datei \texttt{settings.py}. Hier werden die allgemeinen Einstellungen der Website vorgenommen, wie zum Beispiel das Integrieren der Erweiterungen und der Pfad zu den hinterlegten Templates. Au"serdem ist die \texttt{urls.py} dort zu finden, deren Funktion bereits im Kapitel Django erläutert wurde. Im Ordner \texttt{thisisenv} sind alle Bibliotheken und Add-ons der virtuellen Umgebung hinterlegt. Der relevanteste Teil dieser Arbeit liegt im Ordner \texttt{application}. Hier sind die Datenbank-Migrationen, die Static-Files wie bootstrap und css, und alle Templates abgelegt. Zudem befindet sich hier die Logik des Prototypen, auf die im Kapitel \texttt{Funktionen} weiter eingegangen wird.
|
||||
|
||||
|
||||
\subsection{Datenmodellierung}
|
||||
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen dessen werden hier genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \texttt{UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \texttt{PostModel} und abschlie"send werden die Zusammenhänge der Modelle dargestellt.
|
||||
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen desselben werden genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \texttt{UserModel} eingegangen, danach veranschaulicht der zweite Abschnitt das \texttt{PostModel} und abschlie"send werden die Zusammenhänge der Modelle dargestellt.
|
||||
|
||||
Alle Modelle werden als Django-Modelle deklariert um beim kompilieren des Codes dem Compiler mitzuteilen, dass diese integriert werden müssen (vgl. [Dja18]). Mit der folgenden Eingabe
|
||||
Alle Modelle werden als Django-Modelle deklariert um beim Kompilieren des Codes dem Compiler mitzuteilen, dass eine Integration stattfinden muss (vgl. [Dja18a]). Mit der Eingabe
|
||||
\\
|
||||
\begin{addmargin}[0pt]{0pt}
|
||||
\noindent\hspace*{10mm}%
|
||||
\texttt{ \$ python3 manage.py makemigrations}
|
||||
\\
|
||||
\end{addmargin}
|
||||
werden die neun Tabellen der Modelle erstellt. Um diese dann auch anwenden zu können, muss der Befehl
|
||||
werden die neun Tabellen der Modelle erstellt. Zur letztendlichen Migration wird
|
||||
\\
|
||||
\begin{addmargin}[0pt]{0pt}
|
||||
\noindent\hspace*{10mm}%
|
||||
\texttt{ \$ python3 manage.py migrate}
|
||||
\\
|
||||
\end{addmargin}
|
||||
darauffolgend ebenso in die Kommandozeile eingegeben werden.\\
|
||||
ausgeführt.\\
|
||||
|
||||
|
||||
\textbf{UserModel:}
|
||||
\begin{addmargin}[25pt]{0pt}
|
||||
Hierbei ist das Authentifizierungssystem von Django mit einem \texttt{UserModel} bereits angelegt. Dies muss für den Prototyp um das Feld \texttt{tags} erweitert werden, sodass ein Benutzer folgende Felder aufweist (vgl. [Fou18a]):
|
||||
Hier ist das Authentifizierungssystem von Django mit einem \texttt{UserModel} bereits angelegt. Dieses muss für den Prototyp um das Feld \texttt{tags} erweitert werden, sodass ein Benutzer folgende Felder besitzt (vgl. [Fou18a]):
|
||||
\begin{itemize}
|
||||
\item username, fist\_name, last\_name, email, groups, user\_permissions, is\_staff, is\_active, is\_superuser, last\_login, date\_joined, tags
|
||||
\end{itemize}
|
||||
Das Feld \texttt{groups} wird in dieser Arbeit nicht verwendet und deshalb im Folgenden ignoriert.
|
||||
|
||||
In models.py ist der \texttt{CustomUser} dafür verantwortlich das neue Feld mit dem \texttt{Default-User} zu verknüpfen. Durch das \texttt{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \texttt{OneToOne} bildet eine einzigartige Zuordnung von zwei Objekten, sodass der Rückgabewert nur aus einem Objekt besteht (vgl. [Fou18a]). Das hei"st, dass hier keine Rekursiven, also auf sich selbst verlinkende oder \texttt{lazy} Beziehungen möglich sind um Konflikte bei der Authentifizierung zu vermeiden. Dies ist die übliche Vorgehensweise um mit einem Primärschlüssel das Default-Model zu erweitern. \\
|
||||
In models.py ist der \texttt{CustomUser} dafür verantwortlich, das neue Feld mit dem \texttt{Default-User} zu verknüpfen. Durch das \texttt{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \texttt{OneToOne} bildet eine einzigartige Zuordnung von zwei Objekten, sodass der Rückgabewert eindeutig ist. Das hei"st, dass hier keine rekursiven, auf sich selbst verlinkende oder \texttt{lazy} Beziehungen möglich sind, um Konflikte bei der Authentifizierung zu vermeiden. Dies ist die übliche Vorgehensweise, um mit einem Primärschlüssel das Default-Model zu erweitern (vgl. [Fou18a]). \\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{figures/custommodelcode}
|
||||
@@ -69,11 +59,11 @@ In models.py ist der \texttt{CustomUser} dafür verantwortlich das neue Feld mit
|
||||
|
||||
\textbf{PostModel:}
|
||||
\begin{addmargin}[25pt]{0pt}
|
||||
Das \texttt{PostModel} beschreibt alle Felder die ein Post enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com gehören dazu folgende:
|
||||
Das \texttt{PostModel} beschreibt alle Felder, die ein Artikel enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com (vgl. [Dja18b]) gehören dazu folgende:
|
||||
\begin{itemize}
|
||||
\item author, title, text, created\_date, published\_date, tags
|
||||
\end{itemize}
|
||||
Der Autor ist durch einen \texttt{ForeignKey} mit dem \texttt{UserModel} verbunden. Diese sogenannte \texttt{ManyToOne} Verbindung reicht hier aus um einem Post den Autor, also dem eingeloggten User, zuzuweisen. Title ist ein \texttt{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wir deshalb als \texttt{TextField} deklariert. Erstellungsdatum und Publikation sind beides \texttt{DateTimeField}s. Ersteres muss vom Ersteller angegeben werden, Zweiteres kann zunächst offen gelassen werden durch die Zusatzangabe \texttt{null=True}. Ein weiteres Feld tags wird hinzugefügt um den Posts unabhängig von den Usern Tags zuordnen zu können.
|
||||
Der Autor ist durch einen \texttt{ForeignKey} mit dem \texttt{UserModel} verbunden. Diese \texttt{ManyToOne} Verbindung reicht hier aus, um einem Post einem Autor, also dem eingeloggten User, zuzuweisen. \texttt{Title} ist ein \texttt{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wird deshalb als \texttt{TextField} deklariert. Erstellungsdatum und Publikation sind \texttt{DateTimeFields}. Ersteres muss vom Ersteller angegeben werden, zweiteres kann zunächst durch die Zusatzangabe \texttt{null=True} offen gelassen werden. Ein weiteres Feld wird hinzugefügt, um Artikeln unabhängig von Usern Tags zuordnen zu können.
|
||||
\\
|
||||
\end{addmargin}
|
||||
|
||||
@@ -81,35 +71,35 @@ Der Autor ist durch einen \texttt{ForeignKey} mit dem \texttt{UserModel} verbund
|
||||
\textbf{Gesamtmodellierung:}
|
||||
|
||||
\begin{addmargin}[25pt]{0pt}
|
||||
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \texttt{User} und \texttt{Post}. Au"serdem verdeutlicht es die Erweiterung des User-Modells von Django mit dem in der Applikation angelegtem CustomUser. Die im User vorkommenden booleschen Felder werden im Kapitel Berechtigung der User genauer erörtert.
|
||||
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \texttt{User} und \texttt{Post}. Au"serdem verdeutlicht es die Erweiterung des User-Modells von Django mit dem in der Applikation angelegten \texttt{CustomUser}. Die im User vorkommenden \textit{booleschen Felder} werden im Kapitel \glqq Berechtigungen der User" genauer erörtert.
|
||||
\end{addmargin}
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{figures/datamodel}
|
||||
\caption{Datenmodellierung von \texttt{User} und \texttt{Post}}
|
||||
\hfill
|
||||
\end{figure}
|
||||
\end{addmargin}
|
||||
|
||||
\subsection{Berechtigungen der User}
|
||||
Im Allgemeinen verwendet man Berechtigungen, um Benutzern Zugang zu bestimmten Resourcen in einem Netzwerk einzuräumen. Au"serdem bestimmt eine Staffelung die Art des Zugangs, ob der User die Resourcen nur lesen, verändern oder löschen darf (vgl. [Com18]). Die Rechte werden meist einzelnen Individuen oder einer Gruppe zugeordnet.
|
||||
|
||||
\subsection{Verwaltung im Administrator-Back-end}
|
||||
In diesem Kapitel wird beschrieben wie das Administrations-back-end genutzt werden kann. Es ist jedoch zu beachten, dass die Applikation vorwiegend von Dozenten und Angestellten der Hochschule ohne Administratorrechte verwendet werden soll. Die gestaffelten Berechtigungen werden im Kapitel Berechtigung der User genauer beschreiben.
|
||||
Das gestaffelte Berechtigungsmanagement ist im Prototyp notwendig, um den Umgang mit Informationen so sicher wie möglich zu gestalten und um die Nachhaltigkeit dieser zu bewahren. Des Weiteren soll der Prototyp als Vorlage für die Erweiterung der Hochschulwebsite dienen und daher ist eine, zur Hochschule ähnliche Verteilung der Zugangsberechtigungen sinnvoll.
|
||||
|
||||
Ein Django-Projekt bildet bereits beim Einrichten, \texttt{per Default}, eine Administrator-Oberfläche um die Inhalte der Website kontrollieren zu können. Nach der Migration von den oben genannten Modellen wird diese erweitert. Nich zu vergessen sind die externen Tabellen der installierten Add-on's, die nach der Migration das Back-end expandieren.
|
||||
Studenten sollen zunächst Informationen weder einpflegen noch editieren dürfen. Die einzigen Änderungen, die sie vornehmen können, sind auf ihre eigene Datenbank fokussiert. Dazu gehört das Hinzufügen von Tags, durch die damit verlinkten Beiträge das persönliche Dashboard befüllt wird. Dies soll verhindern, dass Informationen zu leichtfertig geändert oder gelöscht werden.
|
||||
|
||||
Dozenten und Angestellte der Hochschule sind dazu berechtigt, Posts zu erstellen, zu editieren und wieder zu löschen. Zudem können sie, wie Studenten, Tags abonnieren und das persönliche Dashboard gestalten. Das Einloggen in die Administratoroberfläche kann durchgeführt werden, jedoch sind der Gruppe noch keinerlei Rechte zugewiesen. Möchte man das ändern, kann man das von Django bereitgestellte Feld \texttt{User Permissions} im Admin-Backend unter \texttt{Users} finden, und dem Namen der Person die gewünschte Berechtigung zuteilen. Diese sind von Django vorgegeben und betreffen alle vorhandenen Modelle der Applikation.
|
||||
Durch das Setzen des booleschen Wert \texttt{is\_staff} auf \texttt{True} beim Erstellen der Benutzer ist es möglicha im Code der Applikation Abfragen durchzuführen. Dadurch lassen sich bestimmte Views an die eingeloggte Personengruppe anpassen. So ist unter Anderem das Menü der Dozenten und Angestellten etwas umfangreicherer als das der Studierenden (vgl. Abbildung 3.4.).\\
|
||||
|
||||
\subsection{Berechtigung der User}
|
||||
Im Allgemeinen verwendet man Berechtigungen um Benutzern Zugang zu bestimmten Resourcen in einem Netzwerk einzuräumen. Au"serdem bestimmt es die Arte des Zugangs, also ob der User die Resourcen nur lesen oder auch verändern oder löschen darf(vgl. [Com18]). Die Rechte werden meist einzelnen Individuen oder einer Gruppe zugeordnet.
|
||||
|
||||
Das gestaffeltes Berechtigungsmanagement ist im Prototyp notwendig um den Umgang mit Informationen so sicher wie möglich zu gestalten und um die Nachhaltigkeit dieser zu bewahren. Des Weiteren soll der Prototyp als Vorlage für die Erweiterung der Hochschulwebsite dienen und daher ist eine ähnliche Verteilung der Zugangsberechtigungen sinnvoll.
|
||||
|
||||
Studenten sollen zunächst Informationen weder einpflegen, noch editieren dürfen. Die einzigen Änderungen die sie vornehmen können sind auf Ihre eigene Datenbank fokussiert. Das Hinzufügen von Tags um die damit verbunden Posts auf dem persönlichen Dashboard zu sehen wird ihnen gewährleistet. Dies soll verhindern, dass Informationen nicht zu leichtfertig geändert oder gelöscht werden.
|
||||
|
||||
Dozenten und Angestellte der Hochschule sind dazu berechtigt, Posts zu erstellen, zu editieren und wieder zu löschen. Zudem können sie, wie Studenten, Tags abonnieren und somit ebenso das persönliche Dashboard gestalten. Das Einloggen in die Administratoroberfläche kann vorgenommen werden, jedoch sind der Gruppe noch keinerlei Rechte zugewiesen. Möchte man dies ändern, kann man das von Django bereitgestellte Feld \texttt{User Permissions} im Admin-back-end unter Users, und dem Namen der Person, die gewünschte Berechtigung zuteilen. Diese sind von Django vorgegeben und betreffen alle vorhandenen Modelle der Applikation. Soll ein User zum Beispiel erlaubt sein einen Tag aus dem Archiv zu löschen, so wählt er das Feld \texttt{ taggit \textbar Tag \textbar can delete Tag} und schiebt es von der Auswahl zu den Berechtigungen.
|
||||
Durch das Setzen des booleschen Wert \texttt{is\_staff} auf \texttt{True} beim Erstellen der Benutzer, ist es möglich im Code der Applikation Abfragen durchzuführen. Dadurch lassen sich bestimmte Views an die eingeloggte Personengruppe anpassen. So ist das Menü für Dozenten und Angestellte ein umfangreicheres als das, der Studenten.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{figures/menuadmin}
|
||||
\caption{Menü für eingeloggte Benutzer mit Adminrechte}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
\section{Funktionen}
|
||||
Um die wichtigsten Funktionen des Prototypen festlegen zu können werden User Stories erstellt (vgl. Abbildung 3.4.). Diese bestehen aus kurzen Sätzen und beschreiben aus Sicht des Nutzers das Verwenden einer Funktion. Die Priorisierung bezieht sich hierbei auf die Relevanz der Funktion, wobei die Funktionen mit einem rotem Punkt sehr wichtig für den Prototypen sind, Orang wichtige Funktionen sind aber nicht unbedingt notwendig und Grün kaum relevant sind. \\
|
||||
Um die wichtigsten Funktionen des Prototypen festlegen zu können, werden User Stories erstellt (vgl. Abbildung 3.5.). Diese bestehen aus kurzen Sätzen und beschreiben aus Sicht des Nutzers das Verwenden einer Funktion. Die Priorisierung bezieht sich hierbei auf die Relevanz der Funktion, wobei die Funktionen mit einem rotem Punkt sehr wichtig für den Prototypen sind, Orangene wichtige Funktionen sind, aber nicht unbedingt notwendig, und Grüne kaum Relevanz haben. \\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -118,30 +108,37 @@ Um die wichtigsten Funktionen des Prototypen festlegen zu können werden User St
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
\subsection{Verwalten}
|
||||
Das Verwalten der Artikel soll von berechtigten Nutzern im Front-end stattfinden, hingegen die prozessuale Logik im Code-Back-end passiert. Der Vorgang des Erstellens, des Löschens und des Editierens der einzelnen Einträge wird im Folgenden konkretisiert.
|
||||
\subsection{Verwaltung der Funktionen}
|
||||
Das Verwalten der Artikel soll von berechtigten Nutzern im Frontend stattfinden, während die prozessuale Logik im Code-Backend realisiert ist. Der Vorgang des Erstellens, des Löschens und des Editierens der einzelnen Einträge wird im Folgenden konkretisiert.
|
||||
\\
|
||||
\\
|
||||
Einen neuen Artikel erstellen:
|
||||
\textbf{Einen neuen Artikel erstellen: }
|
||||
|
||||
Das \texttt{+} in der Menüleiste leitet den Benutzer zu einer Unterseite. Hier können alle Felder befüllt werden, die im PostForm-Formular in der Datei forms.py festgelegt wurden. Dazu gehören der Titel und der Text, die als Pflichtfelder gelten. Das Feld \texttt{Tags} muss ebenfalls mindestens einen Wert enthalten um die Validierung der Eingaben sichern zu können. Eine Ausnahme bildet das Datum der Veröffentlichung. Bleibt das Feld leer so wird der Post automatisch der Liste der Entwürfe beigefügt.
|
||||
Das \texttt{+} in der Menüleiste leitet den Benutzer zu einer Unterseite. Hier können alle Felder befüllt werden, die im \texttt{PostForm}-Formular in der Datei \texttt{forms.py} festgelegt wurden. Dazu gehören der Titel und der Text, die als Pflichtfelder gelten. Das Feld \texttt{Tags} muss ebenfalls mindestens einen Wert enthalten, um die Validierung der Eingaben sichern zu können. Eine Ausnahme bildet das Datum der Veröffentlichung. Bleibt das Feld leer, so wird der Beitrag automatisch der Liste der Entwürfe beigefügt.
|
||||
|
||||
Speichert der Benutzer nun den Artikel, so werden im Back-end die Daten wir folgt verarbeitet. In der View \texttt{post\_new} wird zunächst die Validität aller Eingaben geprüft. Falls dies der Fall ist, wird der Post als Objekt zurückgegeben, jedoch durch das optionale Keywort \texttt{commit=false} noch nicht in der Datenbank abgelegt. Das ist notwendig um dem Objekt spezifische Informationen mitzugeben. In diesem Kontext wird der aktuell eingeloggte User als Autor hinterlegt. Jedoch birgt die Vorgehensweise eine Problematik im Speichervorgang einer \texttt{ManyToMany} Relation zwischen zwei Modellen. Da Informationen nur auf ein bereits in der Datenbank bestehendes Objekt gesichert werden können ist dies zunächst nicht möglich (vgl. [Fou18b]).
|
||||
Im Prototyp nutzt das \texttt{PostModel} die \texttt{ManyToMany} Konnektivität mit dem Modell des TaggabelManagers. Um die Eingabe des Tag-Felds trotzdem im neuen Artikel speichern zu können, wird zunächst das Objekt gespeichert, um nachdem explizit das von Django zur Verfügung gestellte \texttt{form.save\_m2m()} aufrufen zu können. Dieser Befehl zwingt die Daten der \texttt{ManyToMany} Relation zu speichern.
|
||||
Speichert der Benutzer den Artikel, so werden im Backend die Daten wie folgt verarbeitet. In der View \texttt{post\_new} wird zunächst geprüft, ob alle Eingaben valide sind. Falls dies der Fall ist, wird der jeweilige Beitrag als Objekt zurückgegeben, jedoch durch das optionale Keywort \texttt{commit=false} noch nicht in der Datenbank gespeichert. Das ist notwendig, um dem Objekt spezifische Informationen mitzugeben. In diesem Kontext wird der aktuell eingeloggte User als Autor hinterlegt. Jedoch birgt die Vorgehensweise eine Problematik im Speichervorgang einer \texttt{ManyToMany} Relation zwischen zwei Modellen. Da Informationen nur auf ein bereits in der Datenbank bestehendes Objekt gesichert werden können, ist dies zunächst nicht möglich (vgl. [Fou18b]).
|
||||
Im Prototyp nutzt das \texttt{PostModel} die \texttt{ManyToMany} Konnektivität mit dem Modell des \texttt{TaggabelManagers}. Um die Eingabe des Tag-Felds trotzdem im neuen Artikel speichern zu können, wird zunächst das Objekt gespeichert, um danach explizit das von Django zur Verfügung gestellte \texttt{form.save\_m2m()} aufrufen zu können. Der Befehl zwingt die Daten der \texttt{ManyToMany} Relation zu speichern.
|
||||
|
||||
Die eindeutige Zuordnung der Eingabe im Front-end zur Verarbeitung der Artikel im Back-end ist mit einem \texttt{Primary Key} realisiert. Das \texttt{PostModel} bekommt beim Anlegen keinen solchen Schlüssel zu einem Feld zugewiesen. Ist das der Fall, erstellt Django automatisiert beim Speichern der Tabelle diesen als \texttt{AutoField} im Feld \texttt{Id} und zählt bei jedem neu Erstellen eines Objekts hoch. Somit sind alle Objekte eindeutig zuordenbar und können mit dem Kommando \texttt{post.pk} jederzeit aufgerufen werden.
|
||||
Die eindeutige Zuordnung der Eingabe im Frontend zur Verarbeitung der Artikel im Backend ist mit einem \texttt{Primary Key} realisiert. Das \texttt{PostModel} bekommt beim Anlegen keinen Schlüssel zu einem Feld zugewiesen. Django erstellt ihn automatisiert beim Speichern der Tabelle als \texttt{AutoField} im Feld \texttt{Id} und identifiziert die \texttt{Id} automatisch bei jedem neu Erstellen eines Objekts. Somit sind alle Objekte eindeutig zuordenbar und können mit dem Kommando \texttt{post.pk} jederzeit abgefragt werden.
|
||||
\\
|
||||
\\
|
||||
Einen bereits vorhandenen Artikel löschen:
|
||||
\textbf{Einen bereits vorhandenen Artikel löschen: }
|
||||
|
||||
In der Detailansicht eines Artikels ist es möglich diesen durch klicken auf den Button Löschen zu entfernen. Die View \texttt{post\_remove} selektiert über den im Template mitgegebenen \texttt{Primary Key} das Objekt und speichert dies in der Variable \texttt{post}. Um dem Benutzer nochmals mitteilen zu können, welchen Artikel er entfernt hat, wird vor dem Löschen eine Nachricht mit dem Titel dessen generiert. Nachdem wird dieser gelöscht (\texttt{post.remove()}) und eine Umleitung am Ende der View-Definition schickt den Benutzer auf die Seite der Artikelliste. Hier wird die vorher erstellte Nachricht aus informellen Gründen eingebunden.
|
||||
In der Detailansicht eines Artikels ist es möglich, denselben zu entfernen. Die View \texttt{post\_remove} selektiert über den im Template mitgegebenen \texttt{Primary Key} das Objekt und speichert es in der Variable \texttt{post}. Der Post wird gelöscht mit dem Befehl \texttt{post.remove()} und eine Umleitung am Ende der View-Definition schickt den Benutzer auf die Seite der Artikelliste. Hier wird eine zuvor in der View generierte Nachricht visualisiert, sodass der Benutzer sicher sein kann, dass der Vorgang abgeschlossen ist.
|
||||
\\
|
||||
\\
|
||||
Einen bereits vorhandenen Artikel bearbeiten:
|
||||
\textbf{Einen bereits vorhandenen Artikel bearbeiten: }
|
||||
|
||||
Ähnlich wie beim Löschen eines Artikel, kann man diesen in der Detailansicht bearbeiten. Mit dem Betätigen des Bearbeiten-Buttons wird der User auf den Artikel-Editor weitergeleitet. Die Seite zeigt die Form, wie beim Erstellen eines neuen Artikels, nur dass hier die Felder bereits den Inhalt des zu Editierenden Textes enthalten. Dazu wird in der View über den \texttt{Primary Key} der Artikel einer Variable \texttt{post} zugeordnet. Die bedingte Anweisung fragt in Zeile 91 der Abbildung 3.5., ob der Benutzer die Eingaben bereits zum Speichern veranlasst hat. Wird die Bedingung zunächst nicht erfüllt, rendert die Funktion lediglich die \texttt{PostForm}, mit dem bereits eingepflegten Inhalt durch eine GET-Abfrage in der die Daten des Artikels als Instanz übermittelt werden (vgl. Abbildung 3.5. Zeile 100).
|
||||
Ähnlich wie beim Löschen eines Artikel, kann man diesen in der Detailansicht bearbeiten. Dazu wird in der View über den \texttt{Primary Key} der Artikel einer Variable \texttt{post} zugeordnet. Die bedingte Anweisung rendert zunächst die \texttt{PostForm}, mit dem bereits eingepflegten Inhalt durch eine GET-Abfrage (vgl. Abbildung 3.6.).
|
||||
|
||||
Betätigt der Benutzer den Speichern-Button im Front-end wird die bedingte Abfrage in Zeile 91 erfüllt. Die POST-Abfrage ist hier notwendig, da Django nur so Daten in der Datenbank verändert. Eine Begründung hierfür ist die Art der Übertragung der Daten an den Server. \texttt{POST-Requests} bündeln alle Daten, verschlüsseln diese und senden Sie dann an der Server (vgl. [Fou18c]). Dadurch ist der Vorgang einfacher kontrollierbar und mit einem \texttt{csrf-Token} im Template ebenfalls gegen Cross-Site-Request-Fälschung abgesichert. Die weitere Vorgehensweise der Funktion ist identisch zum bereits erwähnten neu Erstellen eines Artikels und muss nicht weiter beschreiben.\\
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=0.9\textwidth]{figures/postedit}
|
||||
\caption{Prototyp Artikel-Editor.}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Veranlasst der Benutzer die Speicherung des Artikels im Frontend, wird die bedingte Abfrage der Abbildung 3.7. in Zeile 91 erfüllt. Die POST-Abfrage ist hier notwendig, da Django nur so Daten in der Datenbank verändert. Eine Begründung hierfür ist die Art der Übertragung der Daten an den Server. \texttt{POST-Requests} bündeln alle Daten, verschlüsseln sie und senden sie dann an der Server (vgl. [Fou18c]). Dadurch ist der Vorgang einfacher kontrollierbar und mit einem \texttt{csrf-Token} im Template ebenfalls gegen Cross-Site-Request-Fälschung abgesichert. Die weitere Vorgehensweise der Funktion ist identisch zum bereits dargelegten neu erstellen eines Artikels und muss nicht weiter beschrieben werden.\\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
@@ -150,27 +147,53 @@ Betätigt der Benutzer den Speichern-Button im Front-end wird die bedingte Abfra
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
\subsection{Abonnieren}
|
||||
\subsection{Artikel abonnieren}
|
||||
|
||||
Das Abonnieren bestimmter Themengebiete ist eines der wichtigsten Funktionen im Prototyp.
|
||||
Das Abonnieren bestimmter Themengebiete ist eine der wichtigsten Funktionen im Prototyp, um die eingepflegten Informationen zielgerichtet anzeigen zu können.
|
||||
|
||||
Nach längerer Recherche im Netz wird unter Berücksichtigung aller Vor- und Nachteile ein Tag-Modell zur Umsetzung hierfür gewählt. Wie bereits in der Datenmodellierung angedeutet, besitzt jeder Artikel beschreibende Tags. Hierbei handelt es sich um kurze stichwortartige Beschreibungen, die den Artikel so gut wie möglich charakterisieren. Abhängig vom Umfang des Blogsystems sollte die Anzahl der Tags immer in einem gewissen Rahmen vorhanden sein. Das bedeutet zum Einen, dass Ersteller von Artikeln immer die gleich Menge der Schlagwörter verwenden, wobei geringe Abweichungen möglich sind (vgl. [Gmb18]). Hat das System bereits einen grö"seren Umfang angenommen, sollten zum Anderen keine neuen Tags erstellt werden um die Übersicht für Autoren und Leser zu bewahren.
|
||||
Unter Berücksichtigung aller Vor- und Nachteile wird ein Tag-Modell zur Umsetzung gewählt. Wie bereits in der Datenmodellierung angedeutet (vgl. Datenmodellierung), besitzt jeder Artikel beschreibende Tags. Hierbei handelt es sich um kurze stichwortartige Beschreibungen, die den Artikel so gut wie möglich charakterisieren. Abhängig vom Umfang des Blogsystems, sollte die Anzahl der Tags immer in einem gewissen Rahmen vorhanden sein. Das bedeutet zum einen, dass Ersteller von Artikeln immer die gleiche Menge an Schlagwörtern verwenden, wobei geringe Abweichungen möglich sind (vgl. [Gmb18]). Hat das System bereits einen grö"seren Umfang angenommen, sollten zum anderen keine neuen Tags erstellt werden, um die Übersicht für Autoren und Leser zu bewahren. \\
|
||||
|
||||
Im Prototyp findet man die Abonnier-Funktion in der Menüleiste unter Suche. Hier erscheint ein zwei-geteiltes Layout, welches auf der rechten Seite in einer \texttt{Tag-Cloud} alle bereits abonnierten Tags anzeigt und darunter die Eingabe eines neuen Tags ermöglicht. Um den Benutzer alle bereits existierenden Tags offen zu legen, befindet sich auf der linken Seite des Layouts eine weitere \texttt{Tag-Cloud}, die diese darstellt.
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{figures/filtern}
|
||||
\caption{Prototyp Suche- und Abonnier-Seite}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Die Eingabe des zu abonnierenden Tags wird durch ein Formular realisiert.
|
||||
Im Prototyp findet man die Abonnement-Funktion unter dem Menüpunkt \texttt{Suche}. Hier erscheint ein zweigeteiltes Layout, welches auf der rechten Seite alle bereits abonnierten Tags auflistet und darunter die Eingabe eines neuen Tags ermöglicht. Um den Benutzer alle bereits existierenden Tags offen zu legen, befindet sich auf der linken Seite des Layouts eine \textit{Tag-Cloud} \footnote{ Tag-Cloud ist eine Visualisierung eines Schlagwortverzeichnisses.}
|
||||
, die alle Schlagwörter darstellt (vgl. Abbildung 3.8.).
|
||||
|
||||
|
||||
Die Eingabe des zu abonnierenden Tags wird durch ein Formular realisiert. Dieses ist in der \texttt{forms.py} Datei konfiguriert und enthält nur ein Eingabefeld. Der Ablauf verläuft gleichartig zum oben dargestellten Erstellen eines Artikels, wird allerdings genauer beschrieben, um die Struktur des \texttt{Taggable Managers} zu verdeutlichen.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1.1\textwidth]{figures/view-search-add}
|
||||
\caption{Funktion search\_add, Auszug aus views.py.}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
Gibt der Benutzer einen Tag ein und sendet durch Betätigen des Sichern-Buttons den \texttt{Request}, wird dieser in der \texttt{views.py} verarbeitet. In Zeile 159 der Abbildung 3.9. wird der eingeloggte Benutzer der Variable \texttt{user\_instance} übergeben. Beim Erstellen der \texttt{Model-Instanz} (vgl. Abbildung 3.9., Zeile 161) wird \texttt{user\_instance} der Unbekannten \texttt{form} zugeteilt, um die Tag-Eingabe im richtigen User-Objekt integrieren zu können. Nach der Abfrage der Formvalidität wird ein neues Objekt angelegt (vgl. Abbildung 3.9., Zeile 163) und ebenfalls dem aktuellen Benutzer zugeordnet. Die Eingabe der \texttt{form} wird in einem \texttt{Array} zwischengespeichert und mit dem Attribut \texttt{cleaned\_data} in ein für Python kompatiblen Datentyp gecastet. Um prüfen zu können, ob die Eingaben der Form tatsächlich im \texttt{Tag-Model} enthalten sind, wird diese nochmals in einen String umgewandelt und mit den bereits existierenden Tags abgeglichen (vgl. Abbildung 3.9., Zeile 168). Wird die Bedingung erfüllt, speichert die Funktion die Tags. In beiden möglichen Fällen wird der Benutzer benachrichtigt, ob der Vorgang erfolgreich oder die Eingabe nicht valide war.
|
||||
|
||||
Nun werden auf dem Dashboard Artikel der neu hinzugefügten Tags angezeigt (vgl Abbildung 3.10.).\\
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\includegraphics[width=1\textwidth]{figures/newsfeed}
|
||||
\caption{Prototyp Newsfeed Seite}
|
||||
\hfill
|
||||
\end{figure}
|
||||
|
||||
|
||||
\subsection{Filtern}
|
||||
Tag-cloud? Filtern nach abonnierten Posts, alle Posts und Posts mit bestimmten Tags
|
||||
|
||||
\subsection{Benachrichtigung}
|
||||
Mail-Benachrichtigung wöchentlich
|
||||
|
||||
|
||||
\subsection{Filtern von Artikeln}
|
||||
|
||||
Zur Unterstützung der Nutzbarkeit des Prototypen ist es wichtig, dass User intuitiv nach Tags suchen und sie selektieren können. Hierfür werden verschiedene Möglichkeiten zur Verfügung gestellt, die die Usability der Website verbessern sollen.
|
||||
|
||||
Im persönlichen Newsfeed des Dashboards sind die zu den Artikeln zugewiesenen Schlagwörter jeweils mit Verlinkungen versehen. Möchte ein Benutzer weitere Artikel zu einem bestimmten Thema lesen, so muss er lediglich auf den entsprechenden Tag klicken und erhält eine Liste aller Beiträge, die den selektierten Tag enthalten. Hierfür wird keine eigene \texttt{View} benötigt, denn das Erstellen von Listen mit unterschiedlichem Inhalt kann ebenso über sich unterscheidende Urls realisiert werden. Im Template \texttt{post\_list} wird beim Klicken auf einen Tag der \textit{Slug}\footnote{ Der Slug dient im Taggable-Manager als eindeutig zuweisbarer Identifikator.} desselben mitgegeben. Au"serdem wird nun die Url \texttt{post\_list\_by\_tag} aufgerufen, die auf eine neue Seite verweist. Die View \texttt{post\_list} rendert bei Anfragen mit \textit{Slug} die passende Liste, bei Anfragen ohne werden alle vorhandenen Artikel geladen.
|
||||
|
||||
|
||||
Der Prototyp bietet zudem die Möglichkeit direkt nach Tags zu suchen. Unter dem Menüpunkt \texttt{Suche} auf der linken Seite des geteilten Layouts befindet sich eine \textit{Tag-Cloud}. Darunter ist das Suchfeld, welches durch ein Formular im Template realisiert wird. Die Eingabe fragt jedoch nur Tags aus der Datenbank ab, die Daten werden nicht verändert, da hier lediglich ein \texttt{GET-Request} gesendet wird. Mit der Funktion \texttt{filter} und dem von der taggit-Bibliothek zur Verfügung gestellten \textit{Lookup} \footnote{ Lookup ist eine Art Funktion, die den Ort des darauffolgend Feldes ausgibt.}
|
||||
\texttt{tags\_\_name\_\_in} können alle Artikel mit dem jeweils enthaltenen Tag dem Template übergeben werden.
|
||||
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 262 KiB |
@@ -14,6 +14,8 @@
|
||||
\usepackage{float}
|
||||
\usepackage[onehalfspacing]{setspace}
|
||||
\usepackage{textcomp}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{colorlinks=true,linkcolor=black}
|
||||
%Abkürzungsverzeichnis
|
||||
\usepackage[printonlyused]{acronym}
|
||||
|
||||
|
||||
@@ -47,13 +47,6 @@
|
||||
note = "https://docs.python.org/3/tutorial/venv.html"
|
||||
}
|
||||
|
||||
@article{Dixit,
|
||||
author = "Chitrank Dixit",
|
||||
title = "PEP-8 Tutorial: Code Standards in Python",
|
||||
year = "2018",
|
||||
note = "https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code"
|
||||
}
|
||||
|
||||
@article{Shabda,
|
||||
author = "Shabda",
|
||||
title = "Understanding decorators",
|
||||
@@ -70,12 +63,12 @@
|
||||
|
||||
@article{Ong,
|
||||
author = "Selwin Ong",
|
||||
title = "django-post\_office git Repository",
|
||||
title = "Django Request-Response Cycle",
|
||||
year = "2018",
|
||||
note = "https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst"
|
||||
}
|
||||
|
||||
@article{Ong,
|
||||
@article{Nevius,
|
||||
author = "Ryan Nevius",
|
||||
title = "django-post\_office git Repository",
|
||||
year = "2015",
|
||||
@@ -96,20 +89,6 @@
|
||||
note = "Kapitel 23.1"
|
||||
}
|
||||
|
||||
@article{Schlede,
|
||||
author = "Frank-Michael Schlede, Thomas Bär, Andreas Donner",
|
||||
title = "Was ist LDAP (Lightweight Directory Access Protocol)?",
|
||||
year = "2017",
|
||||
note = "https://www.ip-insider.de/was-ist-ldap-lightweight-directory-access-protocol-a-581204/"
|
||||
}
|
||||
|
||||
@article{Oracle,
|
||||
author = "Oracle Cooperation",
|
||||
title = "About LDAP",
|
||||
year = "2010",
|
||||
note = "https://docs.oracle.com/cd/E19182-01/820-6573/6nht2e5a4/index.html"
|
||||
}
|
||||
|
||||
@article{Otto,
|
||||
author = "Mark Otto",
|
||||
title = "Bootstrap from Twitter",
|
||||
@@ -145,11 +124,11 @@
|
||||
note = "https://tutorial.djangogirls.org/en/django\_models/"
|
||||
}
|
||||
|
||||
@article{Microsoft,
|
||||
author = "Microsoft",
|
||||
title = "Extensions for the Visual Studio family of products",
|
||||
@article{Djangogirls-2,
|
||||
author = "Djangogirls",
|
||||
title = "We inspire women to fall in love with programming.",
|
||||
year = "2018",
|
||||
note = "https://marketplace.visualstudio.com/"
|
||||
note = "https://djangogirls.org/"
|
||||
}
|
||||
|
||||
@article{Computer,
|
||||
@@ -194,3 +173,33 @@
|
||||
note = "https://www.textbroker.de/tagging"
|
||||
}
|
||||
|
||||
@article{Djangogirls-2,
|
||||
author = "Djangogirls",
|
||||
title = "Was passiert, wenn jemand eine Webseite beim Server anfordert?",
|
||||
year = "2018",
|
||||
note = "https://tutorial.djangogirls.org/de/django/"
|
||||
}
|
||||
|
||||
@article{Moodle,
|
||||
author = "Moodle Dokumentation",
|
||||
title = "Aufbau einer Moodle-Site",
|
||||
year = "2015",
|
||||
note = "https://docs.moodle.org/35/de/Aufbau\_einer\_Moodle-Site"
|
||||
}
|
||||
|
||||
@article{Moodle-2,
|
||||
author = "Moodle Dokumentation",
|
||||
title = "Cron-Job",
|
||||
year = "2018",
|
||||
note = "https://docs.moodle.org/35/de/Cron-Job"
|
||||
}
|
||||
|
||||
|
||||
@article{Hellmuth,
|
||||
author = "Dirk Hellmuth",
|
||||
title = "Wenn E-Mails zur Last werden: Wege aus der Mail-Überflutung",
|
||||
year = "2012",
|
||||
note = "https://www.unternehmer.de/management-people-skills/138949-wenn-e-mails-zur-last-werden-wege-aus-der-mail-ueberflutung"
|
||||
}
|
||||
|
||||
|
||||
@@ -2,43 +2,33 @@
|
||||
|
||||
%------------------------------------------------------------------------------
|
||||
\begin{center}
|
||||
\begin{figure}[!h]
|
||||
\includegraphics[width=0.7\textwidth]{figures/Ohm_logo}
|
||||
\hfill
|
||||
\end{figure}
|
||||
\vspace{12mm}
|
||||
\textbf{\large Technische Hochschule Nürnberg Georg Simon Ohm}\\
|
||||
\thispagestyle{empty}
|
||||
\setlength{\unitlength}{15cm}
|
||||
\line(1,0){1}\\
|
||||
\vspace{0.4cm}
|
||||
{\LARGE\textbf{\LARGE Entwicklung einer internen Social Media Plattform mit personalisierbarem Dashboard für Studierende}}
|
||||
\setlength{\unitlength}{15cm}
|
||||
\line(1,0){1}\\
|
||||
\textbf{\large Fakultät Elektrotechnik Feinwerktechnik Informationstechnik}\\
|
||||
\vspace{1.5cm}
|
||||
\textbf{\large Studiengang Media Engineering}\\
|
||||
\vspace{1.5cm}
|
||||
\textbf{\large Bachelorarbeit von}\\
|
||||
\textbf{\large Esther Beate Kleinhenz}\\
|
||||
|
||||
\vspace{2.0cm}
|
||||
\textbf{\huge{Esther Beate Kleinhenz}}\\
|
||||
\vspace{1.2cm}
|
||||
{\large\textbf{ Entwicklung einer internen Social Media Plattform mit personalisierbarem Dashboard f{\"u}r Studierende}}
|
||||
\setlength{\unitlength}{15cm}
|
||||
|
||||
\vspace{0.8cm}
|
||||
{\textbf{WS 2018/2019}}\\
|
||||
\vspace{2.5cm}
|
||||
|
||||
|
||||
\vspace{3.2cm}
|
||||
|
||||
\raggedright{ Abgabedatum: 11. Dezember 2018}\\
|
||||
\raggedright { Betreuer: Prof. Dr. Oliver Hofmann}\\
|
||||
\vspace{0.4cm}
|
||||
{\Large \textbf{Matrikelnummer: }2649270}\\
|
||||
\vspace{2.5cm}
|
||||
{\LARGE \textbf{Bachelorarbeit}}\\
|
||||
%\vspace{0.3cm}
|
||||
{zur Erlangung des akademischen Grades}\\
|
||||
\vspace{0.5cm}
|
||||
\textbf{\Large Bachelor of Engineering}\\
|
||||
{\large Media Engineering}\\
|
||||
\vspace{2.5cm}
|
||||
{\Large \textbf{Erstprüfer: }Prof. Dr. Oliver Hofmann}\\
|
||||
{\Large \textbf{Zweitprüfer: }Prof. Dr. Matthias Hopf}\\
|
||||
%\vspace{2.0cm}
|
||||
%{Co-Advisor:}\\
|
||||
%{Name}\\
|
||||
%\vspace{2.0cm}
|
||||
%{Laborat\'orio de Vibra\c{c}\~oes de Sistemas Mec%\^anicos}\\
|
||||
%{Departamento de Engenharia Mec\^anica }\\
|
||||
%{Faculdade de Engenharia da Universidade do Porto}\\
|
||||
%\vspace{1.2cm}
|
||||
|
||||
\vspace{\fill}
|
||||
Nürnberg, {\today}\\
|
||||
\noindent { Schlagworte: Python, Django, Informationsplattform, Tagging, E-Mail-Flut}
|
||||
\end{center}
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 30 KiB |
@@ -1,140 +1,327 @@
|
||||
[15/Nov/2018 11:29:37] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:31] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 11:30:31] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:31] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:41] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 11:30:41] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:41] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:52] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 11:30:52] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:30:52] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:31:01] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 11:31:01] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:31:01] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:31:11] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 11:31:11] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:31:11] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 11:48:01] INFO [mysite:157] None
|
||||
[15/Nov/2018 11:48:29] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:44:00] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:45:30] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:46:41] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:46:57] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:47:53] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:48:27] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:49:18] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:49:51] INFO [mysite:157] hi
|
||||
[15/Nov/2018 17:51:05] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:33:51] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:34:10] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:34:36] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:35:08] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:35:33] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:35:40] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:36:04] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:36:37] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:37:59] INFO [mysite:157] hi
|
||||
[15/Nov/2018 18:38:04] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:38:05] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 18:38:06] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 18:38:06] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 18:38:18] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[15/Nov/2018 18:38:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 18:38:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[15/Nov/2018 18:38:26] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:38:56] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:39:03] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:39:30] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:40:05] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:40:14] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:40:25] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:40:36] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:40:46] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:41:09] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:41:23] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:42:09] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:42:23] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:43:17] INFO [mysite:157] None
|
||||
[15/Nov/2018 18:43:37] INFO [mysite:157] None
|
||||
[16/Nov/2018 13:07:18] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[16/Nov/2018 13:07:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Das ist ein Titel>]>
|
||||
[16/Nov/2018 13:07:18] INFO [mysite:149] <QuerySet [<Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: Das ist ein Titel>]>
|
||||
[16/Nov/2018 13:10:03] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: test>]>
|
||||
[16/Nov/2018 13:10:03] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:10:03] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:10:34] INFO [mysite:157] None
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:162] post method
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:165] form is valid
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:169] ['hi', 'first', 'test', 'bayern', 'second', 'bla', 'sunday', 'studienbüro', 'two', 'visual studio code', 'wow', 'strange', 'hi there']
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:172] two
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:174] worked out
|
||||
[16/Nov/2018 13:11:18] INFO [mysite:157] None
|
||||
[16/Nov/2018 13:11:39] INFO [mysite:157] test
|
||||
[16/Nov/2018 13:11:52] INFO [mysite:59] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:12:55] INFO [mysite:146] <QuerySet []>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: second>, <Tag: first>, <Tag: test>, <Tag: bayern>]>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: teeeest>, <Post: Bavaria>]>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet []>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:13:27] INFO [mysite:149] <QuerySet [<Post: Bavaria>]>
|
||||
[16/Nov/2018 13:28:47] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]>
|
||||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:28:47] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]>
|
||||
[16/Nov/2018 13:28:50] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]>
|
||||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:28:50] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]>
|
||||
[16/Nov/2018 13:28:52] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]>
|
||||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:28:52] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: second>, <Tag: first>, <Tag: test>, <Tag: bayern>]>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: teeeest>, <Post: Bavaria>]>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet []>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[16/Nov/2018 13:33:26] INFO [mysite:148] <QuerySet [<Post: Bavaria>]>
|
||||
[16/Nov/2018 13:33:28] INFO [mysite:156] None
|
||||
[17/Nov/2018 14:55:06] INFO [mysite:156] None
|
||||
[17/Nov/2018 14:56:39] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:00:30] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:00:42] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:00:45] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:01:04] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:01:47] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:03:00] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:03:20] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:03:37] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:04:41] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:06:26] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:06:36] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>]>
|
||||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>]>
|
||||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: teeeest>, <Post: Bavaria>, <Post: test>]>
|
||||
[17/Nov/2018 15:06:36] INFO [mysite:148] <QuerySet [<Post: Das ist ein Titel>]>
|
||||
[17/Nov/2018 15:06:42] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:09:44] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:10:11] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:10:36] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:10:46] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:11:14] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:11:23] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:11:35] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:11:44] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:11:52] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:13:06] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:17:31] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:17:50] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:18:42] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:19:25] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:19:34] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:19:59] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:20:13] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:20:21] INFO [mysite:156] None
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:164] post method
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:167] form is valid
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:171] ['hi', 'first', 'test', 'bayern', 'second', 'bla', 'sunday', 'studienbüro', 'two', 'visual studio code', 'wow', 'strange', 'hi there']
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:174] second
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:176] worked out
|
||||
[17/Nov/2018 15:20:29] INFO [mysite:156] None
|
||||
[13/Dec/2018 16:53:05] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 16:53:13] INFO [mysite:128] <QuerySet []>
|
||||
[13/Dec/2018 16:53:49] INFO [mysite:128] <QuerySet []>
|
||||
[13/Dec/2018 16:53:52] INFO [mysite:128] <QuerySet []>
|
||||
[13/Dec/2018 16:54:10] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
|
||||
[13/Dec/2018 16:54:10] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 16:54:10] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 16:54:10] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 16:54:10] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 16:54:36] INFO [mysite:128] <QuerySet [<Tag: test>]>
|
||||
[13/Dec/2018 16:54:36] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 16:55:00] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>]>
|
||||
[13/Dec/2018 16:55:00] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 16:55:00] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 16:57:13] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>]>
|
||||
[13/Dec/2018 16:57:13] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 16:57:13] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 16:58:01] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>]>
|
||||
[13/Dec/2018 16:58:01] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 16:58:01] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:01:37] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:01:37] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:01:37] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:02:17] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:02:17] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:02:17] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:03:11] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:03:11] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:03:11] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:03:11] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:03:16] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:03:16] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:03:16] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:03:16] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:03:22] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:03:22] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:03:22] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:03:22] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:03:38] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:03:38] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:03:38] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:03:38] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:03:49] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
|
||||
[13/Dec/2018 17:03:49] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:03:49] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:03:49] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:03:49] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:04:08] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:04:08] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:04:08] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:04:08] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:05:09] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:05:09] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:05:09] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:05:09] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:05:16] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:05:16] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:05:16] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:05:16] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:05:18] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:05:18] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:05:18] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:05:18] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:06:00] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
|
||||
[13/Dec/2018 17:06:00] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:06:00] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:06:00] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:06:00] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:06:15] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:06:17] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:06:50] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:06:53] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:06:53] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:06:53] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:06:54] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:06:54] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:06:54] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:07:20] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:07:20] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:07:20] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:07:20] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:07:44] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>]>
|
||||
[13/Dec/2018 17:07:44] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:07:44] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:07:44] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:07:45] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:08:26] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:08:37] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:09:54] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:10:49] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:12:15] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:13:22] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:13:22] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:13:22] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:13:22] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:13:22] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:13:23] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:131] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:131] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:15:01] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:20:50] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:21:13] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:131] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:131] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:22:30] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:22:36] INFO [mysite:128] <QuerySet [<Tag: first>, <Tag: bayern>, <Tag: strange>]>
|
||||
[13/Dec/2018 17:22:36] INFO [mysite:131] <QuerySet []>
|
||||
[13/Dec/2018 17:22:36] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:22:36] INFO [mysite:131] <QuerySet [<Post: Strange Things>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:131] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:131] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:23:29] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:25:42] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:25:42] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:25:42] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:25:42] INFO [mysite:131] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:25:42] INFO [mysite:131] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:25:43] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:27:05] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:27:05] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:28:07] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:28:08] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:29:35] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:29:35] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:32:51] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:32:51] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:33:09] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:33:09] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:37:12] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:38:11] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:42:08] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:42:29] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:44:55] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:45:29] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:45:48] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:45:48] INFO [mysite:134] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:46:09] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:46:09] INFO [mysite:134] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:46:43] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:46:43] INFO [mysite:134] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:46:51] INFO [mysite:131] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:46:51] INFO [mysite:134] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:49:23] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:49:23] INFO [mysite:132] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:132] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:132] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:132] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:50:25] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:51:16] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:52:16] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:54:42] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:54:42] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:55:14] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:55:14] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:131] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:131] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:131] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:55:33] INFO [mysite:131] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:132] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:132] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:132] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:58:06] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:132] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:132] <QuerySet [<Post: Just to be sure>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:132] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:58:35] INFO [mysite:132] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 17:59:00] INFO [mysite:128] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:09:42] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:10:59] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:10:59] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 18:10:59] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:11:00] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:11:00] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:11:00] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:16:25] INFO [mysite:129] <QuerySet [<Tag: bayern>]>
|
||||
[13/Dec/2018 18:16:25] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:17:34] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:17:48] INFO [mysite:129] <QuerySet [<Tag: bayern>]>
|
||||
[13/Dec/2018 18:17:48] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:17:56] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[13/Dec/2018 18:17:56] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:17:56] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 18:18:12] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[13/Dec/2018 18:18:12] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:18:12] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:18:24] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:28:17] INFO [mysite:129] <QuerySet [<Tag: bayern>]>
|
||||
[13/Dec/2018 18:28:18] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:29:32] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[13/Dec/2018 18:29:32] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:29:32] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:33:06] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 18:34:33] INFO [mysite:129] <QuerySet [<Tag: bayern>]>
|
||||
[13/Dec/2018 18:34:33] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:36:14] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[13/Dec/2018 18:36:15] INFO [mysite:133] <QuerySet [<Post: Bavaria>]>
|
||||
[13/Dec/2018 18:36:15] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Bavaria>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:40] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[13/Dec/2018 19:00:53] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:133] <QuerySet [<Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Hier kommt was neues>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:133] <QuerySet [<Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: test>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[14/Dec/2018 10:05:11] INFO [mysite:133] <QuerySet [<Post: Just to be sure>, <Post: Just to be sure>, <Post: Kein bisschen Fränkisch>, <Post: Kein bisschen Fränkisch>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: Strange Things>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Hier kommt was neues>, <Post: Bavaria>, <Post: Bavaria>, <Post: Bavaria>, <Post: test>]>
|
||||
[19/Dec/2018 18:37:59] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[19/Dec/2018 18:37:59] INFO [mysite:133] [<Post: Bavaria>]
|
||||
[19/Dec/2018 18:37:59] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:133] [<Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: test>, <Post: Kein bisschen Fränkisch>]
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Just to be sure>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Just to be sure>]
|
||||
[19/Dec/2018 18:38:10] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Just to be sure>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:129] <QuerySet [<Tag: hi>, <Tag: test>, <Tag: two>, <Tag: second>, <Tag: bayern>]>
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:133] [<Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: test>, <Post: Kein bisschen Fränkisch>]
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Just to be sure>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>, <Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Just to be sure>]
|
||||
[19/Dec/2018 18:38:14] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Just to be sure>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:39:51] INFO [mysite:129] <QuerySet [<Tag: bayern>]>
|
||||
[19/Dec/2018 18:39:51] INFO [mysite:133] [<Post: Bavaria>]
|
||||
[19/Dec/2018 18:40:05] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: test>]>
|
||||
[19/Dec/2018 18:40:05] INFO [mysite:133] [<Post: Bavaria>]
|
||||
[19/Dec/2018 18:40:05] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:40:25] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: test>]>
|
||||
[19/Dec/2018 18:40:25] INFO [mysite:133] [<Post: Bavaria>]
|
||||
[19/Dec/2018 18:40:25] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:40:34] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: test>]>
|
||||
[19/Dec/2018 18:40:34] INFO [mysite:133] [<Post: Bavaria>]
|
||||
[19/Dec/2018 18:40:34] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:40:58] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: test>]>
|
||||
[19/Dec/2018 18:40:58] INFO [mysite:133] [<Post: Bavaria>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:40:58] INFO [mysite:133] [<Post: test>, <Post: Kein bisschen Fränkisch>, <Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:41:06] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[19/Dec/2018 18:41:06] INFO [mysite:133] [<Post: Bavaria>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:41:06] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:41:13] INFO [mysite:129] <QuerySet [<Tag: bayern>, <Tag: hi>]>
|
||||
[19/Dec/2018 18:41:13] INFO [mysite:133] [<Post: Bavaria>, <Post: Strange Things>]
|
||||
[19/Dec/2018 18:41:13] INFO [mysite:133] [<Post: Bavaria>, <Post: Hier kommt was neues>, <Post: Das ist ein Titel>, <Post: Strange Things>]
|
||||
@@ -176,7 +176,11 @@ else:
|
||||
|
||||
AUTH_PROFILE_MODULE = 'application.CustomUser'
|
||||
|
||||
|
||||
#Log Configuration
|
||||
#external code
|
||||
#import form https://docs.djangoproject.com/en/2.1/topics/logging/
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': True,
|
||||
@@ -224,6 +228,9 @@ LOGGING = {
|
||||
}
|
||||
}
|
||||
|
||||
#Logging Addon
|
||||
#external code
|
||||
#import from https://django-debug-toolbar.readthedocs.io/en/latest/installation.html
|
||||
|
||||
if DEBUG:
|
||||
INTERNAL_IPS = ('127.0.0.1', 'localhost',)
|
||||
@@ -254,8 +261,11 @@ if DEBUG:
|
||||
'INTERCEPT_REDIRECTS': False,
|
||||
}
|
||||
|
||||
EMAIL_BACKEND = 'post_office.EmailBackend'
|
||||
#E-Mail administration
|
||||
#external code customised
|
||||
#import from https://github.com/ui/django-post_office
|
||||
|
||||
EMAIL_BACKEND = 'post_office.EmailBackend'
|
||||
EMAIL_HOST = 'smtp.web.de'
|
||||
EMAIL_HOST_USER = "esther.kleinhenz@web.de"
|
||||
EMAIL_PORT = 25 # default smtp port
|
||||
|
||||
@@ -17,7 +17,6 @@ from django.contrib import admin
|
||||
from django.conf.urls import include, url
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
|
||||
from django.contrib.auth import views
|
||||
import application.views
|
||||
|
||||
|
||||