Compare commits

..
16 Commits
2989 changed files with 26916 additions and 511642 deletions

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
# The first instruction is what image we want to base our container on
# We Use an official Python runtime as a parent image
#FROM python:3.6
# FROM directive instructing base image to build upon
FROM python:3.6.6
# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
#ENV PYTHONUNBUFFERED 1
# App directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install azure event hub client dependencies
#COPY p /usr/src/app/
# Bundle app source
COPY . /usr/src/app
# COPY startup script into known file location in container
COPY start.sh /start.sh
# create root directory for our project in the container
#RUN mkdir /esther_kleinhenz_ba
# EXPOSE port 8000 to allow communication to/from server
#EXPOSE 8000
RUN set -x \
&& buildDeps='curl gcc libc6-dev libsqlite3-dev libssl-dev make xz-utils zlib1g-dev'
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
# Set the working directory to /esther_kleinhenz_ba
#WORKDIR /esther_kleinhenz_ba
# CMD specifcies the command to execute to start the server running.
CMD ["/start.sh"]
# done!
# Copy the current directory contents into the container at /esther_kleinhenz_ba
#ADD . /esther_kleinhenz_ba/
-4
View File
@@ -1,5 +1 @@
from __future__ import absolute_import, unicode_literals
# This will make sure celery is always imported when
# Django starts so that shared_task will use this app.
from .celeryapp import app as celery_app
__all__ = ['celery_app']
+1 -41
View File
@@ -4,8 +4,7 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import Post, CustomUser
from .models import ScheduledReport, ReportRecipient, ScheduledReportGroup
from .forms import ScheduledReportForm
class CustomUserInline(admin.StackedInline):
@@ -23,42 +22,3 @@ admin.site.register(User, UserAdmin)
admin.site.register(Post)
class ReportRecipientAdmin(admin.TabularInline):
model = ReportRecipient
class ScheduledReportAdmin(admin.ModelAdmin):
"""
List display for Scheduled reports in Django admin
"""
model = ScheduledReport
list_display = ('id', 'get_recipients')
inlines = [
ReportRecipientAdmin
]
form = ScheduledReportForm
def get_recipients(self, model):
recipients = model.reportrecep.all().values_list('email', flat=True)
if not recipients:
return 'No recipients added'
recipient_list = ''
for recipient in recipients:
recipient_list = recipient_list + recipient + ', '
return recipient_list[:-2]
get_recipients.short_description = 'Recipients'
get_recipients.allow_tags = True
class ScheduledReportGroupAdmin(admin.ModelAdmin):
"""
List display for ScheduledReportGroup Admin
"""
model = ScheduledReportGroup
list_display = ('get_scheduled_report_name','get_report_name')
def get_scheduled_report_name(self, model):
return model.scheduled_report.subject
def get_report_name(self, model):
return model.report.name
get_scheduled_report_name.short_description = "Scheduled Report Name"
get_report_name.short_description = "Report Name"
show_change_link = True
get_report_name.allow_tags = True
admin.site.register(ScheduledReport, ScheduledReportAdmin)
admin.site.register(ScheduledReportGroup, ScheduledReportGroupAdmin)
-13
View File
@@ -1,13 +0,0 @@
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
from django.conf import settings
app = Celery('application')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
app.config_from_object('django.conf:settings')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
+2 -27
View File
@@ -9,7 +9,6 @@ from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from datetime import datetime
from croniter import croniter
from django.forms import ModelForm, ValidationError
from .models import ScheduledReport
class PostForm(forms.ModelForm):
class Meta:
@@ -17,31 +16,7 @@ class PostForm(forms.ModelForm):
fields = ('title', 'text', 'published_date','tags')
class NewTagForm(forms.ModelForm):
m_tags = TagField()
tags = TagField()
class Meta:
model = CustomUser
fields = ['m_tags']
class ScheduledReportForm(ModelForm):
class Meta:
model = ScheduledReport
fields = ['subject', 'cron_expression']
fields = ['subject', 'cron_expression']
help_texts = {'cron_expression': 'Scheduled time is considered in UTC'}
def clean(self):
cleaned_data = super(ScheduledReportForm, self).clean()
cron_expression = cleaned_data.get("cron_expression")
try:
iter = croniter(cron_expression, datetime.now())
except:
raise ValidationError("Incorrect cron expression:\
The information you must include is (in order of appearance):\
A number (or list of numbers, or range of numbers), m, representing the minute of the hour\
A number (or list of numbers, or range of numbers), h, representing the hour of the day\
A number (or list of numbers, or range of numbers), dom, representing the day of the month\
A number (or list, or range), or name (or list of names), mon, representing the month of the year\
A number (or list, or range), or name (or list of names), dow, representing the day of the week\
The asterisks (*) in our entry tell cron that for that unit of time, the job should be run every.\
Eg. */5 * * * * cron for executing every 5 mins")
return cleaned_data
fields = ['tags']
+43 -1
View File
@@ -1,9 +1,10 @@
# Generated by Django 2.1 on 2018-08-18 15:34
# Generated by Django 2.1.2 on 2018-10-30 10:43
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import taggit.managers
class Migration(migrations.Migration):
@@ -12,6 +13,7 @@ class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('taggit', '0001_initial'),
]
operations = [
@@ -19,6 +21,8 @@ class Migration(migrations.Migration):
name='CustomUser',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tags', taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')),
('user', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
@@ -30,6 +34,44 @@ class Migration(migrations.Migration):
('created_date', models.DateTimeField(default=django.utils.timezone.now)),
('published_date', models.DateTimeField(blank=True, null=True)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('tags', taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')),
],
),
migrations.CreateModel(
name='Report',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('report_text', models.TextField()),
],
),
migrations.CreateModel(
name='ReportRecipient',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='ScheduledReport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(max_length=200)),
('last_run_at', models.DateTimeField(blank=True, null=True)),
('next_run_at', models.DateTimeField(blank=True, null=True)),
('cron_expression', models.CharField(max_length=200)),
],
),
migrations.CreateModel(
name='ScheduledReportGroup',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report', to='application.Report')),
('scheduled_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relatedscheduledreport', to='application.ScheduledReport')),
],
),
migrations.AddField(
model_name='reportrecipient',
name='scheduled_report',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reportrecep', to='application.ScheduledReport'),
),
]
@@ -1,35 +0,0 @@
# Generated by Django 2.1 on 2018-08-18 15:34
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import taggit.managers
class Migration(migrations.Migration):
initial = True
dependencies = [
('taggit', '0001_initial'),
('application', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='post',
name='tags',
field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
),
migrations.AddField(
model_name='customuser',
name='mytags',
field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
),
migrations.AddField(
model_name='customuser',
name='user',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
@@ -0,0 +1,37 @@
# Generated by Django 2.1.2 on 2018-10-30 11:23
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('application', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='reportrecipient',
name='scheduled_report',
),
migrations.RemoveField(
model_name='scheduledreportgroup',
name='report',
),
migrations.RemoveField(
model_name='scheduledreportgroup',
name='scheduled_report',
),
migrations.DeleteModel(
name='Report',
),
migrations.DeleteModel(
name='ReportRecipient',
),
migrations.DeleteModel(
name='ScheduledReport',
),
migrations.DeleteModel(
name='ScheduledReportGroup',
),
]
@@ -1,20 +0,0 @@
# Generated by Django 2.1 on 2018-08-30 16:14
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('application', '0002_auto_20180818_1734'),
]
operations = [
migrations.AlterField(
model_name='customuser',
name='user',
field=models.OneToOneField(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 2.1.2 on 2018-10-30 15:33
from django.db import migrations
import taggit.managers
class Migration(migrations.Migration):
dependencies = [
('application', '0002_auto_20181030_1223'),
]
operations = [
migrations.AlterField(
model_name='customuser',
name='tags',
field=taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
),
]
@@ -1,20 +0,0 @@
# Generated by Django 2.1 on 2018-08-31 08:19
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('application', '0003_auto_20180830_1814'),
]
operations = [
migrations.AlterField(
model_name='customuser',
name='user',
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
@@ -1,18 +0,0 @@
# Generated by Django 2.1 on 2018-10-19 14:45
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('application', '0004_auto_20180831_1019'),
]
operations = [
migrations.RenameField(
model_name='customuser',
old_name='mytags',
new_name='tags',
),
]
@@ -1,51 +0,0 @@
# Generated by Django 2.1 on 2018-10-21 11:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('application', '0005_auto_20181019_1645'),
]
operations = [
migrations.CreateModel(
name='Report',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('report_text', models.TextField()),
],
),
migrations.CreateModel(
name='ReportRecipient',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)),
],
),
migrations.CreateModel(
name='ScheduledReport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(max_length=200)),
('last_run_at', models.DateTimeField(blank=True, null=True)),
('next_run_at', models.DateTimeField(blank=True, null=True)),
('cron_expression', models.CharField(max_length=200)),
],
),
migrations.CreateModel(
name='ScheduledReportGroup',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report', to='application.Report')),
('scheduled_report', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relatedscheduledreport', to='application.ScheduledReport')),
],
),
migrations.AddField(
model_name='reportrecipient',
name='scheduled_report',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reportrecep', to='application.ScheduledReport'),
),
]
+2 -38
View File
@@ -9,7 +9,7 @@ from croniter import croniter
class CustomUser(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
tags = TaggableManager()
tags = TaggableManager(blank=True)
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
@@ -26,40 +26,4 @@ class Post(models.Model):
self.save()
def __str__(self):
return self.title
class Report(models.Model):
report_text = models.TextField()
class ScheduledReport(models.Model):
"""
Contains email subject and cron expression,to evaluate when the email has to be sent
"""
subject = models.CharField(max_length=200)
last_run_at = models.DateTimeField(null=True, blank=True)
next_run_at = models.DateTimeField(null=True, blank=True)
cron_expression = models.CharField(max_length=200)
def save(self, *args, **kwargs):
"""
function to evaluate "next_run_at" using the cron expression, so that it is updated once the report is sent.
"""
self.last_run_at = datetime.now()
iter = croniter(self.cron_expression, self.last_run_at)
self.next_run_at = iter.get_next(datetime)
super(ScheduledReport, self).save(*args, **kwargs)
def __unicode__(self):
return self.subject
class ScheduledReportGroup(models.Model):
"""
Many to many mapping between reports which will be sent out in a scheduled report
"""
report = models.ForeignKey(Report, related_name='report', on_delete=models.CASCADE)
scheduled_report = models.ForeignKey(ScheduledReport,
related_name='relatedscheduledreport', on_delete=models.CASCADE)
class ReportRecipient(models.Model):
"""
Stores all the recipients of the given scheduled report
"""
email = models.EmailField()
scheduled_report = models.ForeignKey(ScheduledReport, related_name='reportrecep', on_delete=models.CASCADE)
return self.title
-7
View File
@@ -1,7 +0,0 @@
from celery.task.schedules import crontab
from celery.decorators import periodic_task
from .email_service import send_emails
# this will run every minute, see http://celeryproject.org/docs/reference/celery.task.schedules.html#celery.task.schedules.crontab
@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*"))
def trigger_emails():
send_emails()
+15 -9
View File
@@ -20,8 +20,8 @@
<img src="{% static 'images/efi.jpg' %}" width="35" height="35" alt="efi">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
@@ -34,9 +34,6 @@
<li>
<a class="nav-link" href="{% url 'post_list' %}">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'student_page' %}">Studentenansicht</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
</li>
@@ -48,9 +45,15 @@
<li class="nav-item">
<a class="nav-link" href="{% url 'post_list' %}">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url 'student_page' %}">{{user.get_username}}'s Dashboard</a>
<a class="nav-link" href="{% url 'post_list' %}">{{user.get_username}}'s Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'blog_search_list_view' %}">Suche</a>
</li>
{% endif %}
</ul>
@@ -71,16 +74,19 @@
</a>
<ul id="login-dp" class="dropdown-menu">
<li>
<form class="form" role="form" method="post" action="{% url 'login' %}" accept-charset="UTF-8" id="login-nav">
<form class="form" role="form" method="post" action="{% url 'login' %}" accept-charset="UTF-8"
id="login-nav">
{% csrf_token %} {% if next %}
<input type="hidden" name="next" value="{{ next }}" /> {% endif %}
<div class="form-group">
<label class="sr-only" for="username">Benutzername</label>
<input type="text" class="form-control" id="username" name="username" placeholder="Benutzername" required>
<input type="text" class="form-control" id="username" name="username"
placeholder="Benutzername" required>
</div>
<div class="form-group">
<label class="sr-only" for="password">Kennwort</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Kennwort" required>
<input type="password" class="form-control" id="password" name="password"
placeholder="Kennwort" required>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block">Anmelden</button>
+11 -2
View File
@@ -1,5 +1,7 @@
{% extends 'base.html' %} {% block content %}
{% extends 'base.html' %}{% block content %}
{% load hitcount_tags %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
@@ -17,12 +19,19 @@
<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>
<a href="{% url 'blog_search_list_view' %}">{{ tag.name }} </a>
{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
<p>
Autor: {{ post.author }}
</p>
{% if user.is_staff %}
<p>
{% get_hit_count for post %} Benutzer haben diesen Post bereits gelesen!
</p>
{% endif %}
</div>
{% endblock %}
+6 -16
View File
@@ -1,24 +1,14 @@
{% extends "base.html" %} {% block content %} {% load taggit_templatetags2_tags %} {% get_taglist as tags for 'application.post'%}
{% extends "base.html" %} {% block content %} {% load taggit_templatetags2_tags %}
{% get_taglist as tags for 'application.post'%}
<div id="">
<ul>
{% for tag in tags %}
<li>{{tag}}
<a class="btn btn-outline-dark" href="{% url 'tag_remove' tag.slug %}">
<span class="glyphicon glyphicon-remove">Remove</span>
</a>
</li>
{{ result }} {% endfor %}
</ul>
</div>
<div>
<form class="post-form" method="post">
{% csrf_token %} {{form.as_p}}
<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 %}
<form class="post-form" method="post">
{% csrf_token %} {{form.as_p}}
<button type="submit" class="save btn btn-outline-dark">Save</button>
</form>
{% endblock %}
-1
View File
@@ -22,7 +22,6 @@ urlpatterns = [
url(r'^post/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'),
url(r'^student/(?P<slug>[-\w]+)/remove/$', views.tag_remove, name='tag_remove'),
url(r'^tags/', include('taggit_templatetags2.urls')),
url(r'^newsletter/', include('newsletter.urls')),
]
if settings.DEBUG:
+36 -30
View File
@@ -8,13 +8,16 @@ 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
from django.db.models import Q
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
@@ -60,7 +63,9 @@ def post_list(request, slug=None):
@login_required
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'post_detail.html', {'post': post})
hit_count = HitCount.objects.get_for_object(post)
hit_count_response = HitCountMixin.hit_count(request, hit_count)
return render(request, 'post_detail.html', locals())
@login_required
@@ -72,6 +77,7 @@ def post_new(request):
post = form.save(commit=False)
post.author = request.user
post.save()
form.save_m2m()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
@@ -121,26 +127,39 @@ def post_remove(request, pk):
@login_required
def tag_remove(request, slug=None):
log = logging.getLogger('mysite')
user_instance = get_object_or_404(CustomUser, user=request.user)
log.info(u)
tag = Tag.get_object_or_404(Tag, slug = slug)
log.info(tag)
if slug:
tag = get_object_or_404(Tag, slug=slug)
tag.delete()
user_instance.tags.remove(tag)
save_m2m()
return redirect('student_page')
return redirect('student_page')
@login_required
def student_page(request):
log = logging.getLogger('mysite')
user_instance = get_object_or_404(CustomUser, user=request.user)
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
obj.save()
m_tags = form.cleaned_data['m_tags']
tags = Tag.objects.all()
if m_tags in tags:
obj.tags.add(*m_tags)
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)
form.save_m2m()
messages.info(request, 'Der Tag "' + m_tags + '" wurde gespeichert')
return redirect('/student/')
else:
messages.info(request, 'Sorry !! Den Tag den du suchst gibt es leider nicht!')
@@ -159,27 +178,6 @@ def tag_list(request):
posts = Post.objects.filter(tags__in=[tag]).order_by('-published_date')
log.info(posts)
return render(request, 'tag_list.html', locals())
class TagSearch(TagCanvasListView):
template_name = 'blog_search_list_view.html'
model = Post
context_object_name = 'list'
paginate_by = 8
def get_context_data(self, **kwargs):
context = super(CustomerSearch, self).get_context_data(**kwargs)
context = self.get_queryset()
return context
def get_queryset(self):
cObj = Customer.objects.all()
var_get_search = self.request.GET.get('search_box')
if var_get_search is not None:
cObj = cObj.filter(firstname__icontains=var_get_search)
if var_get_order_by is not None:
cObj = cObj.order_by(var_get_order_by)
return cObj
def blog_search_list_view(request):
log = logging.getLogger('mysite')
@@ -192,3 +190,11 @@ def blog_search_list_view(request):
def tag_cloud(request):
return render(request, 'tag_cloud.html', {})
mail.send(
'kleinhenz.e@gmail.com', # List of email addresses also accepted
'esther.kleinhenz@web.de',
subject='My email',
message='Hi there!',
html_message='Hi <strong>there</strong>!',
)
@@ -0,0 +1,36 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{Acknowledgements}{iii}{chapter*.2}}
\@setckpt{AcknowledgmentsDedicationSentence/acknowledgements}{
\setcounter{page}{4}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{0}
\setcounter{section}{0}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\setcounter{float@type}{8}
\setcounter{parentequation}{0}
\setcounter{lstnumber}{1}
\setcounter{ContinuedFloat}{0}
\setcounter{subfigure}{0}
\setcounter{subtable}{0}
\setcounter{r@tfl@t}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{2}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
}
@@ -24,7 +24,7 @@
\babel@aux{german}{}
\@input{abstract/abstract.aux}
\HyPL@Entry{2<</S/r>>}
\HyPL@Entry{6<</S/D>>}
\HyPL@Entry{5<</S/D>>}
\@writefile{toc}{\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.4}}
\@input{chapters/einleitung.aux}
\@input{chapters/framework.aux}
@@ -35,13 +35,25 @@
\bibstyle{alpha}
\citation{*}
\bibdata{references/References_2}
\bibcite{Bootstrap}{{BA11}{}{{}}{{}}}
\bibcite{Computer}{{Com18}{}{{}}{{}}}
\bibcite{Oracle}{{Coo10}{}{{}}{{}}}
\bibcite{Dixit}{{Dix18}{}{{}}{{}}}
\bibcite{Python}{{Fou18}{}{{}}{{}}}
\bibcite{Schlede}{{FMS17}{}{{}}{{}}}
\bibcite{Django}{{Fou18a}{}{{}}{{}}}
\bibcite{Python}{{Fou18b}{}{{}}{{}}}
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}}
\bibcite{Herzog}{{Her16}{}{{}}{{}}}
\bibcite{King}{{Kin17}{}{{}}{{}}}
\bibcite{Leipner}{{Lei13}{}{{}}{{}}}
\@writefile{toc}{\contentsline {chapter}{Referenzen}{21}{chapter*.14}}
\bibcite{Microsoft}{{Mic18}{}{{}}{{}}}
\bibcite{Ndukwe}{{Ndu17}{}{{}}{{}}}
\bibcite{Ong}{{Ong18}{}{{}}{{}}}
\bibcite{Otto}{{Ott11}{}{{}}{{}}}
\bibcite{Shabda}{{Sha09}{}{{}}{{}}}
\bibcite{Shelest}{{She09}{}{{}}{{}}}
\bibcite{Solutions}{{Sol17}{}{{}}{{}}}
\bibcite{Timm}{{Tim15}{}{{}}{{}}}
\bibcite{Weigend}{{Wei17}{}{{}}{{}}}
\providecommand\NAT@force@numbers{}\NAT@force@numbers
\@writefile{toc}{\contentsline {chapter}{Referenzen}{19}{chapter*.11}}
@@ -1,4 +1,22 @@
\begin{thebibliography}{Ndu17}
\begin{thebibliography}{Fou18b}
\bibitem[BA11]{Bootstrap}
Twitter~Inc Bootstrap~Authors.
\newblock Bootstrap repository.
\newblock 2011.
\newblock https://github.com/twbs/bootstrap.
\bibitem[Com18]{Computer}
The Computer~Language Company.
\newblock Definition of: user permissions.
\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.
@@ -7,7 +25,20 @@ Chitrank Dixit.
\newblock
https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code.
\bibitem[Fou18]{Python}
\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}
Django~Software Foundation.
\newblock django.contrib.auth, user model.
\newblock 2018.
\newblock https://docs.djangoproject.com/en/2.1/ref/contrib/auth/.
\bibitem[Fou18b]{Python}
Python~Software Foundation.
\newblock Virtual environments and packages.
\newblock 2018.
@@ -42,6 +73,12 @@ 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
@@ -50,6 +87,25 @@ Nnenna Ndukwe.
\newblock
https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why.
\bibitem[Ong18]{Ong}
Selwin Ong.
\newblock django-post\_office git repository.
\newblock 2018.
\newblock https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst.
\bibitem[Ott11]{Otto}
Mark Otto.
\newblock Bootstrap from twitter.
\newblock 2011.
\newblock
https://blog.twitter.com/developer/en\_us/a/2011/bootstrap-twitter.html.
\bibitem[Sha09]{Shabda}
Shabda.
\newblock Understanding decorators.
\newblock 2009.
\newblock https://www.agiliq.com/blog/2009/06/understanding-decorators/.
\bibitem[She09]{Shelest}
Alexy Shelest.
\newblock Model view controller, model view presenter, and model view viewmodel
@@ -58,4 +114,23 @@ Alexy Shelest.
\newblock
https://www.codeproject.com/Articles/42830/Model-View-Controller-Model-View-Presenter-and-Mod.
\bibitem[Sol17]{Solutions}
Mindfire Solutions.
\newblock Advantages and disadvantages of python programming language.
\newblock 2017.
\newblock
https://medium.com/@mindfiresolutions.usa/advantages-and-disadvantages-of-python-programming-language-fd0b394f2121.
\bibitem[Tim15]{Timm}
Damon Timm.
\newblock django-hitcount documentation.
\newblock 2015.
\newblock https://django-hitcount.readthedocs.io/en/latest/overview.html.
\bibitem[Wei17]{Weigend}
Michael Weigend.
\newblock {\em Python GE-PACKT}.
\newblock 2017.
\newblock Kapitel 23.1.
\end{thebibliography}
@@ -11,53 +11,77 @@ A level-1 auxiliary file: chapters/ausblick.aux
A level-1 auxiliary file: chapters/fazit.aux
The style file: alpha.bst
Database file #1: ../references/References_2.bib
Repeated entry---line 78 of file ../references/References_2.bib
: @article{Ong
: ,
I'm skipping whatever remains of this entry
Repeated entry---line 127 of file ../references/References_2.bib
: @article{Otto
: ,
I'm skipping whatever remains of this entry
Repeated entry---line 141 of file ../references/References_2.bib
: @article{Django
: ,
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 Schlede
Warning--empty journal in Django
Warning--empty journal in Python
Warning--empty journal in Gaynor
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 Ong
Warning--empty journal in Otto
Warning--empty journal in Shabda
Warning--empty journal in Shelest
You've used 8 entries,
Warning--empty journal in Solutions
Warning--empty journal in Timm
Warning--empty publisher in Weigend
You've used 20 entries,
2543 wiz_defined-function locations,
611 strings with 6085 characters,
and the built_in function-call counts, 2196 in all, are:
= -- 216
> -- 64
< -- 8
+ -- 16
- -- 16
* -- 106
:= -- 390
add.period$ -- 32
call.type$ -- 8
change.case$ -- 40
chr.to.int$ -- 8
cite$ -- 16
duplicate$ -- 112
empty$ -- 161
format.name$ -- 32
if$ -- 426
int.to.chr$ -- 1
671 strings with 7567 characters,
and the built_in function-call counts, 5457 in all, are:
= -- 537
> -- 160
< -- 20
+ -- 41
- -- 40
* -- 264
:= -- 959
add.period$ -- 80
call.type$ -- 20
change.case$ -- 99
chr.to.int$ -- 19
cite$ -- 40
duplicate$ -- 282
empty$ -- 406
format.name$ -- 78
if$ -- 1065
int.to.chr$ -- 2
int.to.str$ -- 0
missing$ -- 8
newline$ -- 51
num.names$ -- 24
pop$ -- 48
missing$ -- 21
newline$ -- 123
num.names$ -- 60
pop$ -- 121
preamble$ -- 1
purify$ -- 48
purify$ -- 120
quote$ -- 0
skip$ -- 88
skip$ -- 217
stack$ -- 0
substring$ -- 56
swap$ -- 0
text.length$ -- 8
text.prefix$ -- 8
substring$ -- 140
swap$ -- 1
text.length$ -- 20
text.prefix$ -- 18
top$ -- 0
type$ -- 64
warning$ -- 8
while$ -- 16
width$ -- 10
write$ -- 106
(There were 8 warnings)
type$ -- 156
warning$ -- 20
while$ -- 40
width$ -- 25
write$ -- 262
(There were 3 error messages)
@@ -2,12 +2,15 @@
\babel@toc {german}{}
\addvspace {10\p@ }
\addvspace {10\p@ }
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{6}{figure.caption.5}
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\relax }}{7}{figure.caption.6}
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees\relax }}{9}{figure.caption.8}
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP ([She09])\relax }}{5}{figure.caption.5}
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks ([Nev15])\relax }}{6}{figure.caption.6}
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{7}{figure.caption.7}
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees ([Orc10])\relax }}{8}{figure.caption.8}
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.9}
\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{12}{figure.caption.10}
\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{11}{figure.caption.10}
\addvspace {10\p@ }
\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{13}{figure.caption.11}
\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{15}{figure.caption.12}
\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von User und Post\relax }}{16}{figure.caption.13}
\addvspace {10\p@ }
\addvspace {10\p@ }
@@ -1,4 +1,4 @@
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 15 OCT 2018 21:49
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 9 NOV 2018 15:56
entering extended mode
\write18 enabled.
file:line:error style messages enabled.
@@ -902,7 +902,14 @@ Package: fancyhdr 2017/06/30 v3.9a Extensive control of page headers and footers
\f@nch@O@erf=\skip74
\f@nch@O@olf=\skip75
\f@nch@O@orf=\skip76
))
)
Package Fancyhdr Warning: \fancyhead's `E' option without twoside option is useless on input line 71.
Package Fancyhdr Warning: \fancyfoot's `E' option without twoside option is useless on input line 73.
)
./bachelorabeit_EstherKleinhenz.tex:5: Extra \else.
\@include ...ediate \closeout \@partaux \fi \else
\deadcycles \z@ \@nameuse ...
@@ -945,7 +952,7 @@ LaTeX Font Info: ... okay on input line 26.
* paper: a4paper
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes: twoside
* modes:
* h-part:(L,W,R)=(56.9055pt, 426.79135pt, 113.81102pt)
* v-part:(T,H,B)=(85.35826pt, 674.33032pt, 85.35826pt)
* \paperwidth=597.50787pt
@@ -953,13 +960,13 @@ LaTeX Font Info: ... okay on input line 26.
* \textwidth=426.79135pt
* \textheight=674.33032pt
* \oddsidemargin=-15.36449pt
* \evensidemargin=41.54103pt
* \evensidemargin=-15.36449pt
* \topmargin=-23.91173pt
* \headheight=12.0pt
* \headsep=25.0pt
* \topskip=12.0pt
* \footskip=30.0pt
* \marginparwidth=85.0pt
* \marginparwidth=35.0pt
* \marginparsep=10.0pt
* \columnsep=10.0pt
* \skip\footins=10.8pt plus 4.0pt minus 2.0pt
@@ -967,8 +974,8 @@ LaTeX Font Info: ... okay on input line 26.
* \voffset=0.0pt
* \mag=1000
* \@twocolumnfalse
* \@twosidetrue
* \@mparswitchtrue
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)
@@ -1043,17 +1050,17 @@ Underfull \hbox (badness 10000) in paragraph at lines 48--57
[]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 85.
(babel) in language on input line 82.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 85.
(babel) in language on input line 82.
[2])
\openout2 = `abstract/abstract.aux'.
@@ -1085,56 +1092,47 @@ Package babel Info: Redefining german shorthand "~
]
] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 49.
(babel) in language on input line 29.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 49.
(babel) in language on input line 29.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 49.
(babel) in language on input line 29.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 49.
(babel) in language on input line 29.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 49.
(babel) in language on input line 29.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 49.
(babel) in language on input line 29.
[2
] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc)
])
\tf@toc=\write6
\openout6 = `bachelorabeit_EstherKleinhenz.toc'.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
[3]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
[4
]
Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
We now make it that large for the rest of the document.
This may cause the page layout to be inconsistent, however.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
[3]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
@@ -1160,27 +1158,12 @@ Package babel Info: Redefining german shorthand "~
[1
]
\openout2 = `chapters/einleitung.aux'.
(./chapters/einleitung.tex
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
[2
]
Kapitel 1.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
@@ -1210,35 +1193,32 @@ Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 12.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
[3]
(babel) in language on input line 12.
[2
]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 13.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 13.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
(babel) in language on input line 13.
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
)
Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
We now make it that large for the rest of the document.
This may cause the page layout to be inconsistent, however.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 57.
Package babel Info: Redefining german shorthand "|
@@ -1251,7 +1231,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 57.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 57.
[4]
[3]
\openout2 = `chapters/framework.aux'.
(./chapters/framework.tex
@@ -1263,153 +1243,185 @@ Package babel Info: Redefining german shorthand "|
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 7.
(babel) in language on input line 6.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 7.
(babel) in language on input line 6.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 7.
(babel) in language on input line 6.
File: figures/MVP.png Graphic file (type bmp)
<figures/MVP.png>
LaTeX Warning: `!h' float specifier changed to `!ht'.
LaTeX Font Info: Try loading font information for TS1+aer on input line 21.
LaTeX Font Info: No file TS1aer.fd. on input line 21.
LaTeX Font Warning: Font shape `TS1/aer/m/n' undefined
(Font) using `TS1/cmr/m/n' instead
(Font) for symbol `textbullet' on input line 21.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 22.
(babel) in language on input line 20.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 22.
(babel) in language on input line 20.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 22.
(babel) in language on input line 20.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 22.
(babel) in language on input line 20.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 22.
(babel) in language on input line 20.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 22.
[5
(babel) in language on input line 20.
[4
]
LaTeX Font Info: Try loading font information for TS1+aer on input line 20.
LaTeX Font Info: No file TS1aer.fd. on input line 20.
LaTeX Font Warning: Font shape `TS1/aer/m/n' undefined
(Font) using `TS1/cmr/m/n' instead
(Font) for symbol `textbullet' on input line 20.
File: figures/request-response-cycle.png Graphic file (type bmp)
<figures/request-response-cycle.png>
LaTeX Warning: `!h' float specifier changed to `!ht'.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 36.
(babel) in language on input line 35.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 36.
(babel) in language on input line 35.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 36.
(babel) in language on input line 35.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 51.
(babel) in language on input line 38.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 51.
(babel) in language on input line 38.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 51.
(babel) in language on input line 38.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 51.
(babel) in language on input line 38.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 51.
(babel) in language on input line 38.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 51.
[6]
Underfull \vbox (badness 10000) has occurred while \output is active []
(babel) in language on input line 38.
[5]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 53.
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 53.
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 53.
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 53.
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 53.
(babel) in language on input line 50.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 53.
[7]
(babel) in language on input line 50.
[6]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
(babel) in language on input line 54.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
(babel) in language on input line 54.
File: figures/virt-env-terminal.png Graphic file (type bmp)
<figures/virt-env-terminal.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 80.
(babel) in language on input line 67.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 80.
(babel) in language on input line 67.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 80.
(babel) in language on input line 67.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 80.
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 80.
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 80.
[8]
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 70.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 70.
[7]
File: figures/ldap-tree.png Graphic file (type bmp)
<figures/ldap-tree.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 78.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 78.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 78.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 81.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 83.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 83.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 83.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 83.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 83.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 83.
[8]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 100.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 100.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 100.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 100.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 100.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 100.
[9]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 118.
(babel) in language on input line 104.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 118.
(babel) in language on input line 104.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 118.
Underfull \vbox (badness 10000) has occurred while \output is active []
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 120.
[10]
(babel) in language on input line 104.
File: figures/bootstrap-head-tag.png Graphic file (type bmp)
<figures/bootstrap-head-tag.png>
File: figures/bootstrap-class-example.png Graphic file (type bmp)
<figures/bootstrap-class-example.png>
LaTeX Warning: `!h' float specifier changed to `!ht'.
File: figures/bootstrap-class-example.png Graphic file (type bmp)
<figures/bootstrap-class-example.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 123.
[10]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 129.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 129.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 129.
)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
@@ -1424,19 +1436,6 @@ Package babel Info: Redefining german shorthand "|
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
[11]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 58.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 58.
[12]
\openout2 = `chapters/prototyp.aux'.
(./chapters/prototyp.tex
@@ -1453,52 +1452,174 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 5.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 5.
File: figures/forschungsdesign.png Graphic file (type bmp)
<figures/forschungsdesign.png>
LaTeX Warning: `!h' float specifier changed to `!ht'.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 16.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 16.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 16.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 19.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 19.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 19.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 19.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 19.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 19.
[12
]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 27.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 27.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 27.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 27.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 27.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 27.
[13]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 31.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 31.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 31.
Underfull \hbox (badness 10000) in paragraph at lines 34--45
Overfull \hbox (6.80373pt too wide) in paragraph at lines 6--7
\T1/aer/m/n/12 Grundlegender Auf-bau der Web-site, Ver-wal-tung der Da-ten evlt auf noch-mal Taggable-
[]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 8.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 8.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 8.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 11.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 11.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 11.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 15.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 15.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 15.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 18.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 18.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 18.
(babel) in language on input line 52.
[14]
File: figures/custommodelcode.png Graphic file (type bmp)
<figures/custommodelcode.png>
Overfull \hbox (1.12642pt too wide) in paragraph at lines 19--20
Underfull \hbox (badness 10000) in paragraph at lines 72--74
[]
File: figures/datamodel.png Graphic file (type bmp)
<figures/datamodel.png>
LaTeX Warning: `!h' float specifier changed to `!ht'.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 90.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 90.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 90.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 92.
[15]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 92.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 92.
[16]
Overfull \hbox (9.91238pt too wide) in paragraph at lines 93--94
[]\T1/aer/m/n/12 Ein Django-Projekt bil-det be-reits beim Ein-rich-ten, \T1/aer/m/it/12 per De-fault\T1/aer/m/n/12 , ei-ne Administrator-
[]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 96.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 96.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 96.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 106.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 106.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 106.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 109.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 109.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 109.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 114.
[17]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 114.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 114.
Overfull \hbox (1.12642pt too wide) in paragraph at lines 115--116
\T1/aer/m/n/12 Tags als ein-ge-logg-ter User abon-nie-ren und ver-wal-ten Front-end und Admin-Backend?
[]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 21.
(babel) in language on input line 117.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 21.
(babel) in language on input line 117.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 21.
(babel) in language on input line 117.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 24.
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 24.
(babel) in language on input line 120.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 24.
(babel) in language on input line 120.
)
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 59.
@@ -1512,25 +1633,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 59.
[13
]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 59.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 59.
[14]
[18]
\openout2 = `chapters/ergebnis.aux'.
(./chapters/ergebnis.tex
@@ -1564,7 +1667,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 60.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 60.
[15
[19
@@ -1576,26 +1679,6 @@ Package babel Info: Redefining german shorthand "~
\openout2 = `chapters/fazit.aux'.
(./chapters/fazit.tex
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
[16
]
Kapitel 5.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
@@ -1616,24 +1699,14 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 62.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 62.
[17] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
[18
[20
]
] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 1.
Package babel Info: Redefining german shorthand "|
@@ -1641,37 +1714,84 @@ Package babel Info: Redefining german shorthand "|
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 1.
Underfull \hbox (badness 10000) in paragraph at lines 4--9
Underfull \hbox (badness 4316) in paragraph at lines 4--8
[]\T1/aer/m/n/12 Twitter Inc Boot-strap Aut-hors. Boot-strap re-po-si-to-ry. 2011.
[]
Underfull \hbox (badness 10000) in paragraph at lines 16--20
[]\T1/aer/m/n/12 Oracle Coope-ra-ti-on. About ldap. 2010.
[]
Underfull \hbox (badness 10000) in paragraph at lines 22--27
\T1/aer/m/n/12 https://www.datacamp.com/community/tutorials/pep8-tutorial-python-
[]
Missing character: There is no ’ in font aer12!
Underfull \hbox (badness 1521) in paragraph at lines 31--36
[]\T1/aer/m/n/12 Adam King. Djan-go midd-le-wa-res and the re-quest/-re-spon-se cy-cle.
Underfull \hbox (badness 2717) in paragraph at lines 62--67
[]\T1/aer/m/n/12 Adam King. Djan-go midd-le-wa-res and the re-quest/-re-spon-se cy-
[]
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Missing character: There is no ̈ in font aer12!
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 75.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 75.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 75.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 75.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 75.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 75.
[21
]
Missing character: There is no ’ in font aer12!
Underfull \hbox (badness 10000) in paragraph at lines 46--52
Underfull \hbox (badness 10000) in paragraph at lines 83--89
\T1/aer/m/n/12 medium-com-nnennandukwe-python-is-the-back-end-programming-
[]
Underfull \hbox (badness 10000) in paragraph at lines 54--60
Underfull \hbox (badness 10000) in paragraph at lines 91--95
[]\T1/aer/m/n/12 Selwin Ong. django-post_office git re-po-si-to-ry. 2018.
[]
Underfull \hbox (badness 10000) in paragraph at lines 97--102
[]\T1/aer/m/n/12 Mark Ot-to. Boot-strap from twit-ter. 2011.
[]
Underfull \hbox (badness 10000) in paragraph at lines 97--102
\T1/aer/m/n/12 https://blog.twitter.com/developer/en_us/a/2011/bootstrap-
[]
Underfull \hbox (badness 10000) in paragraph at lines 104--108
[]\T1/aer/m/n/12 Shabda. Un-der-stan-ding de-co-ra-tors. 2009.
[]
Underfull \hbox (badness 10000) in paragraph at lines 110--116
[]\T1/aer/m/n/12 Alexy She-lest. Mo-del view con-trol-ler, mo-del view pre-
[]
Underfull \hbox (badness 10000) in paragraph at lines 54--60
Underfull \hbox (badness 10000) in paragraph at lines 110--116
\T1/aer/m/n/12 sen-ter, and mo-del view view-mo-del de-sign pat-terns. 2009.
[]
Underfull \hbox (badness 10000) in paragraph at lines 54--60
Underfull \hbox (badness 10000) in paragraph at lines 110--116
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller-
[]
@@ -1689,7 +1809,7 @@ Package babel Info: Redefining german shorthand "|
(babel) in language on input line 77.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 77.
[19]
[22]
Package atveryend Info: Empty hook `AfterLastShipout' on input line 77.
(/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/titlepage/titlepage.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/abstract/abstract.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/einleitung.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux))
Package atveryend Info: Empty hook `AtVeryEndDocument' on input line 77.
@@ -1704,12 +1824,12 @@ Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 77.
)
(\end occurred when \ifnum on line 5 was incomplete)
Here is how much of TeX's memory you used:
26561 strings out of 492970
476474 string characters out of 6133939
547394 words of memory out of 5000000
30175 multiletter control sequences out of 15000+600000
554220 words of font info for 61 fonts, out of 8000000 for 9000
26612 strings out of 492970
477352 string characters out of 6133939
547177 words of memory out of 5000000
30222 multiletter control sequences out of 15000+600000
555998 words of font info for 62 fonts, out of 8000000 for 9000
1348 hyphenation exceptions out of 8191
58i,11n,50p,10437b,892s stack positions out of 5000i,500n,10000p,200000b,80000s
58i,12n,50p,10437b,958s stack positions out of 5000i,500n,10000p,200000b,80000s
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (25 pages).
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (27 pages).
@@ -5,19 +5,26 @@
\BOOKMARK [1][-]{section.1.2}{Ziel\040der\040Arbeit}{chapter.1}% 5
\BOOKMARK [0][-]{chapter.2}{Framework}{}% 6
\BOOKMARK [1][-]{section.2.1}{Django}{chapter.2}% 7
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten}{section.2.1}% 8
\BOOKMARK [1][-]{section.2.2}{Erweiterungen}{chapter.2}% 9
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 10
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 11
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 12
\BOOKMARK [1][-]{section.3.1}{Organisation}{chapter.3}% 13
\BOOKMARK [2][-]{subsection.3.1.1}{Verwaltung\040im\040Administrator-Backend}{section.3.1}% 14
\BOOKMARK [2][-]{subsection.3.1.2}{Berechtigung\040der\040User}{section.3.1}% 15
\BOOKMARK [1][-]{section.3.2}{Funktion}{chapter.3}% 16
\BOOKMARK [2][-]{subsection.3.2.1}{Abonnieren}{section.3.2}% 17
\BOOKMARK [2][-]{subsection.3.2.2}{Filtern}{section.3.2}% 18
\BOOKMARK [2][-]{subsection.3.2.3}{Benachrichtigung}{section.3.2}% 19
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 20
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 21
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 22
\BOOKMARK [0][-]{chapter*.11}{Referenzen}{}% 23
\BOOKMARK [2][-]{subsection.2.1.1}{Besonderheiten\040Django's}{section.2.1}% 8
\BOOKMARK [2][-]{subsection.2.1.2}{Virtuelle\040Umgebung}{section.2.1}% 9
\BOOKMARK [2][-]{subsection.2.1.3}{Lightweight\040Directory\040Access\040Protocol}{section.2.1}% 10
\BOOKMARK [1][-]{section.2.2}{Erweiterungen}{chapter.2}% 11
\BOOKMARK [2][-]{subsection.2.2.1}{Taggable-Manager}{section.2.2}% 12
\BOOKMARK [2][-]{subsection.2.2.2}{Hilfsbibliotheken}{section.2.2}% 13
\BOOKMARK [1][-]{section.2.3}{Bootstrap}{chapter.2}% 14
\BOOKMARK [1][-]{section.2.4}{Cron}{chapter.2}% 15
\BOOKMARK [0][-]{chapter.3}{Prototyp}{}% 16
\BOOKMARK [1][-]{section.3.1}{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*.14}{Referenzen}{}% 30
@@ -2,24 +2,31 @@
\babel@toc {german}{}
\contentsline {chapter}{Abstract}{i}{figure.caption.1}
\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.4}
\contentsline {chapter}{\numberline {1}Einleitung}{3}{chapter.1}
\contentsline {section}{\numberline {1.1}Ausgangssituation}{3}{section.1.1}
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{4}{section.1.2}
\contentsline {chapter}{\numberline {2}Framework}{5}{chapter.2}
\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{6}{subsection.2.1.1}
\contentsline {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}{4}{chapter.2}
\contentsline {section}{\numberline {2.1}Django}{4}{section.2.1}
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Django's}{6}{subsection.2.1.1}
\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{7}{subsection.2.1.2}
\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{7}{subsection.2.1.3}
\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2}
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}
\contentsline {section}{\numberline {2.3}Bootstrap}{11}{section.2.3}
\contentsline {chapter}{\numberline {3}Prototyp}{13}{chapter.3}
\contentsline {section}{\numberline {3.1}Organisation}{13}{section.3.1}
\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{13}{subsection.3.1.1}
\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{13}{subsection.3.1.2}
\contentsline {section}{\numberline {3.2}Funktion}{13}{section.3.2}
\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{13}{subsection.3.2.1}
\contentsline {subsection}{\numberline {3.2.2}Filtern}{13}{subsection.3.2.2}
\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{14}{subsection.3.2.3}
\contentsline {chapter}{\numberline {4}Ergebnis}{15}{chapter.4}
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{15}{subsection.4.0.1}
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{17}{chapter.5}
\contentsline {chapter}{Referenzen}{19}{chapter*.11}
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{8}{subsection.2.2.1}
\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{9}{subsection.2.2.2}
\contentsline {section}{\numberline {2.3}Bootstrap}{10}{section.2.3}
\contentsline {section}{\numberline {2.4}Cron}{11}{section.2.4}
\contentsline {chapter}{\numberline {3}Prototyp}{12}{chapter.3}
\contentsline {section}{\numberline {3.1}Forschungsdesign}{12}{section.3.1}
\contentsline {section}{\numberline {3.2}Organisation}{13}{section.3.2}
\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{14}{subsection.3.2.1}
\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{16}{subsection.3.2.2}
\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{17}{subsection.3.2.3}
\contentsline {section}{\numberline {3.3}Funktionen}{17}{section.3.3}
\contentsline {subsection}{\numberline {3.3.1}Verwalten}{18}{subsection.3.3.1}
\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{18}{subsection.3.3.2}
\contentsline {subsection}{\numberline {3.3.3}Filtern}{18}{subsection.3.3.3}
\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{18}{subsection.3.3.4}
\contentsline {chapter}{\numberline {4}Ergebnis}{19}{chapter.4}
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{19}{subsection.4.0.1}
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{20}{chapter.5}
\contentsline {chapter}{Referenzen}{21}{chapter*.14}
@@ -1,7 +1,7 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@setckpt{chapters/ausblick}{
\setcounter{page}{16}
\setcounter{page}{20}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -28,7 +28,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{21}
\setcounter{bookmark@seq@number}{28}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
@@ -1,12 +1,12 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Einleitung}{3}{chapter.1}}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Einleitung}{2}{chapter.1}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Ausgangssituation}{3}{section.1.1}}
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{4}{section.1.2}}
\@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}
@@ -1,12 +1,12 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Ergebnis}{15}{chapter.4}}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Ergebnis}{19}{chapter.4}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:ergebnis}{{4}{15}{Ergebnis}{chapter.4}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{15}{subsection.4.0.1}}
\newlabel{ch:ergebnis}{{4}{19}{Ergebnis}{chapter.4}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{19}{subsection.4.0.1}}
\@setckpt{chapters/ergebnis}{
\setcounter{page}{16}
\setcounter{page}{20}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -33,7 +33,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{21}
\setcounter{bookmark@seq@number}{28}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
@@ -1,11 +1,11 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{17}{chapter.5}}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{20}{chapter.5}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:zusammenfassung}{{5}{17}{Zusammenfassung und Ausblick}{chapter.5}{}}
\newlabel{ch:zusammenfassung}{{5}{20}{Zusammenfassung und Ausblick}{chapter.5}{}}
\@setckpt{chapters/fazit}{
\setcounter{page}{18}
\setcounter{page}{21}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -32,7 +32,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{22}
\setcounter{bookmark@seq@number}{29}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
@@ -1,22 +1,26 @@
\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\relax }}{6}{figure.caption.5}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{6}{subsection.2.1.1}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\relax }}{7}{figure.caption.6}}
\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.5}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks ([Nev15])\relax }}{6}{figure.caption.6}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Django's}{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.7}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{7}{subsection.2.1.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees ([Orc10])\relax }}{8}{figure.caption.8}}
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees\relax }}{9}{figure.caption.8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}}
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{11}{section.2.3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{8}{subsection.2.2.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{9}{subsection.2.2.2}}
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{10}{section.2.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{11}{figure.caption.9}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{12}{figure.caption.10}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{11}{figure.caption.10}}
\@writefile{toc}{\contentsline {section}{\numberline {2.4}Cron}{11}{section.2.4}}
\@setckpt{chapters/framework}{
\setcounter{page}{13}
\setcounter{page}{12}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -26,7 +30,7 @@
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{2}
\setcounter{section}{3}
\setcounter{section}{4}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
@@ -43,7 +47,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{11}
\setcounter{bookmark@seq@number}{15}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
@@ -1,18 +1,24 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{13}{chapter.3}}
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{12}{chapter.3}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:prototyp}{{3}{13}{Prototyp}{chapter.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Organisation}{13}{section.3.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{13}{subsection.3.1.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{13}{subsection.3.1.2}}
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Funktion}{13}{section.3.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{13}{subsection.3.2.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Filtern}{13}{subsection.3.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{14}{subsection.3.2.3}}
\newlabel{ch:prototyp}{{3}{12}{Prototyp}{chapter.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Forschungsdesign}{12}{section.3.1}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{13}{figure.caption.11}}
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Organisation}{13}{section.3.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Datenmodellierung}{14}{subsection.3.2.1}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces CustomUserModel in models.py\relax }}{15}{figure.caption.12}}
\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Datenmodellierung von User und Post\relax }}{16}{figure.caption.13}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Verwaltung im Administrator-Back-end}{16}{subsection.3.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Berechtigung der User}{17}{subsection.3.2.3}}
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Funktionen}{17}{section.3.3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Verwalten}{18}{subsection.3.3.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Abonnieren}{18}{subsection.3.3.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.3}Filtern}{18}{subsection.3.3.3}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.4}Benachrichtigung}{18}{subsection.3.3.4}}
\@setckpt{chapters/prototyp}{
\setcounter{page}{15}
\setcounter{page}{19}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -22,12 +28,12 @@
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{3}
\setcounter{section}{2}
\setcounter{subsection}{3}
\setcounter{section}{3}
\setcounter{subsection}{4}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{figure}{3}
\setcounter{table}{0}
\setcounter{float@type}{8}
\setcounter{parentequation}{0}
@@ -39,7 +45,7 @@
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{19}
\setcounter{bookmark@seq@number}{26}
\setcounter{NAT@ctr}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
@@ -1,7 +1,7 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@setckpt{titlepage/titlepage}{
\setcounter{page}{3}
\setcounter{page}{1}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
@@ -1,5 +1,5 @@
\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst}
\documentclass[12pt,a4paper,openright,twoside]{report}
\documentclass[12pt,a4paper,openright,oneside]{report}
%------------------------------------------------------------------------------
% preambule
\include{preambule/thesis.preamble}
@@ -1,13 +1,15 @@
\chapter{Einleitung}
\textcolor{red}{Die vorliegende Arbeit beschäftigt sich mit der wachsenden E-Mail-Flut in den Postfächern der Studierenden und wie man diese reduzieren kann.}
Schon seit geraumer Zeit ist bekannt, dass das Versenden von Informationen über elektronische Post nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich sich vernünftig mit den Informationen zu befassen"([Ver13]). Nicht nur am Arbeitsplatz sondern auch in Hochschulen wird Gebrauch gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Um die Prioritäten der Informationen besser bilden zu können, sollen Studierende selbst entscheiden, welche Nachrichten relevant sind. Hierfür wird eine Social Media Plattform mit personalisierbarem Dashboard implementiert.
Schon seit geraumer Zeit ist bekannt, dass das Versenden von Informationen über elektronische Post nicht nur Vorteile mit sich bringt. Wie der Spezialist für Gesundheitsprozessberatung in einem Bericht der Mitteldeutschen Zeitung erwähnt, \glqq macht es die stets wachsende E-Mail-Menge unmöglich sich vernünftig mit den Informationen zu befassen"(vgl. [Ver13]). Nicht nur am Arbeitsplatz sondern auch in Hochschulen wird Gebrauch gemacht, weitere Empfänger oder sogar ganze Verteiler mit in die Kopie einer E-Mail zu integrieren. Um die Prioritäten der Informationen besser bilden zu können, sollen Studierende selbst entscheiden, welche Nachrichten relevant sind. Hierfür wird eine Social Media Plattform mit personalisierbarem Dashboard implementiert.
\section{Ausgangssituation}
Alle Informationen der Fakultät Elektrotechnik Feinwerktechnik Informationstechnik, kurz efi, werden über die globalen Verteiler des Hochschulinternen Postfaches versendet. Viele dieser Daten sind jedoch nur für eine geringe Schnittmenge der Empfänger relevant und lassen sich nur schwer priorisieren. Das ständig überlastete Postfach muss somit regelmä"sig gepflegt werden. Einen massiven Administrativen Aufwand bedeutet es, E-Mails zu filtern und nach persönlichem Ermessen zu verwalten.
Alle Informationen der Fakultät Elektrotechnik Feinwerktechnik Informationstechnik, kurz efi, werden über die globalen Verteiler des Hochschulinternen Postfaches versendet. Viele dieser Daten sind jedoch nur für eine geringe Schnittmenge der Empfänger relevant und lassen sich schwer priorisieren. Das ständig überlastete Postfach muss somit regelmä"sig gepflegt werden. Einen massiven Administrativen Aufwand bedeutet es, E-Mails zu filtern und nach persönlichem Ermessen zu verwalten.
---genauer sagen woher ich mir sicher bin, dass das postfach überlastet ist
Zudem leidet die Nachhaltigkeit der Informationen. Möchten die Empfänger ältere E-Mails abrufen, mussten diese meist schon entfernt werden um Platz für den neuen, eintreffenden E-Mail-Verkehr zu schaffen.
Diese Situation führt dazu, dass Empfänger die Informationen meist nicht lesen und sofort entfernen. Die Ersteller haben keinerlei Möglichkeiten zu überprüfen ob und wie viele Studierende und Dozenten eingehende Nachrichten öffnen und lesen.
Die Empfänger lesen die Informationen meist nicht und entfernen sie sofort. Au"serdem haben die Ersteller keinerlei Möglichkeiten zu überprüfen ob und wie viele Studierende und Dozenten eingehende Nachrichten öffnen und lesen.
Aus diesere Situation heraus, stellt sich folgende Forschungsfrage: \glqq Kann die E-Mail-Flut der Technischen Hochschule mit Hilfe einer Social Media Plattform gedrosselt und die Nachhaltigkeit der Informationen gedrosselt werden?"
\section{Ziel der Arbeit}
Ziel der Arbeit ist es, durch die Einbindung einer Social Media Plattform den Speicheraufwand des Hochschulpostfaches für Studierende der Efi-Fakultät zu reduzieren. Die Flut an E-Mails soll durch das Verwenden eines personalisierte Dashboard gedrosselt werden. Hierbei wird zunächst der Fokus auf die grundlegenden Funktionen der Website gelegt. Dazu gehört das Abonnieren, einpflegen von neuen und löschen von alten Nachrichten.
Zudem sollen die Autoren benachrichtigt werden, in welchem Umfang die hochgeladenen Informationen bereits abonniert und gelesen wurden.
Ziel der Arbeit ist es, durch die Einbindung einer Social Media Plattform den Speicheraufwand des Hochschulpostfaches für Studierende der Efi-Fakultät zu reduzieren. Das Broadcast-Ähnliche senden soll nur noch in den seltensten Fällen von Nöten sein. Um den Administrativen Aufwand der Empfänger so gering wie möglich zu halten, wird das Online-Dashboard individuell konfigurierbar sein. Der Schwerpunkt liegt dabei auf der prototypischen Umsetzung der Website-Erweiterung. Hierbei wird zunächst der Fokus auf die grundlegenden Funktionen dieser gelegt. Dazu gehört das Abonnieren, einpflegen von neuen und löschen von alten Nachrichten. Um den Informationsfluss nicht aus den Augen zu verlieren soll in regelmäßigen Abständen eine automatisierte E-Mail an den Betreffenden versendet werden.
Zudem sollen die Autoren benachrichtigt werden, in welchem Umfang die hochgeladenen Informationen bereits abonniert und gelesen wurden. Dadurch lässt sich, nach einem gewissen Zeitraum, feststellen ob die Studierenden und Dozenten die Nachrichten für relevant erachten und die Plattform weiterhin lohnenswert ist.
@@ -2,3 +2,16 @@
\label{ch:ergebnis}
\subsection{Evaluierung}
Eine weitere hilfreiche Erweiterung ist pylint. Das Tool sucht nicht nur nach Fehlern im Code, sondern versucht diesen sauber und einheitlich zu gestalten. Hierbei wird auf den Code-Standard PEP-8 geprüft [Dix18]. Die folgende Liste zeigt eine Kurzfassung der wichtigsten Regeln:
\begin{itemize}
\item Einrückung, meist 4 Leerzeichen
\item Maximale Zeichenanzahl pro Zeile
\item Zwei Leerzeile zwischen Klassen und Funktionen
\item Eine Leerzeile zwischen Methoden innerhalb einer Klasse
\item Leerzeichen in Ausdrücke und Anweisungen vermeiden
\item Die Reihenfolge der Importe: Standartbibliotheken, Drittanbieterbibliotheken, Lokale Anwendungen
\item Konventionen der Namensgebung von Funktionen, Modulen usw.
\end{itemize}
Natürlich sind dies Vorgaben, die eingehalten werden können, aber nicht notwendig sind um den Code fertig kompilieren und ausgeben zu lassen.
@@ -1,22 +1,21 @@
\chapter{Framework}
\label{ch:framework}
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die ausschlie"slich Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website([Ndu17]). Die vielen abstrakten Datentypen, wie dynamische Arrays und Wörterbücher, sind gro"sflächig einsetzbar.
Ein entscheidender Vorteil hierbei ist das dazugehörige Framework Django, auf das im folgenden Kapitel genauer eingegangen wird.
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website(vgl. [Ndu17]). Durch den modularen Aufbau ist es selbst für unerfahrene Entwickler möglich die Sprache schnell zu erlernen. Darüber hinaus bringt Python verschiedene Web-Service Tools mit sich, die beim implementieren einer Website viel Zeit sparen und das Aneignen von komplexen Protokollen redundant machen (vgl. [Sol17]).
Das dazugehörige Framework Django reduziert den Entwicklungsaufwand eines Prototypen erheblich und ist daher als zielführendes Framework die beste Wahl
\section{Django}
Django ist ein Web-Framework, das auf einer Model-View-Presenter (MVP) Architektur basiert. Ähnlich wie der Model-View-Controller sind die Interaktionen zwischen Model und View die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse([She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert.
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse vgl. [She09]. Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert.
\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{figures/MVP}
\caption{Vereinfachter MVP}
\includegraphics[width=0.6\textwidth]{figures/MVP}
\caption{Vereinfachter MVP ([She09])}
\hfill
\end{figure}
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht darstellen. Der User gibt eine URL im Browser ein und sendet sie an den Web-Server.
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.
Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem es den Request zum passenden Objekt weiterleitet. Hier wird der Applikation eine Callback-Funktion zur Verfügung gestellt [Kin17]. Au"serdem werden folgende Schritte durchgeführt:
Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem es den Request zum passenden Objekt weiterleitet. Hier wird der Applikation eine Callback-Funktion zur Verfügung gestellt (vgl. [Kin17]). Au"serdem werden folgende Schritte durchgeführt:
\begin{itemize}
\item Die Middleware-Klassen aus der settings.py werden geladen
\item Die Methoden der Listen Request, View, Response und Excpetion werden geladen
@@ -24,42 +23,37 @@ Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem e
\end{itemize}
Der WSGI-Handler fungiert also als Pförtner und Manager zwischen dem Web-Server und dem Django-Projekt.
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen urlresolver. Durch die explizite Zuweisung der vorhandenen Seiten, kann dieser über die regulären Ausdrücke der url.py-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Wie bereits erwähnt, ist es möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Nun kann das Template, die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und einen Response an den Web-Server schicken. Die fertige Seite ist beim Klienten im Browserfenster zum rendern bereit (vgl. Abbildung 2.2.).
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen \textit {urlresolver}(vgl. ). Durch die explizite Zuweisung der vorhandenen Seiten, kann dieser über die regulären Ausdrücke der url.py-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Es ist möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Nun kann das Template, die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und einen Response an den Web-Server schicken. Die fertige Seite ist beim Klienten im Browserfenster zum rendern bereit (vgl. [Kin17], Abbildung 2.2.).
\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{figures/request-response-cycle}
\caption{Request-Response-Kreislauf des Django Frameworks}
\caption{Request-Response-Kreislauf des Django Frameworks ([Nev15])}
\hfill
\end{figure}
\subsection {Besonderheiten}
\subsection {Besonderheiten Django's}
Das Django-Framework bringt einige Besonderheiten mit sich, die beim implementiern des Prototypen von Bedeutung sind. Diese werden im Folgenden beschrieben.
Die Administratoroberfläche ist eines der hilfreichsten Werkzeugen des gesamten Frameworks. Es stellt die Metadaten der Modelle aus dem Code visuell dar. Verifizierte Benutzer können die Daten nicht nur schnell erfassen, sondern diese auch editieren und verwalten. Das Recht, das Admin-Backend uneingeschränkt zu benutzen, ist dem sogenannten superuser vorenthalten. Dieser kann beim erstmaligen zuweisen nur über die Kommandozeile eingerichtet werden. Ist bereits ein superuser vorhanden, kann dieser im Admin-Backend weiteren Benutzern den gleichen Handlungsfreiraum einräumen. Zudem gibt es noch weitere Stufen der Zugangsberechtigungen, Staff- und Active-Status, die für eine breitere Gruppe von Benutzern geeignet ist.
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden dürfen, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit
\\
\noindent\hspace*{10mm}%
from django.contrib.auth.decorators import login\_required
\\
Direkt über den Beginn der Funktion in view.py, oder auch single-view-function, wird zudem folgende Zeile ergänzt:
Vor der Definition der Funktion wird dann folgende Zeile ergänzt:
\\
\noindent\hspace*{10mm}%
\makeatletter @login\_required
\\
Natürlich lassen sich die Decoratoren auch für andere Zwecke vor Funktionen platzieren. Begrenzte Zugänge zu den Views können durch die Art der Anfrage realisiert werden. Der Benutzer muss also zum Beispiel durch GET auf eine Seite zugreifen wollen um Einsicht zu erhalten.
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.
Benutzerdefinierte Decorator sind im Django-Framework möglich, darauf wird hier aber nicht weiter eingegangen.
Durch den einfachen Aufbau ist es au"serdem möglich diese selbst zu implementieren. Ein einfaches Beispiel wäre das prüfen des, an die Funktion übergebenen, Parameter. Sollen nur positive Zahlen verarbeitet werden, so kann der Decorator alle anderen Eingaben abfangen.
\subsection{Virtuelle Umgebung}
\section{Erweiterungen}
Die Programmiersprache Python bringt viele hilfreiche Erweiterungen mit sich. Die im folgenden aufgeführten sind hauptsächlich für die Paketverwaltung der Applikation zuständig.
Wird ein neues Projekt gestartet, ist es üblich, verschiedensten Programme und Module dafür zu verwenden. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden [Fou18]. Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Diese besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal benutzten. Die folgende Abbildung (2.3) zeigt das Erstellen eines neunen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Anfang der Zeile, bedeutet das, diese ist jetzt aktiv.
Wird 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. Diese besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal starten. Die folgende Abbildung (2.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.
\begin{figure}[!h]
\centering
@@ -68,32 +62,24 @@ Wird ein neues Projekt gestartet, ist es üblich, verschiedensten Programme und
\hfill
\end{figure}
Die Umgebung ist jetzt bereit befüllt zu werden. Um die Pakete und Module kollisionsfrei zu installieren ist es empfehlenswert einen Package-Manager zu verwenden. Mit pip können diese installiert, geupdated und gelöscht werden. Au"serdem kann der Manager Abhängigkeiten, wenn nötig, überschreiben und optimieren. Falls ein, sich von der neuesten Version unterscheidendes, Programm installiert werden soll, so ist dies ebenso möglich.
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.
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:
\subsection{Lightweight Directory Access Protocol}
\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.
Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hier bearbeitende Bachelor-Arbeit eingebunden werden. Dies ist ein Internetprotokoll, welches die Kommunikation mit dem Hochschulinternen Active Directory verwaltet. Es wird eingesetzt um Benutzer so schnell und effizient wie möglich durch eine bereits existierende Datenbank abzufragen und zu authentifizieren. Der Aufbau ist mit einem Baum zu vergleichen (vgl. Abbildung 2.4.). Die Wurzel besteht aus sehr allgemeinen Informationen, umso näher man den Blättern kommt, umso spezifischer werden diese. Ein Objekt in der Struktur wird durch einen einmaligen Namen identifiziert, der aus den gesamten hinterlegten Informationen besteht. Der Name für den in der Abbildung 2.4 dargestellten Baum wäre \glqq cn=John Doe, ou=People, dc=sun.com\grqq.
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}
\caption{Beispiel eines LDAP-Trees ([Orc10])}
\hfill
\end{figure}
\section {Erweiterungen}
Django bringt viele hilfreiche Erweiterungen mit sich, die mit einem Packagemanager einfach in die virtuelle Umgebung geladen werden können. Um das passende Add-on für ein Projekt zu finden, bietet die Plattform djangopackages.org alle Erweiterungen in übersichtlichen Tabellen mit Eigenschaften und Bewertung an.
\subsection {Taggable-Manager}
Django-taggit ist eine Erweiterung von Alex Gaynor, einem Entwickler aus Washingtion DC. Das Add-on ermöglicht das Verwenden von Tags die automatisch mit einem eindeutigen Slug versehen werden. Der darin enthaltene Taggable Manager verwendet Django's Contenttype Framework, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder app\_label und model machen die Modelle eindeutig zuweisbar. Instanzen des Contenttypes präsentieren und speichern die Informationen und Erstellen automatisch neue Instanzen, wenn Modelle hinzugefügt werden. Zudem stehen Methoden zur Verfügung, die das Abrufen und Arbeiten mit Instanzen der einzelnen Modelle erleichtern.
Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. Der darin enthaltene Taggable Manager verwendet Django's Contenttype Framework, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder app\_label und model machen die Modelle eindeutig zuweisbar. Instanzen des Contenttypes präsentieren und speichern die Informationen und Erstellen automatisch neue Instanzen, wenn Modelle hinzugefügt werden. Zudem stehen Methoden zur Verfügung, die das Abrufen und Arbeiten mit Instanzen der einzelnen Modelle erleichtern.
Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden ([Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen lookup-Tabelle notwendig, die die Entitäten zweier Tabellen direkt verlinkt, anstatt diese generische zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass er Zugriff auf diese einheitlich geschieht. Außerdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern.
@@ -103,22 +89,22 @@ Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile e
\$ pip install django-taggit
\\
Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert.
Au"serdem muss taggit in der settings.py unter INSTALLED\_APPS ergänzt werden. Um dem Programm zu sagen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden folgende Befehle in die Kommandozeile eingefügt:
\\
\noindent\hspace*{10mm}%
\$ python3 manage.py makemigrations \\
\noindent\hspace*{10mm}%
\$ python3 manage.py migrate
\\
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.
\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.
Django-hitcount dient zum zählen der Besucher einer Seite ([Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der HitCountDetailView in views.py die Variable hitcount verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der settings.py ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.
Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich django-post-office ([Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt werden, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Die Benachrichtigungen können asynchron versendet werden mit einem integrierten Planungsmanager. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.
\section{Bootstrap}
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb, zunächst Firmenintern, an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte. Sie merkten, das die neue Bibliothek, die daraus entstand, nicht nur auf Ihre eigene Website anwendbar, sondern so flexible ist, dass jede Art von Website davon profitieren könnte. 2011 entschieden Sie sich Bootstrap für die Öffentlichkeit frei zugänglich zu machen. Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen interessierten Programmierern weiterentwickelt und ist somit stark gewachsen. Version 2.0 verfügt au"serdem über die Fähigkeit Websites responsive auf verschiedenste mobile Endgeräte anzupassen.
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb, zunächst Firmenintern, an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte. Sie merkten, das die neue Bibliothek, die daraus entstand, nicht nur auf Ihre eigene Website anwendbar, sondern so flexible ist, dass jede Art von Website davon profitieren könnte (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]).
Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen. Zudem befinden sich auch Erweiterungen des JavaScript-Frameworks jQuery in der Bibliothek, die weiterführende Funktionen beinhalten wie zum Beispiel Filter oder Dropdown-Menüs. Das Paket kann einfach eingebunden werden im head-tag einer HTML-Datei (vgl. Abbildung 2.3). Das bedeutet, dass Medie-Queries oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser.
Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen. Zudem befinden sich auch Erweiterungen des JavaScript-Frameworks jQuery in der Bibliothek, die weiterführende Funktionen beinhalten wie zum Beispiel Filter oder Dropdown-Menüs. Das Paket kann einfach eingebunden werden im head-tag einer HTML-Datei (vgl. Abbildung 2.3). Das bedeutet, dass Media-Queries oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser (vgl. [Boo12]).
\begin{figure}[!h]
\centering
@@ -127,7 +113,7 @@ Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, di
\hfill
\end{figure}
Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles bereits automatisch auf die darin vorkommenden Tags, wie Links und Überschriften, angewandt. Dies ist jedoch nur ein sehr kleiner Teil den die Bibliothek zur Verfügung stellt. Möchte man Bootstrap umfangreich nutzen so lassen sich die Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eintragen (vlg. Abbildung 2.4.).
Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles bereits automatisch auf die darin vorkommenden Tags, wie Links und Überschriften, angewendet. Dies ist jedoch nur ein sehr kleiner Teil den die Bibliothek zur Verfügung stellt. Möchte man Bootstrap umfangreich nutzen so lassen sich die Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eintragen (vlg. Abbildung 2.4.).
\begin{figure}[!h]
\centering
@@ -140,5 +126,5 @@ Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben
\section{Cron}
@@ -1,19 +1,115 @@
\chapter{Prototyp}
\label{ch:prototyp}
Um zu beweisen, wie eine Spcial Media Plattform die Mail-Flut der Efi-Fakultät reduzieren kann, wird ein Prototyp implementiert.
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.
\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.
\begin{figure}[!h]
\centering
\includegraphics[width=0.8\textwidth]{figures/forschungsdesign}
\caption{Forschungsdesign}
\hfill
\end{figure}
\section{Organisation}
Grundlegender Aufbau der Website, Verwaltung der Daten evlt auf nochmal Taggable-Manager (ManyToMany) ...
\subsection{Verwaltung im Administrator-Backend}
Näher auf CustomUserModel eingehen, Diagramm erstellen und einbinden
Zum Entwickeln des Prototypen wird die Open-Source- Entwicklungsumgebung Visual Studio Code von Microsoft verwendet. Die dynamische Oberfläche ist sehr performant, da sie wenig Speicherplatz bedarf und zunächst ohne grö"sere Ergänzungen sofort einsetzbar ist. Um den Code mit Shortcuts übersichtlicher zu gestalten und auf Python und Django abstimmen zu können werden aus der üppigen \textit{Extension-Bibliothek} kostenlose Erweiterungen eingebunden. Unter Anderem sind die folgenden Add-on's während der Arbeit zum Einsatz gekommen (vgl. [Mic18]):
\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 \textit {Working-Tree} die Änderungen visuell einsehen und wenn nötig bearbeiten. Es wird ausschlie"slich auf den Master-Branch gepusht, da nur ein Entwickler an dem Prototyp tätig ist. Lediglich zum Testen experimenteller Bibliotheken werden neue Branches angelegt und diese, falls Sie sich als hilfreich erweisen, mit dem Master-Branch fusionieren.
Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird dies im folgenden genauer beschrieben. Die unterste Projektebene wird durch die manage.py-Datei gebildet. Sie wird unter Anderem genutzt um den lokalen Server starten zu können. In der Ebene darüber findet sich im Ordner \glqq mysite\grqq\ die Datei settings.py. Hier werden die allgemeinen Einstellungen der Website vorgenommen, wie zum Beispiel das Integrieren der Erweiterungen und der Pfad zu den hinterlegten Templates. Au"serdem ist die urls.py dort zu finden, deren Funktion bereits im Kapitel Django erläutert wurde. Die \_\_init\_\_.py und wsgi.py sind trivial und deshalb wird hier nicht weiter darauf eingegangen. Im Ordner \glqq thisisenv\grqq\ sind alle Bibliotheken und Add-on's der virtuellen Umgebung hinterlegt. Der Fokus dieser Arbeit liegt im Ordner \glqq application\grqq. Hier sind die Datenbank-Migrationen, die Static-Files wie bootstrap und css, und alle Templates abgelegt. Zudem befindet sich hier die Logik des Prototypen, auf die im Kapitel \glqq Funktionen\grqq\ weiter eingegangen wird.
\subsection{Datenmodellierung}
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen dessen werden hier genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \textit {UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \textit {PostModel} und abschlie"send werden die Zusammenhänge der Modelle dargestellt.
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
\\
\noindent\hspace*{10mm}%
\$ python3 manage.py makemigrations
\\
werden die neun Tabellen der Modelle erstellt. Um diese dann auch anwenden zu können, muss der Befehl
\\
\noindent\hspace*{10mm}%
\$ python3 manage.py migrate
\\
darauffolgend ebenso in die Kommandozeile eingegeben werden.\\
\textbf{UserModel:}
\begin{addmargin}[25pt]{0pt}
Hierbei ist das Authentifizierungssystem von Django mit einem \textit{UserModel} bereits angelegt. Dies muss für den Prototyp um das Feld \glqq tags \grqq\ erweitert werden, sodass ein Benutzer folgende Felder aufweist (vgl. [Fou18a]):
\begin{itemize}
\item username, fist\_name, last\_name, email, groups, user\_permissions, is\_staff, is\_active, is\_superuser, last\_login, date\_joined, tags
\end{itemize}
Das Feld \textit{groups} wird in dieser Arbeit nicht verwendet und deshalb im Folgenden ignoriert.
In models.py ist der \textit{CustomUser} dafür verantwortlich das neue Feld mit dem \textit{Default-User} zu verknüpfen. Durch das \textit{OneToOneField} (siehe Abbildung 3.2.) wird die Verbindung zum schon bestehenden Modell hergestellt. \textit{OneToOne} bildet eine einzigartige Zuordnung von zwei Objekten, sodass der Rückgabewert nur aus einem Objekt besteht (vgl. [Fou18a]). Das hei"st, dass hier keine Rekursiven, also auf sich selbst verlinkende oder \textit{lazy} Beziehungen möglich sind um Konflikte bei der Authentifizierung zu vermeiden. Dies ist die übliche Vorgehensweise um mit einem Primärschlüssel das Default-Model zu erweitern.
\begin{figure}[!h]
\centering
\includegraphics[width=1\textwidth]{figures/custommodelcode}
\caption{CustomUserModel in models.py}
\hfill
\end{figure}
\end{addmargin}
\textbf{PostModel:}
\begin{addmargin}[25pt]{0pt}
Das \textit{PostModel} beschreibt alle Felder die ein Post enthalten kann. Basierend auf der Blog-Lösung von Djangogirls.com gehören dazu folgende:
\begin{itemize}
\item author, title, text, created\_date, published\_date, tags
\end{itemize}
Der Autor ist durch einen \textit{ForeignKey} mit dem \textit{UserModel} verbunden. Diese sogenannte \textit{ManyToOne} Verbindung reicht hier aus um einem Post den Autor, also dem eingeloggten User, zuzuweisen. Title ist ein \textit{CharField} und wird mit einer Zeichenbegrenzung festgelegt. Der Text hingegen kann eine beliebige Menge an Zeichen enthalten und wir deshalb als \textit{TextField} deklariert. Erstellungsdatum und Publikation sind beides \textit{DateTimeField}s. Ersteres muss vom Ersteller angegeben werden, Zweiteres kann zunächst offen gelassen werden durch die Zusatzangabe \glqq null=True\grqq. Ein weiteres Feld tags wird hinzugefügt um den Posts unabhängig von den Usern Tags zuordnen zu können.
\\
\end{addmargin}
\textbf{Gesamtmodellierung:}
\begin{addmargin}[25pt]{0pt}
Die Abbildung 3.3. zeigt die Modellierung der Tabelle \glqq User\grqq\ und \glqq Post\grqq. Au"serdem verdeutlicht es die Erweiterung des User-Modells von Django mit dem in der Applikation angelegtem CustomUser. Die im User vorkommenden booleschen Felder werden im Kapitel Berechtigung der User genauer erörtert.
\begin{figure}[!h]
\centering
\includegraphics[width=0.9\textwidth]{figures/datamodel}
\caption{Datenmodellierung von User und Post}
\hfill
\end{figure}
\end{addmargin}
\subsection{Verwaltung im Administrator-Back-end}
In diesem Kapitel wird beschrieben wie das Administrations-back-end genutzt werden kann. Es ist jedoch zu beachten, dass die Applikation vorwiegend von Dozenten und Angestellten der Hochschule ohne Administratorrechte verwendet werden soll. Die gestaffelten Berechtigungen werden im Kapitel \glqq Berechtigung der User \grqq\ genauer beschreiben.
Ein Django-Projekt bildet bereits beim Einrichten, \textit{per Default}, eine Administrator-Oberfläche um die Inhalte der Website kontrollieren zu können. Nach der Migration von den oben genannten Modellen wird diese erweitert. Nich zu vergessen sind die externen Tabellen der installierten Add-on's, die nach der Migration das Back-end expandieren.
\subsection{Berechtigung der User}
Welche Berechtigungen gibt es im Prototyp, welche werden vom Active Directory übernommen?
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 ebenso das persönliche Dashboard gestalten. Das Einloggen in die Administratoroberfläche kann vorgenommen werden, jedoch sind der Gruppe noch keinerlei Rechte zugewiesen. Möchte man dies ändern, kann man das von Django bereitgestellte Feld \glqq User Permissions\grqq\ im Admin-back-end unter Users, und dem Namen der zu ändernden Person, die gewünschte Berechtigung erteilen.
\section{Funktion}
Nötige Funktionen
\section{Funktionen}
User Stories einbinden als Grafik
\subsection{Verwalten}
Posts erstellen, editieren und löschen
(draft-list und post new für Mitarbeiter)
\subsection{Abonnieren}
Tags als eingeloggter User abonnieren und verwalten Front-end und Admin-Backend?
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

@@ -53,3 +53,111 @@
year = "2018",
note = "https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code"
}
@article{Shabda,
author = "Shabda",
title = "Understanding decorators",
year = "2009",
note = "https://www.agiliq.com/blog/2009/06/understanding-decorators/"
}
@article{Timm,
author = "Damon Timm",
title = "django-hitcount Documentation",
year = "2015",
note = "https://django-hitcount.readthedocs.io/en/latest/overview.html"
}
@article{Ong,
author = "Selwin Ong",
title = "django-post\_office git Repository",
year = "2018",
note = "https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst"
}
@article{Ong,
author = "Ryan Nevius",
title = "django-post\_office git Repository",
year = "2015",
note = "https://ryannevius.com"
}
@article{Solutions,
author = "Mindfire Solutions",
title = "Advantages and Disadvantages of Python Programming Language",
year = "2017",
note = "https://medium.com/@mindfiresolutions.usa/advantages-and-disadvantages-of-python-programming-language-fd0b394f2121"
}
@book{Weigend,
author = "Michael Weigend",
title = "Python GE-PACKT",
year = "2017",
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",
year = "2011",
note = "https://blog.twitter.com/developer/en\_us/a/2011/bootstrap-twitter.html"
}
@article{Bootstrap,
author = "Bootstrap Authors, Twitter Inc",
title = "Bootstrap Repository",
year = "2011",
note = "https://github.com/twbs/bootstrap"
}
@article{Otto,
author = "Mark Otto",
title = "Say hello to Bootstrap 2.0",
year = "2012",
note = "https://web.archive.org/web/20120203191214/https://dev.twitter.com/blog/say-hello-to-bootstrap-2"
}
@article{Django,
author = "Django Software Foundation",
title = "django.contrib.auth, User Model",
year = "2018",
note = "https://docs.djangoproject.com/en/2.1/ref/contrib/auth/"
}
@article{Django,
author = "Djangogirlsgirls",
title = "Creating a blog post model",
year = "2018",
note = "https://tutorial.djangogirls.org/en/django_models/"
}
@article{Microsoft,
author = "Microsoft",
title = "Extensions for the Visual Studio family of products",
year = "2018",
note = "https://marketplace.visualstudio.com/"
}
@article{Computer,
author = "The Computer Language Company",
title = "Definition of: user permissions",
year = "2018",
note = "https://www.pcmag.com/encyclopedia/term/58231/user-permissions"
}
@@ -16,7 +16,7 @@
\line(1,0){1}\\
\vspace{2.0cm}
\textbf{\huge{Esther Kleinhenz}}\\
\textbf{\huge{Esther Beate Kleinhenz}}\\
\vspace{0.4cm}
{\Large \textbf{Matrikelnummer: }2649270}\\
\vspace{2.5cm}
@@ -55,10 +55,7 @@ Nürnberg, {\today}\\
%\indent verfasst.
%\vspace{1.5cm}
\indent Hiermit erkläre ich, dass die vorliegende Arbeit von mir selbständig verfasst und nicht\\
\indent anderweitig für Prüfungszwecke vorgelegt wurde, keine anderen als die angegebenen\\
\indent Quellen oder Hilfsmittel benutzt sowie wörtliche oder sinngemäße Zitate als solche\\
\indent gekennzeichnet wurden.
Hiermit erkläre ich, dass die vorliegende Arbeit von mir selbständig verfasst und nicht anderweitig für Prüfungszwecke vorgelegt wurde, keine anderen als die angegebenen. Quellen oder Hilfsmittel benutzt sowie wörtliche oder sinngemäße Zitate als solche gekennzeichnet wurden.
\vspace{0.5cm}
@@ -68,15 +65,15 @@ Nürnberg, {\today}\\
\vspace{1.0cm}
\indent Katja Cornelia Hader \\
\indent E-mail: {haderka56442@th-nuernberg.de}
\indent Esther Beate Kleinhenz \\
\indent E-mail: {kleinhenzes60188@th-nuernberg.de}
\vspace{\fill}
\indent Studiengang Wirtschaftsinformatik\\
\indent Studiengang Media Engineering\\
\indent Georg Simon Ohm\\
\indent Technische Hochschule Nürnberg\\
\indent Keßlerplatz 12\\
\indent Ke"slerplatz 12\\
\indent 90489 Nürnberg\\
\indent Deutschland
+11
View File
@@ -0,0 +1,11 @@
version: '3'
services:
web:
build: .
command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
container_name: esther_kleinhenz_ba
volumes:
- .:/esther_kleinhenz_ba
ports:
- "8000:8000"
+573 -405
View File
@@ -1,405 +1,573 @@
[16/Oct/2018 19:58:49] INFO [mysite:150] test
[16/Oct/2018 20:00:13] INFO [mysite:150] test
[16/Oct/2018 20:00:44] INFO [mysite:150] test
[18/Oct/2018 16:49:10] INFO [mysite:150] test
[18/Oct/2018 16:50:20] INFO [mysite:149] test
[18/Oct/2018 16:53:59] INFO [mysite:149] test
[18/Oct/2018 17:02:15] INFO [mysite:149] Here ist the log
[18/Oct/2018 17:03:03] INFO [mysite:149] Here ist the log
[18/Oct/2018 17:04:21] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:08:44] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:22:00] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:29:57] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:33:51] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:37:15] INFO [mysite:147] hei
[18/Oct/2018 17:38:10] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:40:53] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:41:34] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:41:45] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:42:04] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:47:59] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:49:27] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:49:43] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:50:18] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:04:38] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:07:12] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:08:17] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:09:29] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:10:27] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:10:59] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:13:11] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:14:22] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:14:45] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:17:07] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:23:37] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:42:53] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:43:28] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:46:58] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 19:12:55] INFO [mysite:147] CustomUser object (25)
[19/Oct/2018 09:18:42] INFO [mysite:147] CustomUser object (25)
[19/Oct/2018 09:19:10] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 10:24:35] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 16:52:08] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 17:33:50] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:38:33] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:39:08] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:41:43] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:42:00] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:44:10] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:47:28] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:48:28] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:56:41] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:06:57] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:07:17] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:07:31] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:12:56] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:15:29] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 17:20:58] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 17:54:57] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 18:03:09] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 18:18:52] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 19:14:57] INFO [mysite:183] None
[20/Oct/2018 19:15:00] INFO [mysite:183] test
[20/Oct/2018 19:15:45] INFO [mysite:183] test
[20/Oct/2018 19:17:52] INFO [mysite:183] test
[20/Oct/2018 19:18:31] INFO [mysite:183] test
[20/Oct/2018 19:19:01] INFO [mysite:183] test
[20/Oct/2018 19:20:08] INFO [mysite:184] test
[20/Oct/2018 19:24:45] INFO [mysite:184] None
[20/Oct/2018 19:26:30] INFO [mysite:184] None
[20/Oct/2018 19:29:44] INFO [mysite:184] test
[20/Oct/2018 19:32:09] INFO [mysite:184] test
[20/Oct/2018 19:33:14] INFO [mysite:184] 5
[20/Oct/2018 22:26:02] INFO [mysite:184] hi
[20/Oct/2018 22:26:09] INFO [mysite:184] 2
[20/Oct/2018 22:26:39] INFO [mysite:184] 2
[20/Oct/2018 22:35:49] INFO [mysite:183] 2
[20/Oct/2018 22:35:55] INFO [mysite:183] 3
[20/Oct/2018 22:51:06] INFO [mysite:183] hi
[20/Oct/2018 22:53:24] INFO [mysite:183] hi
[20/Oct/2018 22:54:12] INFO [mysite:183] hi
[20/Oct/2018 22:57:38] INFO [mysite:181] <QuerySet [<Post: first post>, <Post: second bla>, <Post: Third one>]>
[20/Oct/2018 22:57:39] INFO [mysite:184] hi
[20/Oct/2018 22:59:11] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 22:59:11] INFO [mysite:184] hi
[20/Oct/2018 23:01:53] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:01:53] INFO [mysite:184] hi
[20/Oct/2018 23:02:06] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:06] INFO [mysite:184] 5
[20/Oct/2018 23:02:22] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:22] INFO [mysite:184] 5
[20/Oct/2018 23:02:45] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:45] INFO [mysite:184] 5
[20/Oct/2018 23:03:07] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:03:07] INFO [mysite:184] 5
[20/Oct/2018 23:03:46] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:03:46] INFO [mysite:184] 5
[20/Oct/2018 23:04:35] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:04:35] INFO [mysite:184] 5
[20/Oct/2018 23:06:49] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:06:49] INFO [mysite:184] hi
[20/Oct/2018 23:15:41] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:15:41] INFO [mysite:184] hi
[20/Oct/2018 23:17:19] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:17:19] INFO [mysite:184] hi
[20/Oct/2018 23:17:38] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:17:38] INFO [mysite:184] hi
[20/Oct/2018 23:19:11] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:19:11] INFO [mysite:184] hi
[20/Oct/2018 23:24:22] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:23] INFO [mysite:184] hi
[20/Oct/2018 23:24:42] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:42] INFO [mysite:184] hi
[20/Oct/2018 23:24:49] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:49] INFO [mysite:184] hi
[20/Oct/2018 23:24:54] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:54] INFO [mysite:184] test
[20/Oct/2018 23:25:01] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:25:01] INFO [mysite:184] third
[20/Oct/2018 23:28:54] INFO [mysite:182] None
[20/Oct/2018 23:29:00] INFO [mysite:182] hi
[20/Oct/2018 23:29:42] INFO [mysite:182] hi
[20/Oct/2018 23:30:53] INFO [mysite:182] hi
[20/Oct/2018 23:34:29] INFO [mysite:184] hi
[20/Oct/2018 23:34:34] INFO [mysite:54] <QuerySet [<Post: second bla>]>
[20/Oct/2018 23:38:12] INFO [mysite:54] <QuerySet [<Post: second bla>]>
[20/Oct/2018 23:38:18] INFO [mysite:184] None
[20/Oct/2018 23:38:25] INFO [mysite:184] hi
[20/Oct/2018 23:40:03] INFO [mysite:184] hi
[20/Oct/2018 23:40:10] INFO [mysite:184] first
[20/Oct/2018 23:41:01] INFO [mysite:184] first
[20/Oct/2018 23:41:12] INFO [mysite:184] h
[20/Oct/2018 23:41:28] INFO [mysite:184] h
[20/Oct/2018 23:41:32] INFO [mysite:184] h
[20/Oct/2018 23:41:38] INFO [mysite:184] h
[20/Oct/2018 23:41:40] INFO [mysite:184] hi
[20/Oct/2018 23:41:50] INFO [mysite:184] hi
[20/Oct/2018 23:41:56] INFO [mysite:184] taggit
[21/Oct/2018 10:35:50] INFO [mysite:184] taggit
[21/Oct/2018 10:35:55] INFO [mysite:184]
[21/Oct/2018 10:38:17] INFO [mysite:184] None
[21/Oct/2018 12:59:59] INFO [mysite:184] None
[22/Oct/2018 14:31:54] INFO [mysite:184] None
[22/Oct/2018 14:32:03] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:40:08] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:43:18] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:43:31] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:50:32] INFO [mysite:150] esthi
[22/Oct/2018 14:50:32] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 14:51:10] INFO [mysite:150] stefan
[22/Oct/2018 14:51:10] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:56:36] INFO [mysite:150] stefan
[22/Oct/2018 14:56:36] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:56:56] INFO [mysite:150] stefan
[22/Oct/2018 14:56:56] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:57:15] INFO [mysite:150] stefan
[22/Oct/2018 14:57:15] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:57:39] INFO [mysite:150] stefan
[22/Oct/2018 14:57:39] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:58:53] INFO [mysite:150] stefan
[22/Oct/2018 14:58:53] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:59:01] INFO [mysite:150] stefan
[22/Oct/2018 14:59:01] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:59:55] INFO [mysite:150] stefan
[22/Oct/2018 14:59:55] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:02:16] INFO [mysite:150] stefan
[22/Oct/2018 15:02:16] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:03:09] INFO [mysite:150] stefan
[22/Oct/2018 15:03:09] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:03:41] INFO [mysite:150] stefan
[22/Oct/2018 15:03:41] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:05:17] INFO [mysite:184] None
[22/Oct/2018 15:05:21] INFO [mysite:184] hi
[22/Oct/2018 15:07:51] INFO [mysite:185] None
[22/Oct/2018 15:07:53] INFO [mysite:150] stefan
[22/Oct/2018 15:07:53] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:08:37] INFO [mysite:150] stefan
[22/Oct/2018 15:08:37] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:09:08] INFO [mysite:151] stefan
[22/Oct/2018 15:09:08] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:09:58] INFO [mysite:151] stefan
[22/Oct/2018 15:09:58] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:11:00] INFO [mysite:151] stefan
[22/Oct/2018 15:11:00] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:11:41] INFO [mysite:151] stefan
[22/Oct/2018 15:11:41] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:12:14] INFO [mysite:151] stefan
[22/Oct/2018 15:12:14] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:14:15] INFO [mysite:151] stefan
[22/Oct/2018 15:14:15] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 17:37:38] INFO [mysite:154] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 17:38:19] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:39:44] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:39:44] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:41:03] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:41:19] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:41:20] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:07] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:07] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:32] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:32] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:47] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:47] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:47] INFO [mysite:160] ['bamberg']
[22/Oct/2018 17:45:47] INFO [mysite:160] ['bamberg', 'test']
[22/Oct/2018 17:49:21] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:49:21] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:49:21] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:49:21] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:51:20] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:51:20] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:51:20] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:51:20] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:51:27] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:51:27] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:51:28] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:51:28] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:53:13] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:53:55] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:53:55] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:53:55] INFO [mysite:158] ['bamberg']
[22/Oct/2018 17:53:55] INFO [mysite:158] ['bamberg', 'test']
[22/Oct/2018 17:54:44] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:54:44] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:02] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:55:02] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:02] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:55:02] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:55:14] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:55:14] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:14] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:55:14] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:56:12] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:56:12] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:56:12] INFO [mysite:159] bamberg
[22/Oct/2018 17:56:12] INFO [mysite:159] test
[22/Oct/2018 17:56:34] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:56:34] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:56:34] INFO [mysite:159] bamberg
[22/Oct/2018 17:56:34] INFO [mysite:159] test
[22/Oct/2018 17:57:48] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:57:48] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:57:49] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:57:49] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:59:46] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:59:46] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:59:46] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:59:46] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:00:06] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:00:15] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:25] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:01:25] INFO [mysite:158] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:25] INFO [mysite:158] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:45] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:02:47] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:03:12] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:03:12] INFO [mysite:158] <QuerySet []>
[22/Oct/2018 18:03:12] INFO [mysite:158] <QuerySet []>
[22/Oct/2018 18:04:45] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:05:24] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:05:24] INFO [mysite:157] bamberg
[22/Oct/2018 18:05:24] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:05:24] INFO [mysite:157] test
[22/Oct/2018 18:05:24] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:13:35] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:13:35] INFO [mysite:157] bamberg
[22/Oct/2018 18:14:16] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:14:16] INFO [mysite:157] bamberg
[22/Oct/2018 18:19:16] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:19:16] INFO [mysite:157] bamberg
[22/Oct/2018 18:38:14] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:38:14] INFO [mysite:157] bamberg
[22/Oct/2018 18:41:50] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:41:50] INFO [mysite:157] bamberg
[22/Oct/2018 18:41:50] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:41:50] INFO [mysite:157] test
[22/Oct/2018 18:41:50] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:45:55] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:45:55] INFO [mysite:157] bamberg
[22/Oct/2018 18:46:39] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:46:39] INFO [mysite:157] bamberg
[22/Oct/2018 18:46:39] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:46:39] INFO [mysite:157] test
[22/Oct/2018 18:46:39] INFO [mysite:159] <QuerySet [<Post: first post>, <Post: second bla>, <Post: Third one>]>
[22/Oct/2018 18:47:12] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:47:12] INFO [mysite:157] stefan
[22/Oct/2018 18:47:12] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:48:22] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:48:22] INFO [mysite:157] stefan
[22/Oct/2018 18:48:22] INFO [mysite:159] <QuerySet [<Post: Crazy>]>
[22/Oct/2018 18:50:37] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:50:38] INFO [mysite:157] stefan
[22/Oct/2018 18:52:01] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:52:01] INFO [mysite:157] stefan
[22/Oct/2018 18:52:36] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:52:36] INFO [mysite:157] stefan
[22/Oct/2018 18:53:07] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:53:07] INFO [mysite:157] stefan
[22/Oct/2018 18:53:20] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:53:20] INFO [mysite:157] bamberg
[22/Oct/2018 18:53:20] INFO [mysite:157] test
[22/Oct/2018 18:54:05] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:05] INFO [mysite:157] bamberg
[22/Oct/2018 18:54:20] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:21] INFO [mysite:157] bamberg
[22/Oct/2018 18:54:21] INFO [mysite:157] test
[22/Oct/2018 18:54:46] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:46] INFO [mysite:156] bamberg
[22/Oct/2018 18:54:46] INFO [mysite:156] test
[22/Oct/2018 18:55:43] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:55:43] INFO [mysite:156] bamberg
[22/Oct/2018 18:55:43] INFO [mysite:156] test
[24/Oct/2018 15:10:56] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:10:56] INFO [mysite:156] stefan
[24/Oct/2018 15:11:37] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:11:37] INFO [mysite:156] stefan
[24/Oct/2018 15:11:37] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:13:48] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:13:48] INFO [mysite:156] stefan
[24/Oct/2018 15:13:48] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:15:46] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:15:46] INFO [mysite:157] stefan
[24/Oct/2018 15:15:55] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:15:55] INFO [mysite:157] stefan
[24/Oct/2018 15:15:55] INFO [mysite:159] <QuerySet []>
[24/Oct/2018 15:17:17] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:17:17] INFO [mysite:156] stefan
[24/Oct/2018 15:17:17] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:18:27] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:18:27] INFO [mysite:156] stefan
[24/Oct/2018 15:18:27] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:21:10] INFO [mysite:150] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[24/Oct/2018 15:21:10] INFO [mysite:154] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:21:10] INFO [mysite:158] stefan
[24/Oct/2018 15:21:10] INFO [mysite:160] <QuerySet []>
[24/Oct/2018 15:22:12] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:12] INFO [mysite:156] ['stefan']
[24/Oct/2018 15:22:12] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:22:29] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:29] INFO [mysite:156] ['stefan']
[24/Oct/2018 15:22:57] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:57] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:23:36] INFO [mysite:152] <QuerySet [<Tag: stefan>, <Tag: test>]>
[24/Oct/2018 15:23:36] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:23:36] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:24:29] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: wieder>]>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:26:03] INFO [mysite:152] <QuerySet [<Tag: lukas>, <Tag: hi>]>
[24/Oct/2018 15:26:03] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:26:03] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: second bla>]>
[24/Oct/2018 15:51:54] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: wieder>]>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:01] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[24/Oct/2018 15:53:01] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:01] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:53:28] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: this is a new one>]>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 18:41:24] INFO [mysite:186] None
[24/Oct/2018 18:41:31] INFO [mysite:186] bla
[24/Oct/2018 18:42:12] INFO [mysite:186] avoiddouble
[24/Oct/2018 18:42:20] INFO [mysite:186] hi
[24/Oct/2018 18:56:30] INFO [mysite:158] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[24/Oct/2018 18:56:30] INFO [mysite:161] <QuerySet []>
[24/Oct/2018 18:56:30] INFO [mysite:161] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 18:56:45] INFO [mysite:190] None
[24/Oct/2018 18:56:49] INFO [mysite:190] bamberg
[24/Oct/2018 18:57:29] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:30] INFO [mysite:189] None
[24/Oct/2018 19:00:30] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:00:33] INFO [mysite:189] hi
[24/Oct/2018 19:00:33] INFO [mysite:191] <QuerySet [<Post: second bla>, <Post: Third one>]>
[24/Oct/2018 19:00:38] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:38] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:00:54] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:54] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:01:16] INFO [mysite:189] test
[24/Oct/2018 19:01:16] INFO [mysite:191] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[24/Oct/2018 19:01:20] INFO [mysite:189] third
[24/Oct/2018 19:01:20] INFO [mysite:191] <QuerySet [<Post: Third one>]>
[24/Oct/2018 19:01:35] INFO [mysite:189] None
[24/Oct/2018 19:01:35] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:01:40] INFO [mysite:189] bamberg
[24/Oct/2018 19:01:40] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:03] INFO [mysite:189] None
[24/Oct/2018 19:03:03] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:08] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:08] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:28] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:28] INFO [mysite:191] <QuerySet [<Post: Third one>]>
[24/Oct/2018 19:03:45] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:45] INFO [mysite:191] <QuerySet [<Post: Third one>, <Post: here i go again>]>
[25/Oct/2018 10:33:13] INFO [mysite:189] bamberg
[25/Oct/2018 15:28:52] INFO [mysite:189] hi
[25/Oct/2018 15:28:54] INFO [mysite:189]
[30/Oct/2018 13:40:36] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:40:36] INFO [mysite:138] hi
[30/Oct/2018 13:40:36] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:40:36] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:40:55] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:40:55] INFO [mysite:138] hi
[30/Oct/2018 13:40:55] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:40:55] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:41:03] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:41:03] INFO [mysite:138] hi
[30/Oct/2018 13:41:03] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:41:03] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:41:06] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:41:06] INFO [mysite:138] hi
[30/Oct/2018 13:41:06] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:41:06] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:36:42] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 15:36:45] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 15:36:45] INFO [mysite:138] hi
[30/Oct/2018 15:36:46] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:36:46] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:37:06] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 15:39:26] INFO [mysite:199] None
[30/Oct/2018 15:39:32] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:39:47] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:39:47] INFO [mysite:138] hi
[30/Oct/2018 15:39:47] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:39:47] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:40:32] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:40:36] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:40:36] INFO [mysite:138] hi
[30/Oct/2018 15:40:36] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:40:36] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:40:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:41:00] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:41:00] INFO [mysite:138] hi
[30/Oct/2018 15:41:00] INFO [mysite:147] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:41:00] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:41:27] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:41:28] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:41:30] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:41:30] INFO [mysite:138] hi
[30/Oct/2018 15:41:30] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:41:30] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:42:31] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:42:31] INFO [mysite:138] hi
[30/Oct/2018 15:42:31] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:42:31] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:42:34] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:42:34] INFO [mysite:138] hi
[30/Oct/2018 15:42:34] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:42:34] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:45:00] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:45:03] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:45:03] INFO [mysite:138] hi
[30/Oct/2018 15:45:34] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:45:37] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:45:37] INFO [mysite:138] hi
[30/Oct/2018 15:45:37] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 15:45:37] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:45:56] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:46:00] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:46:00] INFO [mysite:138] hi
[30/Oct/2018 15:46:00] INFO [mysite:146] <bound method BaseModelForm.clean of <NewTagForm bound=True, valid=True, fields=(m_tags)>>
[30/Oct/2018 15:46:00] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:46:28] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:46:31] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:46:31] INFO [mysite:138] hi
[30/Oct/2018 15:46:31] INFO [mysite:146] <QueryDict: {'csrfmiddlewaretoken': ['lGD79wzSnukIJUbQ0zC3CwkitKoFy7XPhEq6uLMlu7TqEOjMAAjsCoC5BG8qAwQa'], 'm_tags': ['hi']}>
[30/Oct/2018 15:46:31] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:47:27] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:47:30] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:47:30] INFO [mysite:138] hi
[30/Oct/2018 15:47:30] INFO [mysite:146] ['hi']
[30/Oct/2018 15:47:30] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:49:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:49:43] INFO [mysite:138] hi
[30/Oct/2018 15:50:08] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:50:12] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:50:12] INFO [mysite:138] hi
[30/Oct/2018 15:50:59] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:51:02] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:51:02] INFO [mysite:138] hi
[30/Oct/2018 15:51:40] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:51:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:51:43] INFO [mysite:144] ['hi']
[30/Oct/2018 15:52:31] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:52:31] INFO [mysite:144] 'hi'
[30/Oct/2018 15:53:10] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:53:10] INFO [mysite:144] 'hi'
[30/Oct/2018 15:53:50] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:53:50] INFO [mysite:144] 'hi'
[30/Oct/2018 15:54:30] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:54:32] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:54:33] INFO [mysite:144] 'hi'
[30/Oct/2018 15:54:33] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:54:55] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:54:55] INFO [mysite:144] 'hi'
[30/Oct/2018 15:54:55] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:54:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:54:58] INFO [mysite:144] 'hi'
[30/Oct/2018 15:54:58] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 15:56:02] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:56:04] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:56:51] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:56:54] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:56:56] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:57:04] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:59:17] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 15:59:30] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:01:18] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:02:15] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:02:54] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:05:29] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:05:29] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 16:05:29] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:05:33] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:05:33] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 16:05:33] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:05:59] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:06:04] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:06:04] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 16:06:04] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:10:45] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:10:48] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:10:48] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: neu>]>
[30/Oct/2018 16:10:48] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:16:10] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:16:13] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:16:13] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: neu>]>
[30/Oct/2018 16:16:53] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:16:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:16:57] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: neu>]>
[30/Oct/2018 16:16:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:17:19] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:17:19] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: neu>]>
[30/Oct/2018 16:17:20] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:17:58] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:17:58] INFO [mysite:145] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: neu>]>
[30/Oct/2018 16:17:58] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:21:21] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:21:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:21:57] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist']
[30/Oct/2018 16:21:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:22:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:22:47] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:22:47] INFO [mysite:140] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist']
[30/Oct/2018 16:22:47] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:23:14] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:23:14] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:23:18] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:23:18] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:23:18] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:23:18] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:27:39] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:27:39] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:27:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:27:43] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:27:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:27:43] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:28:55] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:28:55] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:28:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:28:57] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:28:57] INFO [mysite:146] worked out
[30/Oct/2018 16:28:58] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:28:58] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:29:16] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:29:16] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:29:19] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:29:19] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:29:19] INFO [mysite:146] worked out
[30/Oct/2018 16:29:37] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:29:37] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:29:40] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:29:40] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:32:08] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:32:08] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:32:11] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:32:11] INFO [mysite:137] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:34:03] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:34:03] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:34:05] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:34:05] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:36:53] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:36:53] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:36:58] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:36:58] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:39:53] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:39:53] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:39:53] INFO [mysite:148] worked out
[30/Oct/2018 16:39:53] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:39:55] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:39:55] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:39:55] INFO [mysite:148] worked out
[30/Oct/2018 16:39:55] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:09] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:12] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:12] INFO [mysite:143] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:40:12] INFO [mysite:148] worked out
[30/Oct/2018 16:40:12] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:35] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:38] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:38] INFO [mysite:139] form is valid
[30/Oct/2018 16:40:38] INFO [mysite:144] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:40:38] INFO [mysite:149] worked out
[30/Oct/2018 16:40:38] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:51] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:55] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:40:55] INFO [mysite:139] form is valid
[30/Oct/2018 16:40:55] INFO [mysite:144] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:40:55] INFO [mysite:149] worked out
[30/Oct/2018 16:40:56] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:13] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:16] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:16] INFO [mysite:139] form is valid
[30/Oct/2018 16:41:16] INFO [mysite:144] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:41:16] INFO [mysite:149] worked out
[30/Oct/2018 16:41:16] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:37] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:40] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:41:40] INFO [mysite:137] post method
[30/Oct/2018 16:41:40] INFO [mysite:140] form is valid
[30/Oct/2018 16:41:41] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:41:41] INFO [mysite:150] worked out
[30/Oct/2018 16:41:41] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:00] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:02] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:06] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:06] INFO [mysite:137] post method
[30/Oct/2018 16:42:06] INFO [mysite:140] form is valid
[30/Oct/2018 16:42:06] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:42:06] INFO [mysite:150] worked out
[30/Oct/2018 16:42:06] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:23] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:26] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:26] INFO [mysite:137] post method
[30/Oct/2018 16:42:26] INFO [mysite:140] form is valid
[30/Oct/2018 16:42:27] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:42:27] INFO [mysite:150] worked out
[30/Oct/2018 16:42:27] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:44] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:47] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:42:47] INFO [mysite:137] post method
[30/Oct/2018 16:42:47] INFO [mysite:140] form is valid
[30/Oct/2018 16:42:47] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:42:47] INFO [mysite:150] worked out
[30/Oct/2018 16:42:48] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:43:28] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:43:32] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:43:32] INFO [mysite:137] post method
[30/Oct/2018 16:43:32] INFO [mysite:140] form is valid
[30/Oct/2018 16:43:32] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:43:32] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:43:41] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:43:41] INFO [mysite:137] post method
[30/Oct/2018 16:43:41] INFO [mysite:140] form is valid
[30/Oct/2018 16:43:41] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:43:41] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:44:18] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:44:26] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:44:26] INFO [mysite:137] post method
[30/Oct/2018 16:44:26] INFO [mysite:140] form is valid
[30/Oct/2018 16:44:26] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:44:26] INFO [mysite:147] m_tags
[30/Oct/2018 16:44:45] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:44:45] INFO [mysite:137] post method
[30/Oct/2018 16:44:45] INFO [mysite:140] form is valid
[30/Oct/2018 16:44:45] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:44:45] INFO [mysite:147] ['testag']
[30/Oct/2018 16:44:47] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:44:47] INFO [mysite:137] post method
[30/Oct/2018 16:44:47] INFO [mysite:140] form is valid
[30/Oct/2018 16:44:47] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:44:47] INFO [mysite:147] ['testag']
[30/Oct/2018 16:45:17] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:45:17] INFO [mysite:137] post method
[30/Oct/2018 16:45:17] INFO [mysite:140] form is valid
[30/Oct/2018 16:45:17] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:45:17] INFO [mysite:147] ['testag']
[30/Oct/2018 16:45:22] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:45:22] INFO [mysite:137] post method
[30/Oct/2018 16:45:22] INFO [mysite:140] form is valid
[30/Oct/2018 16:45:22] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:45:22] INFO [mysite:147] ['test']
[30/Oct/2018 16:45:48] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:45:48] INFO [mysite:137] post method
[30/Oct/2018 16:45:48] INFO [mysite:140] form is valid
[30/Oct/2018 16:45:48] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:45:48] INFO [mysite:147] ['test']
[30/Oct/2018 16:45:53] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:45:53] INFO [mysite:137] post method
[30/Oct/2018 16:45:53] INFO [mysite:140] form is valid
[30/Oct/2018 16:45:53] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:45:53] INFO [mysite:147] ['hi']
[30/Oct/2018 16:47:04] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:47:04] INFO [mysite:137] post method
[30/Oct/2018 16:47:04] INFO [mysite:140] form is valid
[30/Oct/2018 16:47:04] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:47:04] INFO [mysite:147] ['hi']
[30/Oct/2018 16:47:07] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:47:07] INFO [mysite:137] post method
[30/Oct/2018 16:47:07] INFO [mysite:140] form is valid
[30/Oct/2018 16:47:07] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:47:07] INFO [mysite:147] ['hi']
[30/Oct/2018 16:48:06] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:48:06] INFO [mysite:137] post method
[30/Oct/2018 16:48:06] INFO [mysite:140] form is valid
[30/Oct/2018 16:48:06] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:48:06] INFO [mysite:147] ['hi']
[30/Oct/2018 16:48:09] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:48:09] INFO [mysite:137] post method
[30/Oct/2018 16:48:09] INFO [mysite:140] form is valid
[30/Oct/2018 16:48:09] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:48:09] INFO [mysite:147] ['hi']
[30/Oct/2018 16:48:46] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:49:21] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:49:24] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:49:24] INFO [mysite:137] post method
[30/Oct/2018 16:49:24] INFO [mysite:140] form is valid
[30/Oct/2018 16:49:24] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:49:24] INFO [mysite:148] ['test']
[30/Oct/2018 16:49:45] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:49:45] INFO [mysite:137] post method
[30/Oct/2018 16:49:45] INFO [mysite:140] form is valid
[30/Oct/2018 16:49:45] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:49:45] INFO [mysite:148] ['hi']
[30/Oct/2018 16:49:51] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:49:51] INFO [mysite:137] post method
[30/Oct/2018 16:49:51] INFO [mysite:140] form is valid
[30/Oct/2018 16:49:51] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:49:51] INFO [mysite:148] ['hi']
[30/Oct/2018 16:50:57] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:50:57] INFO [mysite:137] post method
[30/Oct/2018 16:50:57] INFO [mysite:140] form is valid
[30/Oct/2018 16:50:57] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:50:57] INFO [mysite:148] hi
[30/Oct/2018 16:51:01] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:51:01] INFO [mysite:137] post method
[30/Oct/2018 16:51:01] INFO [mysite:140] form is valid
[30/Oct/2018 16:51:01] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:51:01] INFO [mysite:148] hi
[30/Oct/2018 16:51:03] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:51:03] INFO [mysite:137] post method
[30/Oct/2018 16:51:03] INFO [mysite:140] form is valid
[30/Oct/2018 16:51:03] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:51:03] INFO [mysite:148] hi
[30/Oct/2018 16:51:20] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:51:20] INFO [mysite:137] post method
[30/Oct/2018 16:51:20] INFO [mysite:140] form is valid
[30/Oct/2018 16:51:20] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt']
[30/Oct/2018 16:51:20] INFO [mysite:148] hi
[30/Oct/2018 16:51:20] INFO [mysite:152] worked out
[30/Oct/2018 16:51:20] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:51:35] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:51:35] INFO [mysite:137] post method
[30/Oct/2018 16:51:35] INFO [mysite:140] form is valid
[30/Oct/2018 16:51:35] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt', 'h', 'i']
[30/Oct/2018 16:51:35] INFO [mysite:148] hi
[30/Oct/2018 16:51:35] INFO [mysite:152] worked out
[30/Oct/2018 16:51:35] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:52:18] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:52:25] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:52:25] INFO [mysite:137] post method
[30/Oct/2018 16:52:25] INFO [mysite:140] form is valid
[30/Oct/2018 16:52:25] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'neu', 'mist', 'fritt', 'h', 'i']
[30/Oct/2018 16:52:25] INFO [mysite:148] hi
[30/Oct/2018 16:52:25] INFO [mysite:152] worked out
[30/Oct/2018 16:53:40] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:53:40] INFO [mysite:137] post method
[30/Oct/2018 16:53:40] INFO [mysite:140] form is valid
[30/Oct/2018 16:53:41] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:53:41] INFO [mysite:148] hi
[30/Oct/2018 16:53:41] INFO [mysite:152] worked out
[30/Oct/2018 16:53:45] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:53:45] INFO [mysite:137] post method
[30/Oct/2018 16:53:45] INFO [mysite:140] form is valid
[30/Oct/2018 16:53:45] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'h', 'i']
[30/Oct/2018 16:53:45] INFO [mysite:148] hi
[30/Oct/2018 16:53:45] INFO [mysite:152] worked out
[30/Oct/2018 16:55:22] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:55:22] INFO [mysite:137] post method
[30/Oct/2018 16:55:22] INFO [mysite:140] form is valid
[30/Oct/2018 16:55:22] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'h', 'i']
[30/Oct/2018 16:55:22] INFO [mysite:148] hi
[30/Oct/2018 16:55:22] INFO [mysite:152] worked out
[30/Oct/2018 16:55:25] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:55:25] INFO [mysite:137] post method
[30/Oct/2018 16:55:25] INFO [mysite:140] form is valid
[30/Oct/2018 16:55:25] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'h', 'i']
[30/Oct/2018 16:55:25] INFO [mysite:148] hi
[30/Oct/2018 16:55:25] INFO [mysite:152] worked out
[30/Oct/2018 16:55:46] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:55:46] INFO [mysite:137] post method
[30/Oct/2018 16:55:46] INFO [mysite:140] form is valid
[30/Oct/2018 16:55:46] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:55:46] INFO [mysite:148] hi
[30/Oct/2018 16:55:46] INFO [mysite:152] worked out
[30/Oct/2018 16:55:48] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:55:48] INFO [mysite:137] post method
[30/Oct/2018 16:55:48] INFO [mysite:140] form is valid
[30/Oct/2018 16:55:48] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'h', 'i']
[30/Oct/2018 16:55:48] INFO [mysite:148] hi
[30/Oct/2018 16:55:48] INFO [mysite:152] worked out
[30/Oct/2018 16:57:24] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:57:24] INFO [mysite:137] post method
[30/Oct/2018 16:57:24] INFO [mysite:140] form is valid
[30/Oct/2018 16:57:24] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second', 'h', 'i']
[30/Oct/2018 16:57:24] INFO [mysite:148] hi
[30/Oct/2018 16:57:24] INFO [mysite:150] worked out
[30/Oct/2018 16:57:41] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:57:41] INFO [mysite:137] post method
[30/Oct/2018 16:57:41] INFO [mysite:140] form is valid
[30/Oct/2018 16:57:41] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:57:41] INFO [mysite:148] hi
[30/Oct/2018 16:57:41] INFO [mysite:150] worked out
[30/Oct/2018 16:57:43] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:57:43] INFO [mysite:137] post method
[30/Oct/2018 16:57:43] INFO [mysite:140] form is valid
[30/Oct/2018 16:57:43] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:57:43] INFO [mysite:148] hi
[30/Oct/2018 16:57:43] INFO [mysite:150] worked out
[30/Oct/2018 16:58:02] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:58:02] INFO [mysite:137] post method
[30/Oct/2018 16:58:02] INFO [mysite:140] form is valid
[30/Oct/2018 16:58:02] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:58:02] INFO [mysite:148] hi
[30/Oct/2018 16:58:02] INFO [mysite:150] worked out
[30/Oct/2018 16:58:07] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:58:07] INFO [mysite:137] post method
[30/Oct/2018 16:58:07] INFO [mysite:140] form is valid
[30/Oct/2018 16:58:07] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:58:07] INFO [mysite:148] bayern
[30/Oct/2018 16:58:07] INFO [mysite:150] worked out
[30/Oct/2018 16:59:49] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:59:49] INFO [mysite:137] post method
[30/Oct/2018 16:59:49] INFO [mysite:140] form is valid
[30/Oct/2018 16:59:49] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:59:49] INFO [mysite:148] bayern
[30/Oct/2018 16:59:49] INFO [mysite:150] worked out
[30/Oct/2018 16:59:49] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:59:54] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 16:59:54] INFO [mysite:137] post method
[30/Oct/2018 16:59:54] INFO [mysite:140] form is valid
[30/Oct/2018 16:59:54] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 16:59:54] INFO [mysite:148] bayern
[30/Oct/2018 16:59:54] INFO [mysite:150] worked out
[30/Oct/2018 16:59:54] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:00:33] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:00:36] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:00:36] INFO [mysite:137] post method
[30/Oct/2018 17:00:36] INFO [mysite:140] form is valid
[30/Oct/2018 17:00:36] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 17:00:36] INFO [mysite:148] hi
[30/Oct/2018 17:00:36] INFO [mysite:150] worked out
[30/Oct/2018 17:00:37] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:00:58] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:01:01] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:01:01] INFO [mysite:137] post method
[30/Oct/2018 17:01:01] INFO [mysite:140] form is valid
[30/Oct/2018 17:01:01] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 17:01:01] INFO [mysite:148] test
[30/Oct/2018 17:01:01] INFO [mysite:150] worked out
[30/Oct/2018 17:01:01] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:01:06] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:01:06] INFO [mysite:137] post method
[30/Oct/2018 17:01:06] INFO [mysite:140] form is valid
[30/Oct/2018 17:01:06] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 17:01:06] INFO [mysite:148] testag
[30/Oct/2018 17:01:30] INFO [mysite:135] CustomUser object (1)
[30/Oct/2018 17:01:30] INFO [mysite:137] post method
[30/Oct/2018 17:01:30] INFO [mysite:140] form is valid
[30/Oct/2018 17:01:30] INFO [mysite:145] ['hi', 'first', 'test', 'bayern', 'second']
[30/Oct/2018 17:01:30] INFO [mysite:148] testag
[31/Oct/2018 14:51:36] INFO [mysite:141] CustomUser object (2)
[31/Oct/2018 14:51:39] INFO [mysite:141] CustomUser object (2)
[31/Oct/2018 14:52:57] INFO [mysite:142] CustomUser object (2)
[31/Oct/2018 14:53:00] INFO [mysite:142] CustomUser object (2)
[31/Oct/2018 14:54:10] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:54:12] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:09] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:38] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:55:41] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 14:56:20] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:29] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:31] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:58:43] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 14:59:00] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:18:53] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:19:02] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:19:04] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:20:10] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:21:24] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:21:27] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:24:55] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:27:16] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:27:59] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:28:02] INFO [mysite:147] CustomUser object (2)
[31/Oct/2018 17:29:13] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:29:17] INFO [mysite:146] CustomUser object (2)
[31/Oct/2018 17:32:43] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 17:32:45] INFO [mysite:144] CustomUser object (2)
[31/Oct/2018 17:42:25] INFO [mysite:186] None
[31/Oct/2018 17:43:06] INFO [mysite:186] None
[31/Oct/2018 17:43:07] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:43:13] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:44:14] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:44:17] INFO [mysite:175] <QuerySet [<Tag: hi>]>
[31/Oct/2018 17:44:17] INFO [mysite:178] <QuerySet [<Post: Hi there>]>
[31/Oct/2018 17:45:09] INFO [mysite:175] <QuerySet [<Tag: hi>]>
[31/Oct/2018 17:45:09] INFO [mysite:178] <QuerySet [<Post: Hi there>]>
[31/Oct/2018 17:45:15] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:45:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:45:24] INFO [mysite:146] post method
[31/Oct/2018 17:45:24] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 17:46:00] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:46:04] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:46:04] INFO [mysite:146] post method
[31/Oct/2018 17:46:05] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 17:46:05] INFO [mysite:156] hi
[31/Oct/2018 17:46:05] INFO [mysite:158] worked out
[31/Oct/2018 17:46:05] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:10] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:13] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:50:13] INFO [mysite:146] post method
[31/Oct/2018 17:51:14] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:51:14] INFO [mysite:146] post method
[31/Oct/2018 17:51:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:51:24] INFO [mysite:146] post method
[31/Oct/2018 17:51:39] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 17:56:24] INFO [mysite:144] CustomUser object (3)
[31/Oct/2018 18:04:35] INFO [mysite:146] post method
[31/Oct/2018 18:04:35] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:04:35] INFO [mysite:157] worked out
[31/Oct/2018 18:06:17] INFO [mysite:146] post method
[31/Oct/2018 18:06:18] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:06:18] INFO [mysite:157] worked out
[31/Oct/2018 18:07:46] INFO [mysite:146] post method
[31/Oct/2018 18:07:47] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:07:47] INFO [mysite:157] worked out
[31/Oct/2018 18:09:17] INFO [mysite:146] post method
[31/Oct/2018 18:09:18] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:09:40] INFO [mysite:146] post method
[31/Oct/2018 18:09:40] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:09:47] INFO [mysite:146] post method
[31/Oct/2018 18:09:48] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:10:12] INFO [mysite:146] post method
[31/Oct/2018 18:10:12] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:10:12] INFO [mysite:157] worked out
[31/Oct/2018 18:22:34] INFO [mysite:144] post method
[31/Oct/2018 18:22:51] INFO [mysite:145] post method
[31/Oct/2018 18:22:51] INFO [mysite:148] form is valid
[31/Oct/2018 18:22:51] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:10] INFO [mysite:145] post method
[31/Oct/2018 18:23:10] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:10] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:10] INFO [mysite:156] hi
[31/Oct/2018 18:23:10] INFO [mysite:158] worked out
[31/Oct/2018 18:23:19] INFO [mysite:145] post method
[31/Oct/2018 18:23:19] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:19] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:19] INFO [mysite:156] hi
[31/Oct/2018 18:23:19] INFO [mysite:158] worked out
[31/Oct/2018 18:23:23] INFO [mysite:145] post method
[31/Oct/2018 18:23:23] INFO [mysite:148] form is valid
[31/Oct/2018 18:23:23] INFO [mysite:153] ['hi', 'first', 'test', 'bayern', 'second']
[31/Oct/2018 18:23:23] INFO [mysite:156] tehere
[04/Nov/2018 14:50:11] INFO [mysite:186] None
[09/Nov/2018 08:16:30] INFO [mysite:59] <QuerySet [<Post: Hi there>, <Post: Bavaria>, <Post: test again>]>
[09/Nov/2018 08:16:32] INFO [mysite:59] <QuerySet [<Post: Hi there>]>
[09/Nov/2018 08:16:34] INFO [mysite:59] <QuerySet [<Post: Hi there>, <Post: test again>]>
[09/Nov/2018 08:16:53] INFO [mysite:187] None
[09/Nov/2018 15:25:20] INFO [mysite:187] None
+750
View File
@@ -0,0 +1,750 @@
[16/Oct/2018 19:58:49] INFO [mysite:150] test
[16/Oct/2018 20:00:13] INFO [mysite:150] test
[16/Oct/2018 20:00:44] INFO [mysite:150] test
[18/Oct/2018 16:49:10] INFO [mysite:150] test
[18/Oct/2018 16:50:20] INFO [mysite:149] test
[18/Oct/2018 16:53:59] INFO [mysite:149] test
[18/Oct/2018 17:02:15] INFO [mysite:149] Here ist the log
[18/Oct/2018 17:03:03] INFO [mysite:149] Here ist the log
[18/Oct/2018 17:04:21] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:08:44] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:22:00] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:29:57] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:33:51] INFO [mysite:150] Here ist the log
[18/Oct/2018 17:37:15] INFO [mysite:147] hei
[18/Oct/2018 17:38:10] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:40:53] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:41:34] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:41:45] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:42:04] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:47:59] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:49:27] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:49:43] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 17:50:18] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:04:38] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:07:12] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:08:17] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:09:29] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:10:27] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:10:59] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:13:11] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:14:22] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:14:45] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:17:07] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:23:37] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:42:53] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:43:28] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 18:46:58] INFO [mysite:147] CustomUser object (25)
[18/Oct/2018 19:12:55] INFO [mysite:147] CustomUser object (25)
[19/Oct/2018 09:18:42] INFO [mysite:147] CustomUser object (25)
[19/Oct/2018 09:19:10] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 10:24:35] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 16:52:08] INFO [mysite:148] <QuerySet []>
[19/Oct/2018 17:33:50] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:38:33] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:39:08] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:41:43] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:42:00] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:44:10] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:47:28] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:48:28] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 17:56:41] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:06:57] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:07:17] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:07:31] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:12:56] INFO [mysite:149] CustomUser object (25)
[19/Oct/2018 18:15:29] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 17:20:58] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 17:54:57] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 18:03:09] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 18:18:52] INFO [mysite:149] CustomUser object (25)
[20/Oct/2018 19:14:57] INFO [mysite:183] None
[20/Oct/2018 19:15:00] INFO [mysite:183] test
[20/Oct/2018 19:15:45] INFO [mysite:183] test
[20/Oct/2018 19:17:52] INFO [mysite:183] test
[20/Oct/2018 19:18:31] INFO [mysite:183] test
[20/Oct/2018 19:19:01] INFO [mysite:183] test
[20/Oct/2018 19:20:08] INFO [mysite:184] test
[20/Oct/2018 19:24:45] INFO [mysite:184] None
[20/Oct/2018 19:26:30] INFO [mysite:184] None
[20/Oct/2018 19:29:44] INFO [mysite:184] test
[20/Oct/2018 19:32:09] INFO [mysite:184] test
[20/Oct/2018 19:33:14] INFO [mysite:184] 5
[20/Oct/2018 22:26:02] INFO [mysite:184] hi
[20/Oct/2018 22:26:09] INFO [mysite:184] 2
[20/Oct/2018 22:26:39] INFO [mysite:184] 2
[20/Oct/2018 22:35:49] INFO [mysite:183] 2
[20/Oct/2018 22:35:55] INFO [mysite:183] 3
[20/Oct/2018 22:51:06] INFO [mysite:183] hi
[20/Oct/2018 22:53:24] INFO [mysite:183] hi
[20/Oct/2018 22:54:12] INFO [mysite:183] hi
[20/Oct/2018 22:57:38] INFO [mysite:181] <QuerySet [<Post: first post>, <Post: second bla>, <Post: Third one>]>
[20/Oct/2018 22:57:39] INFO [mysite:184] hi
[20/Oct/2018 22:59:11] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 22:59:11] INFO [mysite:184] hi
[20/Oct/2018 23:01:53] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:01:53] INFO [mysite:184] hi
[20/Oct/2018 23:02:06] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:06] INFO [mysite:184] 5
[20/Oct/2018 23:02:22] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:22] INFO [mysite:184] 5
[20/Oct/2018 23:02:45] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:02:45] INFO [mysite:184] 5
[20/Oct/2018 23:03:07] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:03:07] INFO [mysite:184] 5
[20/Oct/2018 23:03:46] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:03:46] INFO [mysite:184] 5
[20/Oct/2018 23:04:35] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:04:35] INFO [mysite:184] 5
[20/Oct/2018 23:06:49] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:06:49] INFO [mysite:184] hi
[20/Oct/2018 23:15:41] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:15:41] INFO [mysite:184] hi
[20/Oct/2018 23:17:19] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:17:19] INFO [mysite:184] hi
[20/Oct/2018 23:17:38] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:17:38] INFO [mysite:184] hi
[20/Oct/2018 23:19:11] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:19:11] INFO [mysite:184] hi
[20/Oct/2018 23:24:22] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:23] INFO [mysite:184] hi
[20/Oct/2018 23:24:42] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:42] INFO [mysite:184] hi
[20/Oct/2018 23:24:49] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:49] INFO [mysite:184] hi
[20/Oct/2018 23:24:54] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:24:54] INFO [mysite:184] test
[20/Oct/2018 23:25:01] INFO [mysite:181] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[20/Oct/2018 23:25:01] INFO [mysite:184] third
[20/Oct/2018 23:28:54] INFO [mysite:182] None
[20/Oct/2018 23:29:00] INFO [mysite:182] hi
[20/Oct/2018 23:29:42] INFO [mysite:182] hi
[20/Oct/2018 23:30:53] INFO [mysite:182] hi
[20/Oct/2018 23:34:29] INFO [mysite:184] hi
[20/Oct/2018 23:34:34] INFO [mysite:54] <QuerySet [<Post: second bla>]>
[20/Oct/2018 23:38:12] INFO [mysite:54] <QuerySet [<Post: second bla>]>
[20/Oct/2018 23:38:18] INFO [mysite:184] None
[20/Oct/2018 23:38:25] INFO [mysite:184] hi
[20/Oct/2018 23:40:03] INFO [mysite:184] hi
[20/Oct/2018 23:40:10] INFO [mysite:184] first
[20/Oct/2018 23:41:01] INFO [mysite:184] first
[20/Oct/2018 23:41:12] INFO [mysite:184] h
[20/Oct/2018 23:41:28] INFO [mysite:184] h
[20/Oct/2018 23:41:32] INFO [mysite:184] h
[20/Oct/2018 23:41:38] INFO [mysite:184] h
[20/Oct/2018 23:41:40] INFO [mysite:184] hi
[20/Oct/2018 23:41:50] INFO [mysite:184] hi
[20/Oct/2018 23:41:56] INFO [mysite:184] taggit
[21/Oct/2018 10:35:50] INFO [mysite:184] taggit
[21/Oct/2018 10:35:55] INFO [mysite:184]
[21/Oct/2018 10:38:17] INFO [mysite:184] None
[21/Oct/2018 12:59:59] INFO [mysite:184] None
[22/Oct/2018 14:31:54] INFO [mysite:184] None
[22/Oct/2018 14:32:03] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:40:08] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:43:18] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:43:31] INFO [mysite:150] CustomUser object (25)
[22/Oct/2018 14:50:32] INFO [mysite:150] esthi
[22/Oct/2018 14:50:32] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 14:51:10] INFO [mysite:150] stefan
[22/Oct/2018 14:51:10] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:56:36] INFO [mysite:150] stefan
[22/Oct/2018 14:56:36] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:56:56] INFO [mysite:150] stefan
[22/Oct/2018 14:56:56] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:57:15] INFO [mysite:150] stefan
[22/Oct/2018 14:57:15] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:57:39] INFO [mysite:150] stefan
[22/Oct/2018 14:57:39] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:58:53] INFO [mysite:150] stefan
[22/Oct/2018 14:58:53] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:59:01] INFO [mysite:150] stefan
[22/Oct/2018 14:59:01] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 14:59:55] INFO [mysite:150] stefan
[22/Oct/2018 14:59:55] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:02:16] INFO [mysite:150] stefan
[22/Oct/2018 15:02:16] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:03:09] INFO [mysite:150] stefan
[22/Oct/2018 15:03:09] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:03:41] INFO [mysite:150] stefan
[22/Oct/2018 15:03:41] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:05:17] INFO [mysite:184] None
[22/Oct/2018 15:05:21] INFO [mysite:184] hi
[22/Oct/2018 15:07:51] INFO [mysite:185] None
[22/Oct/2018 15:07:53] INFO [mysite:150] stefan
[22/Oct/2018 15:07:53] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:08:37] INFO [mysite:150] stefan
[22/Oct/2018 15:08:37] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:09:08] INFO [mysite:151] stefan
[22/Oct/2018 15:09:08] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:09:58] INFO [mysite:151] stefan
[22/Oct/2018 15:09:58] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:11:00] INFO [mysite:151] stefan
[22/Oct/2018 15:11:00] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:11:41] INFO [mysite:151] stefan
[22/Oct/2018 15:11:41] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:12:14] INFO [mysite:151] stefan
[22/Oct/2018 15:12:14] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 15:14:15] INFO [mysite:151] stefan
[22/Oct/2018 15:14:15] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 17:37:38] INFO [mysite:154] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 17:38:19] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:39:44] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:39:44] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:41:03] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:41:19] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:41:20] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:07] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:07] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:32] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:32] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:47] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:45:47] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:45:47] INFO [mysite:160] ['bamberg']
[22/Oct/2018 17:45:47] INFO [mysite:160] ['bamberg', 'test']
[22/Oct/2018 17:49:21] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:49:21] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:49:21] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:49:21] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:51:20] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:51:20] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:51:20] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:51:20] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:51:27] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:51:27] INFO [mysite:155] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:51:28] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:51:28] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:53:13] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:53:55] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:53:55] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:53:55] INFO [mysite:158] ['bamberg']
[22/Oct/2018 17:53:55] INFO [mysite:158] ['bamberg', 'test']
[22/Oct/2018 17:54:44] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:54:44] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:02] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:55:02] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:02] INFO [mysite:159] ['bamberg']
[22/Oct/2018 17:55:02] INFO [mysite:159] ['bamberg', 'test']
[22/Oct/2018 17:55:14] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:55:14] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:55:14] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:55:14] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:56:12] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:56:12] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:56:12] INFO [mysite:159] bamberg
[22/Oct/2018 17:56:12] INFO [mysite:159] test
[22/Oct/2018 17:56:34] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:56:34] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:56:34] INFO [mysite:159] bamberg
[22/Oct/2018 17:56:34] INFO [mysite:159] test
[22/Oct/2018 17:57:48] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:57:48] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:57:49] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:57:49] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 17:59:46] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:59:46] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 17:59:46] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 17:59:46] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:00:06] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:06] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:151] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:154] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:00:15] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:00:15] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:25] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:01:25] INFO [mysite:158] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:25] INFO [mysite:158] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:01:45] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:02:47] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:03:12] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:03:12] INFO [mysite:158] <QuerySet []>
[22/Oct/2018 18:03:12] INFO [mysite:158] <QuerySet []>
[22/Oct/2018 18:04:45] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:05:24] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:05:24] INFO [mysite:157] bamberg
[22/Oct/2018 18:05:24] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:05:24] INFO [mysite:157] test
[22/Oct/2018 18:05:24] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:13:35] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:13:35] INFO [mysite:157] bamberg
[22/Oct/2018 18:14:16] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:14:16] INFO [mysite:157] bamberg
[22/Oct/2018 18:19:16] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:19:16] INFO [mysite:157] bamberg
[22/Oct/2018 18:38:14] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:38:14] INFO [mysite:157] bamberg
[22/Oct/2018 18:41:50] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:41:50] INFO [mysite:157] bamberg
[22/Oct/2018 18:41:50] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:41:50] INFO [mysite:157] test
[22/Oct/2018 18:41:50] INFO [mysite:159] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[22/Oct/2018 18:45:55] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:45:55] INFO [mysite:157] bamberg
[22/Oct/2018 18:46:39] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:46:39] INFO [mysite:157] bamberg
[22/Oct/2018 18:46:39] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:46:39] INFO [mysite:157] test
[22/Oct/2018 18:46:39] INFO [mysite:159] <QuerySet [<Post: first post>, <Post: second bla>, <Post: Third one>]>
[22/Oct/2018 18:47:12] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:47:12] INFO [mysite:157] stefan
[22/Oct/2018 18:47:12] INFO [mysite:159] <QuerySet []>
[22/Oct/2018 18:48:22] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:48:22] INFO [mysite:157] stefan
[22/Oct/2018 18:48:22] INFO [mysite:159] <QuerySet [<Post: Crazy>]>
[22/Oct/2018 18:50:37] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:50:38] INFO [mysite:157] stefan
[22/Oct/2018 18:52:01] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:52:01] INFO [mysite:157] stefan
[22/Oct/2018 18:52:36] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:52:36] INFO [mysite:157] stefan
[22/Oct/2018 18:53:07] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[22/Oct/2018 18:53:07] INFO [mysite:157] stefan
[22/Oct/2018 18:53:20] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:53:20] INFO [mysite:157] bamberg
[22/Oct/2018 18:53:20] INFO [mysite:157] test
[22/Oct/2018 18:54:05] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:05] INFO [mysite:157] bamberg
[22/Oct/2018 18:54:20] INFO [mysite:153] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:21] INFO [mysite:157] bamberg
[22/Oct/2018 18:54:21] INFO [mysite:157] test
[22/Oct/2018 18:54:46] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:54:46] INFO [mysite:156] bamberg
[22/Oct/2018 18:54:46] INFO [mysite:156] test
[22/Oct/2018 18:55:43] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[22/Oct/2018 18:55:43] INFO [mysite:156] bamberg
[22/Oct/2018 18:55:43] INFO [mysite:156] test
[24/Oct/2018 15:10:56] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:10:56] INFO [mysite:156] stefan
[24/Oct/2018 15:11:37] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:11:37] INFO [mysite:156] stefan
[24/Oct/2018 15:11:37] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:13:48] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:13:48] INFO [mysite:156] stefan
[24/Oct/2018 15:13:48] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:15:46] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:15:46] INFO [mysite:157] stefan
[24/Oct/2018 15:15:55] INFO [mysite:153] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:15:55] INFO [mysite:157] stefan
[24/Oct/2018 15:15:55] INFO [mysite:159] <QuerySet []>
[24/Oct/2018 15:17:17] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:17:17] INFO [mysite:156] stefan
[24/Oct/2018 15:17:17] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:18:27] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:18:27] INFO [mysite:156] stefan
[24/Oct/2018 15:18:27] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:21:10] INFO [mysite:150] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[24/Oct/2018 15:21:10] INFO [mysite:154] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:21:10] INFO [mysite:158] stefan
[24/Oct/2018 15:21:10] INFO [mysite:160] <QuerySet []>
[24/Oct/2018 15:22:12] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:12] INFO [mysite:156] ['stefan']
[24/Oct/2018 15:22:12] INFO [mysite:158] <QuerySet []>
[24/Oct/2018 15:22:29] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:29] INFO [mysite:156] ['stefan']
[24/Oct/2018 15:22:57] INFO [mysite:152] <QuerySet [<Tag: stefan>]>
[24/Oct/2018 15:22:57] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:23:36] INFO [mysite:152] <QuerySet [<Tag: stefan>, <Tag: test>]>
[24/Oct/2018 15:23:36] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:23:36] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:24:29] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: wieder>]>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:24:29] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:26:03] INFO [mysite:152] <QuerySet [<Tag: lukas>, <Tag: hi>]>
[24/Oct/2018 15:26:03] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:26:03] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: second bla>]>
[24/Oct/2018 15:51:54] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: wieder>]>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:51:55] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:01] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[24/Oct/2018 15:53:01] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:01] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:53:28] INFO [mysite:152] <QuerySet [<Tag: bamberg>, <Tag: test>, <Tag: this is a new one>]>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 15:53:28] INFO [mysite:155] <QuerySet []>
[24/Oct/2018 18:41:24] INFO [mysite:186] None
[24/Oct/2018 18:41:31] INFO [mysite:186] bla
[24/Oct/2018 18:42:12] INFO [mysite:186] avoiddouble
[24/Oct/2018 18:42:20] INFO [mysite:186] hi
[24/Oct/2018 18:56:30] INFO [mysite:158] <QuerySet [<Tag: bamberg>, <Tag: test>]>
[24/Oct/2018 18:56:30] INFO [mysite:161] <QuerySet []>
[24/Oct/2018 18:56:30] INFO [mysite:161] <QuerySet [<Post: Third one>, <Post: first post>, <Post: second bla>]>
[24/Oct/2018 18:56:45] INFO [mysite:190] None
[24/Oct/2018 18:56:49] INFO [mysite:190] bamberg
[24/Oct/2018 18:57:29] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:30] INFO [mysite:189] None
[24/Oct/2018 19:00:30] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:00:33] INFO [mysite:189] hi
[24/Oct/2018 19:00:33] INFO [mysite:191] <QuerySet [<Post: second bla>, <Post: Third one>]>
[24/Oct/2018 19:00:38] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:38] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:00:54] INFO [mysite:189] bamberg
[24/Oct/2018 19:00:54] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:01:16] INFO [mysite:189] test
[24/Oct/2018 19:01:16] INFO [mysite:191] <QuerySet [<Post: second bla>, <Post: first post>, <Post: Third one>]>
[24/Oct/2018 19:01:20] INFO [mysite:189] third
[24/Oct/2018 19:01:20] INFO [mysite:191] <QuerySet [<Post: Third one>]>
[24/Oct/2018 19:01:35] INFO [mysite:189] None
[24/Oct/2018 19:01:35] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:01:40] INFO [mysite:189] bamberg
[24/Oct/2018 19:01:40] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:03] INFO [mysite:189] None
[24/Oct/2018 19:03:03] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:08] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:08] INFO [mysite:191] <QuerySet []>
[24/Oct/2018 19:03:28] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:28] INFO [mysite:191] <QuerySet [<Post: Third one>]>
[24/Oct/2018 19:03:45] INFO [mysite:189] bamberg
[24/Oct/2018 19:03:45] INFO [mysite:191] <QuerySet [<Post: Third one>, <Post: here i go again>]>
[30/Oct/2018 12:25:09] INFO [mysite:56] <QuerySet [<Post: Hi there>]>
[30/Oct/2018 12:25:11] INFO [mysite:56] <QuerySet [<Post: Hi there>, <Post: Bavaria>]>
[30/Oct/2018 12:25:26] INFO [mysite:189] None
[30/Oct/2018 12:25:34] INFO [mysite:189] bayern
[30/Oct/2018 12:29:44] INFO [mysite:189] None
[30/Oct/2018 12:43:44] INFO [mysite:190] None
[30/Oct/2018 12:47:17] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:47:21] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:47:46] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:48:00] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:48:29] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:48:29] INFO [mysite:138] hi
[30/Oct/2018 12:49:23] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:49:26] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:49:26] INFO [mysite:138] hi
[30/Oct/2018 12:49:26] INFO [mysite:144] ['hi']
[30/Oct/2018 12:49:47] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:49:50] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:49:50] INFO [mysite:138] hi
[30/Oct/2018 12:49:50] INFO [mysite:144] ['test']
[30/Oct/2018 12:50:02] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:06] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:06] INFO [mysite:138] hi
[30/Oct/2018 12:50:06] INFO [mysite:144] ['hi']
[30/Oct/2018 12:50:22] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:27] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:27] INFO [mysite:138] hi
[30/Oct/2018 12:50:27] INFO [mysite:144] ['hi']
[30/Oct/2018 12:50:47] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:50] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:50:50] INFO [mysite:138] hi
[30/Oct/2018 12:50:50] INFO [mysite:144] ['hi']
[30/Oct/2018 12:50:50] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:52:04] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:07] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:07] INFO [mysite:138] hi
[30/Oct/2018 12:52:07] INFO [mysite:144] ['hi']
[30/Oct/2018 12:52:07] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:52:17] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:20] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:20] INFO [mysite:138] hi
[30/Oct/2018 12:52:20] INFO [mysite:144] ['hi']
[30/Oct/2018 12:52:20] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:52:43] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:46] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:52:46] INFO [mysite:138] hi
[30/Oct/2018 12:52:46] INFO [mysite:144] ['hi']
[30/Oct/2018 12:52:46] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:52:46] INFO [mysite:151] second
[30/Oct/2018 12:53:44] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:53:47] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:53:47] INFO [mysite:138] hi
[30/Oct/2018 12:53:47] INFO [mysite:144] ['hi']
[30/Oct/2018 12:53:47] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:53:47] INFO [mysite:151] second
[30/Oct/2018 12:53:47] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:53:57] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:07] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:07] INFO [mysite:138] hi
[30/Oct/2018 12:54:07] INFO [mysite:144] ['hi']
[30/Oct/2018 12:54:07] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:54:07] INFO [mysite:151] second
[30/Oct/2018 12:54:07] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:14] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:14] INFO [mysite:138] hi
[30/Oct/2018 12:54:14] INFO [mysite:144] ['test']
[30/Oct/2018 12:54:14] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:54:14] INFO [mysite:151] second
[30/Oct/2018 12:54:14] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:38] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:38] INFO [mysite:138] hi
[30/Oct/2018 12:54:38] INFO [mysite:144] ['test']
[30/Oct/2018 12:54:38] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:54:38] INFO [mysite:151] second
[30/Oct/2018 12:54:38] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:54] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:57] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:54:57] INFO [mysite:138] hi
[30/Oct/2018 12:54:57] INFO [mysite:144] ['hi']
[30/Oct/2018 12:54:57] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:54:57] INFO [mysite:151] second
[30/Oct/2018 12:55:32] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:55:34] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:55:34] INFO [mysite:138] hi
[30/Oct/2018 12:55:34] INFO [mysite:144] ['hi']
[30/Oct/2018 12:55:34] INFO [mysite:149] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:55:53] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:55:55] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:55:55] INFO [mysite:138] hi
[30/Oct/2018 12:55:55] INFO [mysite:144] ['hi']
[30/Oct/2018 12:55:55] INFO [mysite:149] [<Tag: second>]
[30/Oct/2018 12:58:05] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:58:08] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:58:08] INFO [mysite:138] hi
[30/Oct/2018 12:58:08] INFO [mysite:144] ['hi']
[30/Oct/2018 12:58:08] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:58:08] INFO [mysite:150] [<Tag: second>]
[30/Oct/2018 12:58:57] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:59:00] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 12:59:00] INFO [mysite:138] hi
[30/Oct/2018 12:59:00] INFO [mysite:144] ['hi']
[30/Oct/2018 12:59:00] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 12:59:00] INFO [mysite:150] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:00:05] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:00:08] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:00:08] INFO [mysite:138] hi
[30/Oct/2018 13:00:08] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:00:08] INFO [mysite:150] now
[30/Oct/2018 13:00:16] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:00:19] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:00:19] INFO [mysite:138] hi
[30/Oct/2018 13:00:19] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:00:19] INFO [mysite:150] now
[30/Oct/2018 13:00:19] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:00:56] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:01:04] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:01:04] INFO [mysite:138] hi
[30/Oct/2018 13:01:04] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:01:48] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:01:51] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:01:51] INFO [mysite:138] hi
[30/Oct/2018 13:01:51] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:02:23] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:02:26] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:02:26] INFO [mysite:138] hi
[30/Oct/2018 13:02:26] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:02:35] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:02:35] INFO [mysite:138] hi
[30/Oct/2018 13:02:35] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:02:40] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:02:40] INFO [mysite:138] hi
[30/Oct/2018 13:02:40] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:04:12] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:04:16] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:04:16] INFO [mysite:138] hi
[30/Oct/2018 13:04:16] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:04:16] INFO [mysite:150] now
[30/Oct/2018 13:04:16] INFO [mysite:150] now
[30/Oct/2018 13:04:16] INFO [mysite:150] now
[30/Oct/2018 13:04:16] INFO [mysite:150] now
[30/Oct/2018 13:04:16] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:17] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:18] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:19] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:04:20] INFO [mysite:150] now
[30/Oct/2018 13:05:10] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:05:13] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:05:13] INFO [mysite:138] hi
[30/Oct/2018 13:05:13] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:05:13] INFO [mysite:150] now
[30/Oct/2018 13:05:34] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:05:38] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:05:38] INFO [mysite:138] hi
[30/Oct/2018 13:05:38] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:05:38] INFO [mysite:150] now
[30/Oct/2018 13:06:12] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:06:12] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:06:16] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:06:16] INFO [mysite:138] hi
[30/Oct/2018 13:06:16] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:16] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:17] INFO [mysite:150] now
[30/Oct/2018 13:06:45] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:06:48] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:06:48] INFO [mysite:138] hi
[30/Oct/2018 13:06:49] INFO [mysite:148] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:07:30] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:07:33] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:07:33] INFO [mysite:138] hi
[30/Oct/2018 13:09:13] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:09:16] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:09:16] INFO [mysite:138] hi
[30/Oct/2018 13:11:17] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:11:21] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:11:21] INFO [mysite:138] hi
[30/Oct/2018 13:12:34] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:12:37] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:12:37] INFO [mysite:138] hi
[30/Oct/2018 13:12:58] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:13:01] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:13:01] INFO [mysite:138] hi
[30/Oct/2018 13:15:34] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:15:37] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:15:37] INFO [mysite:138] hi
[30/Oct/2018 13:15:58] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:16:02] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:16:02] INFO [mysite:138] hi
[30/Oct/2018 13:16:02] INFO [mysite:146] {'m_tags': ['test']}
[30/Oct/2018 13:16:39] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:16:42] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:16:42] INFO [mysite:138] hi
[30/Oct/2018 13:16:42] INFO [mysite:146] ['test']
[30/Oct/2018 13:17:06] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:17:09] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:17:09] INFO [mysite:138] hi
[30/Oct/2018 13:17:09] INFO [mysite:146] ['test']
[30/Oct/2018 13:20:47] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:20:51] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:20:51] INFO [mysite:138] hi
[30/Oct/2018 13:20:51] INFO [mysite:146] ['test']
[30/Oct/2018 13:21:14] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:21:16] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:21:16] INFO [mysite:138] hi
[30/Oct/2018 13:21:16] INFO [mysite:146] ['test']
[30/Oct/2018 13:21:16] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:27:04] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:27:08] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:27:08] INFO [mysite:138] hi
[30/Oct/2018 13:29:36] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:29:39] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:29:39] INFO [mysite:138] hi
[30/Oct/2018 13:29:39] INFO [mysite:146] ['test']
[30/Oct/2018 13:29:39] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:30:53] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:30:53] INFO [mysite:138] hi
[30/Oct/2018 13:30:53] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, '...(remaining elements truncated)...']>
[30/Oct/2018 13:30:53] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:30:56] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:30:56] INFO [mysite:138] hi
[30/Oct/2018 13:30:56] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, '...(remaining elements truncated)...']>
[30/Oct/2018 13:30:56] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: [>, <Tag: <>, <Tag: T>, <Tag: a>, <Tag: g>, <Tag: :>, <Tag: >, <Tag: h>, <Tag: i>, <Tag: >>, <Tag: ,>, <Tag: f>, <Tag: r>, <Tag: s>, <Tag: t>, <Tag: e>, <Tag: b>, <Tag: y>, <Tag: n>, <Tag: c>, <Tag: o>, <Tag: d>, <Tag: ]>]
[30/Oct/2018 13:31:51] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:31:54] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:31:54] INFO [mysite:138] hi
[30/Oct/2018 13:31:54] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:31:54] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:33:15] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:33:17] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:33:17] INFO [mysite:138] hi
[30/Oct/2018 13:33:17] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:33:17] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:33:52] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:33:55] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:33:55] INFO [mysite:138] hi
[30/Oct/2018 13:33:55] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:33:55] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:37:06] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:37:09] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:37:09] INFO [mysite:138] hi
[30/Oct/2018 13:38:31] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:38:34] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:38:34] INFO [mysite:138] hi
[30/Oct/2018 13:38:34] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:38:34] INFO [mysite:149] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>, <Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:38:54] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:38:57] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:38:57] INFO [mysite:138] hi
[30/Oct/2018 13:38:57] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:38:57] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:39:21] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:39:25] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:39:25] INFO [mysite:138] hi
[30/Oct/2018 13:39:25] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:39:25] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:39:40] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:39:43] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:39:43] INFO [mysite:138] hi
[30/Oct/2018 13:39:43] INFO [mysite:146] <QuerySet [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]>
[30/Oct/2018 13:39:43] INFO [mysite:147] [<Tag: hi>, <Tag: first>, <Tag: test>, <Tag: bayern>, <Tag: second>]
[30/Oct/2018 13:40:10] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:40:12] INFO [mysite:135] CustomUser object (2)
[30/Oct/2018 13:40:12] INFO [mysite:138] hi
[30/Oct/2018 13:40:34] INFO [mysite:135] CustomUser object (2)
Binary file not shown.

After

Width:  |  Height:  |  Size: 557 KiB

+9 -14
View File
@@ -13,7 +13,6 @@ https://docs.djangoproject.com/en/2.0/ref/settings/
import os
import re
import socket
import djcelery
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -44,14 +43,12 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'application',
'taggit',
'taggit_templatetags2',
'djcelery',
'kombu.transport.django',
'sorl.thumbnail',
'newsletter',
'post_office',
'hitcount',
]
MIDDLEWARE = [
@@ -257,13 +254,11 @@ if DEBUG:
'INTERCEPT_REDIRECTS': False,
}
# Celery settings
BROKER_URL = 'django://'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
djcelery.setup_loader()
EMAIL_BACKEND = 'post_office.EmailBackend'
SITE_ID = 1
EMAIL_HOST = 'smtp.web.de'
EMAIL_HOST_USER = "esther.kleinhenz@web.de"
EMAIL_PORT = 25 # default smtp port
EMAIL_HOST_PASSWORD = "2mSchneeinMikkeli"
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'your.generic.test.email@web.de'
+36
View File
@@ -0,0 +1,36 @@
altgraph==0.10.2
astroid==1.6.4
autopep8==1.3.5
backports-abc==0.5
backports.functools-lru-cache==1.5
bdist-mpkg==0.5.0
configparser==3.5.0
Django==1.11.15
django-classy-tags==0.8.0
django-taggit==0.23.0
django-taggit-templatetags2==1.6.1
enum34==1.1.6
futures==3.1.1
isort==4.3.4
lazy-object-proxy==1.3.1
macholib==1.5.1
mccabe==0.6.1
modulegraph==0.10.4
mysql-connector-python==8.0.12
nose==1.3.7
numpy==1.8.2
protobuf==3.6.1
py2app==0.7.3
pyasn1==0.4.4
pyasn1-modules==0.2.2
pycodestyle==2.4.0
pylint==1.9.1
pyparsing==2.0.1
python-dateutil==1.5
python-ldap==3.1.0
pytz==2013.7
scipy==1.1.0
singledispatch==3.4.0.3
six==1.11.0
tornado==5.1
wrapt==1.10.11
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
# Start Gunicorn processes
python3 manage.py runserver
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_beat
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_beat())
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_worker
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_worker())
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from celery.__main__ import _compat_multi
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(_compat_multi())
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'python-card-me==0.9.3','console_scripts','change_tz'
__requires__ = 'python-card-me==0.9.3'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('python-card-me==0.9.3', 'console_scripts', 'change_tz')()
)
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from chardet.cli.chardetect import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from ZODB.FileStorage.fsdump import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from ZODB.scripts.fsoids import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from ZODB.scripts.fstail import Main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(Main())
@@ -4,8 +4,8 @@
import re
import sys
from ZConfig.validator import main
from gunicorn.app.wsgiapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
sys.exit(run())
@@ -4,8 +4,8 @@
import re
import sys
from ZODB.scripts.fsrefs import main
from gunicorn.app.djangoapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
sys.exit(run())
@@ -4,8 +4,8 @@
import re
import sys
from celery.__main__ import main
from gunicorn.app.pasterapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
sys.exit(run())
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'python-card-me==0.9.3','console_scripts','ics_diff'
__requires__ = 'python-card-me==0.9.3'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('python-card-me==0.9.3', 'console_scripts', 'ics_diff')()
)
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from ZODB.scripts.repozo import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'ZEO==5.2.0','console_scripts','runzeo'
__requires__ = 'ZEO==5.2.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('ZEO==5.2.0', 'console_scripts', 'runzeo')()
)
-17
View File
@@ -1,17 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
from surlex import Surlex
import sys
from optparse import OptionParser
def main():
parser = OptionParser()
parser.set_usage('surlex2regex.py <surlex>')
if len(sys.argv) == 1:
argv = ['-h']
else:
argv = sys.argv[1:]
options, args = parser.parse_args(argv)
print (Surlex(args[0]).translate())
if __name__ == '__main__':
main()
BIN
View File
Binary file not shown.
-11
View File
@@ -1,11 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from ZConfig.schema2html import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'zdaemon==4.2.0','console_scripts','zdaemon'
__requires__ = 'zdaemon==4.2.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('zdaemon==4.2.0', 'console_scripts', 'zdaemon')()
)
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'ZEO==5.2.0','console_scripts','zeo-nagios'
__requires__ = 'ZEO==5.2.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('ZEO==5.2.0', 'console_scripts', 'zeo-nagios')()
)
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'ZEO==5.2.0','console_scripts','zeoctl'
__requires__ = 'ZEO==5.2.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('ZEO==5.2.0', 'console_scripts', 'zeoctl')()
)
-12
View File
@@ -1,12 +0,0 @@
#!/Users/Esthi/thesis_ek/thesisenv/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'ZEO==5.2.0','console_scripts','zeopack'
__requires__ = 'ZEO==5.2.0'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('ZEO==5.2.0', 'console_scripts', 'zeopack')()
)
@@ -1,156 +0,0 @@
/*****************************************************************************
Copyright (c) 2001, 2002 Zope Foundation and Contributors.
All Rights Reserved.
This software is subject to the provisions of the Zope Public License,
Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
FOR A PARTICULAR PURPOSE
****************************************************************************/
#ifndef CPERSISTENCE_H
#define CPERSISTENCE_H
#include "_compat.h"
#include "bytesobject.h"
#include "ring.h"
#define CACHE_HEAD \
PyObject_HEAD \
CPersistentRing ring_home; \
int non_ghost_count; \
Py_ssize_t total_estimated_size;
struct ccobject_head_struct;
typedef struct ccobject_head_struct PerCache;
/* How big is a persistent object?
12 PyGC_Head is two pointers and an int
8 PyObject_HEAD is an int and a pointer
12 jar, oid, cache pointers
8 ring struct
8 serialno
4 state + extra
4 size info
(56) so far
4 dict ptr
4 weaklist ptr
-------------------------
68 only need 62, but obmalloc rounds up to multiple of eight
Even a ghost requires 64 bytes. It's possible to make a persistent
instance with slots and no dict, which changes the storage needed.
*/
#define cPersistent_HEAD \
PyObject_HEAD \
PyObject *jar; \
PyObject *oid; \
PerCache *cache; \
CPersistentRing ring; \
char serial[8]; \
signed state:8; \
unsigned estimated_size:24;
/* We recently added estimated_size. We originally added it as a new
unsigned long field after a signed char state field and a
3-character reserved field. This didn't work because there
are packages in the wild that have their own copies of cPersistence.h
that didn't see the update.
To get around this, we used the reserved space by making
estimated_size a 24-bit bit field in the space occupied by the old
3-character reserved field. To fit in 24 bits, we made the units
of estimated_size 64-character blocks. This allows is to handle up
to a GB. We should never see that, but to be paranoid, we also
truncate sizes greater than 1GB. We also set the minimum size to
64 bytes.
We use the _estimated_size_in_24_bits and _estimated_size_in_bytes
macros both to avoid repetition and to make intent a little clearer.
*/
#define _estimated_size_in_24_bits(I) ((I) > 1073741696 ? 16777215 : (I)/64+1)
#define _estimated_size_in_bytes(I) ((I)*64)
#define cPersistent_GHOST_STATE -1
#define cPersistent_UPTODATE_STATE 0
#define cPersistent_CHANGED_STATE 1
#define cPersistent_STICKY_STATE 2
typedef struct {
cPersistent_HEAD
} cPersistentObject;
typedef void (*percachedelfunc)(PerCache *, PyObject *);
typedef struct {
PyTypeObject *pertype;
getattrofunc getattro;
setattrofunc setattro;
int (*changed)(cPersistentObject*);
void (*accessed)(cPersistentObject*);
void (*ghostify)(cPersistentObject*);
int (*setstate)(PyObject*);
percachedelfunc percachedel;
int (*readCurrent)(cPersistentObject*);
} cPersistenceCAPIstruct;
#define cPersistenceType cPersistenceCAPI->pertype
#ifndef DONT_USE_CPERSISTENCECAPI
static cPersistenceCAPIstruct *cPersistenceCAPI;
#endif
#define cPersistanceModuleName "cPersistence"
#define PER_TypeCheck(O) PyObject_TypeCheck((O), cPersistenceCAPI->pertype)
#define PER_USE_OR_RETURN(O,R) {if((O)->state==cPersistent_GHOST_STATE && cPersistenceCAPI->setstate((PyObject*)(O)) < 0) return (R); else if ((O)->state==cPersistent_UPTODATE_STATE) (O)->state=cPersistent_STICKY_STATE;}
#define PER_CHANGED(O) (cPersistenceCAPI->changed((cPersistentObject*)(O)))
#define PER_READCURRENT(O, E) \
if (cPersistenceCAPI->readCurrent((cPersistentObject*)(O)) < 0) { E; }
#define PER_GHOSTIFY(O) (cPersistenceCAPI->ghostify((cPersistentObject*)(O)))
/* If the object is sticky, make it non-sticky, so that it can be ghostified.
The value is not meaningful
*/
#define PER_ALLOW_DEACTIVATION(O) ((O)->state==cPersistent_STICKY_STATE && ((O)->state=cPersistent_UPTODATE_STATE))
#define PER_PREVENT_DEACTIVATION(O) ((O)->state==cPersistent_UPTODATE_STATE && ((O)->state=cPersistent_STICKY_STATE))
/*
Make a persistent object usable from C by:
- Making sure it is not a ghost
- Making it sticky.
IMPORTANT: If you call this and don't call PER_ALLOW_DEACTIVATION,
your object will not be ghostified.
PER_USE returns a 1 on success and 0 failure, where failure means
error.
*/
#define PER_USE(O) \
(((O)->state != cPersistent_GHOST_STATE \
|| (cPersistenceCAPI->setstate((PyObject*)(O)) >= 0)) \
? (((O)->state==cPersistent_UPTODATE_STATE) \
? ((O)->state=cPersistent_STICKY_STATE) : 1) : 0)
#define PER_ACCESSED(O) (cPersistenceCAPI->accessed((cPersistentObject*)(O)))
#endif
@@ -1,66 +0,0 @@
/*****************************************************************************
Copyright (c) 2003 Zope Foundation and Contributors.
All Rights Reserved.
This software is subject to the provisions of the Zope Public License,
Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
FOR A PARTICULAR PURPOSE
****************************************************************************/
/* Support routines for the doubly-linked list of cached objects.
The cache stores a headed, doubly-linked, circular list of persistent
objects, with space for the pointers allocated in the objects themselves.
The cache stores the distinguished head of the list, which is not a valid
persistent object. The other list members are non-ghost persistent
objects, linked in LRU (least-recently used) order.
The r_next pointers traverse the ring starting with the least recently used
object. The r_prev pointers traverse the ring starting with the most
recently used object.
Obscure: While each object is pointed at twice by list pointers (once by
its predecessor's r_next, again by its successor's r_prev), the refcount
on the object is bumped only by 1. This leads to some possibly surprising
sequences of incref and decref code. Note that since the refcount is
bumped at least once, the list does hold a strong reference to each
object in it.
*/
typedef struct CPersistentRing_struct
{
struct CPersistentRing_struct *r_prev;
struct CPersistentRing_struct *r_next;
} CPersistentRing;
/* The list operations here take constant time independent of the
* number of objects in the list:
*/
/* Add elt as the most recently used object. elt must not already be
* in the list, although this isn't checked.
*/
void ring_add(CPersistentRing *ring, CPersistentRing *elt);
/* Remove elt from the list. elt must already be in the list, although
* this isn't checked.
*/
void ring_del(CPersistentRing *elt);
/* elt must already be in the list, although this isn't checked. It's
* unlinked from its current position, and relinked into the list as the
* most recently used object (which is arguably the tail of the list
* instead of the head -- but the name of this function could be argued
* either way). This is equivalent to
*
* ring_del(elt);
* ring_add(ring, elt);
*
* but may be a little quicker.
*/
void ring_move_to_head(CPersistentRing *ring, CPersistentRing *elt);
@@ -1,59 +0,0 @@
#ifndef _proxy_H_
#define _proxy_H_ 1
typedef struct {
PyObject_HEAD
PyObject *proxy_object;
} ProxyObject;
#define Proxy_GET_OBJECT(ob) (((ProxyObject *)(ob))->proxy_object)
typedef struct {
PyTypeObject *proxytype;
int (*check)(PyObject *obj);
PyObject *(*create)(PyObject *obj);
PyObject *(*getobject)(PyObject *proxy);
} ProxyInterface;
#ifndef PROXY_MODULE
/* These are only defined in the public interface, and are not
* available within the module implementation. There we use the
* classic Python/C API only.
*/
static ProxyInterface *_proxy_api = NULL;
static int
Proxy_Import(void)
{
if (_proxy_api == NULL) {
PyObject *m = PyImport_ImportModule("zope.proxy");
if (m != NULL) {
PyObject *tmp = PyObject_GetAttrString(m, "_CAPI");
if (tmp != NULL) {
#if PY_VERSION_HEX < 0x02070000
if (PyCObject_Check(tmp))
_proxy_api = (ProxyInterface *)
PyCObject_AsVoidPtr(tmp);
#else
if (PyCapsule_CheckExact(tmp))
_proxy_api = (ProxyInterface *)
PyCapsule_GetPointer(tmp, NULL);
#endif
Py_DECREF(tmp);
}
}
}
return (_proxy_api == NULL) ? -1 : 0;
}
#define ProxyType (*_proxy_api->proxytype)
#define Proxy_Check(obj) (_proxy_api->check((obj)))
#define Proxy_CheckExact(obj) ((obj)->ob_type == ProxyType)
#define Proxy_New(obj) (_proxy_api->create((obj)))
#define Proxy_GetObject(proxy) (_proxy_api->getobject((proxy)))
#endif /* PROXY_MODULE */
#endif /* _proxy_H_ */
@@ -1,697 +0,0 @@
Metadata-Version: 1.1
Name: Acquisition
Version: 4.5
Summary: Acquisition is a mechanism that allows objects to obtain attributes from the containment hierarchy they're in.
Home-page: https://github.com/zopefoundation/Acquisition
Author: Zope Foundation and Contributors
Author-email: zope-dev@zope.org
License: ZPL 2.1
Description: Environmental Acquisiton
========================
This package implements "environmental acquisiton" for Python, as
proposed in the OOPSLA96_ paper by Joseph Gil and David H. Lorenz:
We propose a new programming paradigm, environmental acquisition in
the context of object aggregation, in which objects acquire
behaviour from their current containers at runtime. The key idea is
that the behaviour of a component may depend upon its enclosing
composite(s). In particular, we propose a form of feature sharing in
which an object "inherits" features from the classes of objects in
its environment. By examining the declaration of classes, it is
possible to determine which kinds of classes may contain a
component, and which components must be contained in a given kind of
composite. These relationships are the basis for language constructs
that supports acquisition.
.. _OOPSLA96: http://www.cs.virginia.edu/~lorenz/papers/oopsla96/>`_:
.. contents::
Introductory Example
--------------------
Zope implements acquisition with "Extension Class" mix-in classes. To
use acquisition your classes must inherit from an acquisition base
class. For example::
>>> import ExtensionClass, Acquisition
>>> class C(ExtensionClass.Base):
... color = 'red'
>>> class A(Acquisition.Implicit):
... def report(self):
... print(self.color)
...
>>> a = A()
>>> c = C()
>>> c.a = a
>>> c.a.report()
red
>>> d = C()
>>> d.color = 'green'
>>> d.a = a
>>> d.a.report()
green
>>> try:
... a.report()
... except AttributeError:
... pass
... else:
... raise AssertionError('AttributeError not raised.')
The class ``A`` inherits acquisition behavior from
``Acquisition.Implicit``. The object, ``a``, "has" the color of
objects ``c`` and d when it is accessed through them, but it has no
color by itself. The object ``a`` obtains attributes from its
environment, where its environment is defined by the access path used
to reach ``a``.
Acquisition Wrappers
--------------------
When an object that supports acquisition is accessed through an
extension class instance, a special object, called an acquisition
wrapper, is returned. In the example above, the expression ``c.a``
returns an acquisition wrapper that contains references to both ``c``
and ``a``. It is this wrapper that performs attribute lookup in ``c``
when an attribute cannot be found in ``a``.
Acquisition wrappers provide access to the wrapped objects through the
attributes ``aq_parent``, ``aq_self``, ``aq_base``. Continue the
example from above::
>>> c.a.aq_parent is c
True
>>> c.a.aq_self is a
True
Explicit and Implicit Acquisition
---------------------------------
Two styles of acquisition are supported: implicit and explicit
acquisition.
Implicit acquisition
--------------------
Implicit acquisition is so named because it searches for attributes
from the environment automatically whenever an attribute cannot be
obtained directly from an object or through inheritance.
An attribute can be implicitly acquired if its name does not begin
with an underscore.
To support implicit acquisition, your class should inherit from the
mix-in class ``Acquisition.Implicit``.
Explicit Acquisition
--------------------
When explicit acquisition is used, attributes are not automatically
obtained from the environment. Instead, the method aq_acquire must be
used. For example::
>>> print(c.a.aq_acquire('color'))
red
To support explicit acquisition, your class should inherit from the
mix-in class ``Acquisition.Explicit``.
Controlling Acquisition
-----------------------
A class (or instance) can provide attribute by attribute control over
acquisition. Your should subclass from ``Acquisition.Explicit``, and set
all attributes that should be acquired to the special value
``Acquisition.Acquired``. Setting an attribute to this value also allows
inherited attributes to be overridden with acquired ones. For example::
>>> class C(Acquisition.Explicit):
... id = 1
... secret = 2
... color = Acquisition.Acquired
... __roles__ = Acquisition.Acquired
The only attributes that are automatically acquired from containing
objects are color, and ``__roles__``. Note that the ``__roles__``
attribute is acquired even though its name begins with an
underscore. In fact, the special ``Acquisition.Acquired`` value can be
used in ``Acquisition.Implicit`` objects to implicitly acquire
selected objects that smell like private objects.
Sometimes, you want to dynamically make an implicitly acquiring object
acquire explicitly. You can do this by getting the object's
aq_explicit attribute. This attribute provides the object with an
explicit wrapper that replaces the original implicit wrapper.
Filtered Acquisition
--------------------
The acquisition method, ``aq_acquire``, accepts two optional
arguments. The first of the additional arguments is a "filtering"
function that is used when considering whether to acquire an
object. The second of the additional arguments is an object that is
passed as extra data when calling the filtering function and which
defaults to ``None``. The filter function is called with five
arguments:
* The object that the aq_acquire method was called on,
* The object where an object was found,
* The name of the object, as passed to aq_acquire,
* The object found, and
* The extra data passed to aq_acquire.
If the filter returns a true object that the object found is returned,
otherwise, the acquisition search continues.
Here's an example::
>>> from Acquisition import Explicit
>>> class HandyForTesting(object):
... def __init__(self, name):
... self.name = name
... def __str__(self):
... return "%s(%s)" % (self.name, self.__class__.__name__)
... __repr__=__str__
...
>>> class E(Explicit, HandyForTesting): pass
...
>>> class Nice(HandyForTesting):
... isNice = 1
... def __str__(self):
... return HandyForTesting.__str__(self)+' and I am nice!'
... __repr__ = __str__
...
>>> a = E('a')
>>> a.b = E('b')
>>> a.b.c = E('c')
>>> a.p = Nice('spam')
>>> a.b.p = E('p')
>>> def find_nice(self, ancestor, name, object, extra):
... return hasattr(object,'isNice') and object.isNice
>>> print(a.b.c.aq_acquire('p', find_nice))
spam(Nice) and I am nice!
The filtered acquisition in the last line skips over the first
attribute it finds with the name ``p``, because the attribute doesn't
satisfy the condition given in the filter.
Filtered acquisition is rarely used in Zope.
Acquiring from Context
----------------------
Normally acquisition allows objects to acquire data from their
containers. However an object can acquire from objects that aren't its
containers.
Most of the examples we've seen so far show establishing of an
acquisition context using getattr semantics. For example, ``a.b`` is a
reference to ``b`` in the context of ``a``.
You can also manually set acquisition context using the ``__of__``
method. For example::
>>> from Acquisition import Implicit
>>> class C(Implicit): pass
...
>>> a = C()
>>> b = C()
>>> a.color = "red"
>>> print(b.__of__(a).color)
red
In this case, ``a`` does not contain ``b``, but it is put in ``b``'s
context using the ``__of__`` method.
Here's another subtler example that shows how you can construct an
acquisition context that includes non-container objects::
>>> from Acquisition import Implicit
>>> class C(Implicit):
... def __init__(self, name):
... self.name = name
>>> a = C("a")
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")
>>> print(a.b.x.color)
red
Even though ``b`` does not contain ``x``, ``x`` can acquire the color
attribute from ``b``. This works because in this case, ``x`` is accessed
in the context of ``b`` even though it is not contained by ``b``.
Here acquisition context is defined by the objects used to access
another object.
Containment Before Context
--------------------------
If in the example above suppose both a and b have an color attribute::
>>> a = C("a")
>>> a.color = "green"
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")
>>> print(a.b.x.color)
green
Why does ``a.b.x.color`` acquire color from ``a`` and not from ``b``?
The answer is that an object acquires from its containers before
non-containers in its context.
To see why consider this example in terms of expressions using the
``__of__`` method::
a.x -> x.__of__(a)
a.b -> b.__of__(a)
a.b.x -> x.__of__(a).__of__(b.__of__(a))
Keep in mind that attribute lookup in a wrapper is done by trying to
look up the attribute in the wrapped object first and then in the
parent object. So in the expressions above proceeds from left to
right.
The upshot of these rules is that attributes are looked up by
containment before context.
This rule holds true also for more complex examples. For example,
``a.b.c.d.e.f.g.attribute`` would search for attribute in ``g`` and
all its containers first. (Containers are searched in order from the
innermost parent to the outermost container.) If the attribute is not
found in ``g`` or any of its containers, then the search moves to
``f`` and all its containers, and so on.
Additional Attributes and Methods
---------------------------------
You can use the special method ``aq_inner`` to access an object
wrapped only by containment. So in the example above,
``a.b.x.aq_inner`` is equivalent to ``a.x``.
You can find out the acquisition context of an object using the
aq_chain method like so:
>>> [obj.name for obj in a.b.x.aq_chain]
['x', 'b', 'a']
You can find out if an object is in the containment context of another
object using the ``aq_inContextOf`` method. For example:
>>> a.b.aq_inContextOf(a)
True
.. Note: as of this writing the aq_inContextOf examples don't work the
way they should be working. According to Jim, this is because
aq_inContextOf works by comparing object pointer addresses, which
(because they are actually different wrapper objects) doesn't give
you the expected results. He acknowledges that this behavior is
controversial, and says that there is a collector entry to change
it so that you would get the answer you expect in the above. (We
just need to get to it).
Acquisition Module Functions
----------------------------
In addition to using acquisition attributes and methods directly on
objects you can use similar functions defined in the ``Acquisition``
module. These functions have the advantage that you don't need to
check to make sure that the object has the method or attribute before
calling it.
``aq_acquire(object, name [, filter, extra, explicit, default, containment])``
Acquires an object with the given name.
This function can be used to explictly acquire when using explicit
acquisition and to acquire names that wouldn't normally be
acquired.
The function accepts a number of optional arguments:
``filter``
A callable filter object that is used to decide if an object
should be acquired.
The filter is called with five arguments:
* The object that the aq_acquire method was called on,
* The object where an object was found,
* The name of the object, as passed to aq_acquire,
* The object found, and
* The extra argument passed to aq_acquire.
If the filter returns a true object that the object found is
returned, otherwise, the acquisition search continues.
``extra``
Extra data to be passed as the last argument to the filter.
``explicit``
A flag (boolean value) indicating whether explicit acquisition
should be used. The default value is true. If the flag is
true, then acquisition will proceed regardless of whether
wrappers encountered in the search of the acquisition
hierarchy are explicit or implicit wrappers. If the flag is
false, then parents of explicit wrappers are not searched.
This argument is useful if you want to apply a filter without
overriding explicit wrappers.
``default``
A default value to return if no value can be acquired.
``containment``
A flag indicating whether the search should be limited to the
containment hierarchy.
In addition, arguments can be provided as keywords.
``aq_base(object)``
Return the object with all wrapping removed.
``aq_chain(object [, containment])``
Return a list containing the object and it's acquisition
parents. The optional argument, containment, controls whether the
containment or access hierarchy is used.
``aq_get(object, name [, default, containment])``
Acquire an attribute, name. A default value can be provided, as
can a flag that limits search to the containment hierarchy.
``aq_inner(object)``
Return the object with all but the innermost layer of wrapping
removed.
``aq_parent(object)``
Return the acquisition parent of the object or None if the object
is unwrapped.
``aq_self(object)``
Return the object with one layer of wrapping removed, unless the
object is unwrapped, in which case the object is returned.
In most cases it is more convenient to use these module functions
instead of the acquisition attributes and methods directly.
Acquisition and Methods
-----------------------
Python methods of objects that support acquisition can use acquired
attributes. When a Python method is called on an object that is
wrapped by an acquisition wrapper, the wrapper is passed to the method
as the first argument. This rule also applies to user-defined method
types and to C methods defined in pure mix-in classes.
Unfortunately, C methods defined in extension base classes that define
their own data structures, cannot use aquired attributes at this
time. This is because wrapper objects do not conform to the data
structures expected by these methods. In practice, you will seldom
find this a problem.
Conclusion
----------
Acquisition provides a powerful way to dynamically share information
between objects. Zope 2 uses acquisition for a number of its key
features including security, object publishing, and DTML variable
lookup. Acquisition also provides an elegant solution to the problem
of circular references for many classes of problems. While acquisition
is powerful, you should take care when using acquisition in your
applications. The details can get complex, especially with the
differences between acquiring from context and acquiring from
containment.
Changelog
=========
4.5 (2018-10-05)
----------------
- Avoid deprecation warnings by using current API.
- Add support for Python 3.7.
4.4.4 (2017-11-24)
------------------
- Add Appveyor configuration to automate building Windows eggs.
4.4.3 (2017-11-23)
------------------
- Fix the extremely rare potential for a crash when the C extensions
are in use. See `issue 21 <https://github.com/zopefoundation/Acquisition/issues/21>`_.
4.4.2 (2017-05-12)
------------------
- Fix C capsule name to fix import errors.
- Ensure our dependencies match our expactations about C extensions.
4.4.1 (2017-05-04)
------------------
- Fix C code under Python 3.4, with missing Py_XSETREF.
4.4.0 (2017-05-04)
------------------
- Enable the C extension under Python 3.
- Drop support for Python 3.3.
4.3.0 (2017-01-20)
------------------
- Make tests compatible with ExtensionClass 4.2.0.
- Drop support for Python 2.6 and 3.2.
- Add support for Python 3.5 and 3.6.
4.2.2 (2015-05-19)
------------------
- Make the pure-Python Acquirer objects cooperatively use the
superclass ``__getattribute__`` method, like the C implementation.
See https://github.com/zopefoundation/Acquisition/issues/7.
- The pure-Python implicit acquisition wrapper allows wrapped objects
to use ``object.__getattribute__(self, name)``. This differs from
the C implementation, but is important for compatibility with the
pure-Python versions of libraries like ``persistent``. See
https://github.com/zopefoundation/Acquisition/issues/9.
4.2.1 (2015-04-23)
------------------
- Correct several dangling pointer uses in the C extension,
potentially fixing a few interpreter crashes. See
https://github.com/zopefoundation/Acquisition/issues/5.
4.2 (2015-04-04)
----------------
- Add support for PyPy, PyPy3, and Python 3.2, 3.3, and 3.4.
4.1 (2014-12-18)
----------------
- Bump dependency on ``ExtensionClass`` to match current release.
4.0.3 (2014-11-02)
------------------
- Skip readme.rst tests when tests are run outside a source checkout.
4.0.2 (2014-11-02)
------------------
- Include ``*.rst`` files in the release.
4.0.1 (2014-10-30)
------------------
- Tolerate Unicode attribute names (ASCII only). LP #143358.
- Make module-level ``aq_acquire`` API respect the ``default`` parameter.
LP #1387363.
- Don't raise an attribute error for ``__iter__`` if the fallback to
``__getitem__`` succeeds. LP #1155760.
4.0 (2013-02-24)
----------------
- Added trove classifiers to project metadata.
4.0a1 (2011-12-13)
------------------
- Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object
with a `__parent__` pointer points to a wrapper that in turn points to the
original object.
- Prevent wrappers to be created while accessing `__parent__` on types derived
from Explicit or Implicit base classes.
2.13.9 (2015-02-17)
-------------------
- Tolerate Unicode attribute names (ASCII only). LP #143358.
- Make module-level ``aq_acquire`` API respect the ``default`` parameter.
LP #1387363.
- Don't raise an attribute error for ``__iter__`` if the fallback to
``__getitem__`` succeeds. LP #1155760.
2.13.8 (2011-06-11)
-------------------
- Fixed a segfault on 64bit platforms when providing the `explicit` argument to
the aq_acquire method of an Acquisition wrapper. Thx to LP #675064 for the
hint to the solution. The code passed an int instead of a pointer into a
function.
2.13.7 (2011-03-02)
-------------------
- Fixed bug: When an object did not implement ``__unicode__``, calling
``unicode(wrapped)`` was calling ``__str__`` with an unwrapped ``self``.
2.13.6 (2011-02-19)
-------------------
- Add ``aq_explicit`` to ``IAcquisitionWrapper``.
- Fixed bug: ``unicode(wrapped)`` was not calling a ``__unicode__``
method on wrapped objects.
2.13.5 (2010-09-29)
-------------------
- Fixed unit tests that failed on 64bit Python on Windows machines.
2.13.4 (2010-08-31)
-------------------
- LP 623665: Fixed typo in Acquisition.h.
2.13.3 (2010-04-19)
-------------------
- Use the doctest module from the standard library and no longer depend on
zope.testing.
2.13.2 (2010-04-04)
-------------------
- Give both wrapper classes a ``__getnewargs__`` method, which causes the ZODB
optimization to fail and create persistent references using the ``_p_oid``
alone. This happens to be the persistent oid of the wrapped object. This lets
these objects to be persisted correctly, even though they are passed to the
ZODB in a wrapped state.
- Added failing tests for http://dev.plone.org/plone/ticket/10318. This shows
an edge-case where AQ wrappers can be pickled using the specific combination
of cPickle, pickle protocol one and a custom Pickler class with an
``inst_persistent_id`` hook. Unfortunately this is the exact combination used
by ZODB3.
2.13.1 (2010-02-23)
-------------------
- Update to include ExtensionClass 2.13.0.
- Fix the ``tp_name`` of the ImplicitAcquisitionWrapper and
ExplicitAcquisitionWrapper to match their Python visible names and thus have
a correct ``__name__``.
- Expand the ``tp_name`` of our extension types to hold the fully qualified
name. This ensures classes have their ``__module__`` set correctly.
2.13.0 (2010-02-14)
-------------------
- Added support for method cache in Acquisition. Patch contributed by
Yoshinori K. Okuji. See https://bugs.launchpad.net/zope2/+bug/486182.
2.12.4 (2009-10-29)
-------------------
- Fix iteration proxying to pass `self` acquisition-wrapped into both
`__iter__` as well as `__getitem__` (this fixes
https://bugs.launchpad.net/zope2/+bug/360761).
- Add tests for the __getslice__ proxying, including open-ended slicing.
2.12.3 (2009-08-08)
-------------------
- More 64-bit fixes in Py_BuildValue calls.
- More 64-bit issues fixed: Use correct integer size for slice operations.
2.12.2 (2009-08-02)
-------------------
- Fixed 64-bit compatibility issues for Python 2.5.x / 2.6.x. See
http://www.python.org/dev/peps/pep-0353/ for details.
2.12.1 (2009-04-15)
-------------------
- Update for iteration proxying: The proxy for `__iter__` must not rely on the
object to have an `__iter__` itself, but also support fall-back iteration via
`__getitem__` (this fixes https://bugs.launchpad.net/zope2/+bug/360761).
2.12 (2009-01-25)
-----------------
- Release as separate package.
Platform: UNKNOWN
Classifier: Development Status :: 6 - Mature
Classifier: Environment :: Web Environment
Classifier: Framework :: Zope2
Classifier: License :: OSI Approved :: Zope Public License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -1,25 +0,0 @@
.coveragerc
.gitignore
CHANGES.rst
COPYRIGHT.txt
LICENSE.txt
MANIFEST.in
README.rst
buildout.cfg
pip-delete-this-directory.txt
setup.cfg
setup.py
tox.ini
include/ExtensionClass/ExtensionClass.h
include/ExtensionClass/_compat.h
src/Acquisition/Acquisition.h
src/Acquisition/_Acquisition.c
src/Acquisition/__init__.py
src/Acquisition/interfaces.py
src/Acquisition/tests.py
src/Acquisition.egg-info/PKG-INFO
src/Acquisition.egg-info/SOURCES.txt
src/Acquisition.egg-info/dependency_links.txt
src/Acquisition.egg-info/not-zip-safe
src/Acquisition.egg-info/requires.txt
src/Acquisition.egg-info/top_level.txt
@@ -1,15 +0,0 @@
../Acquisition/Acquisition.h
../Acquisition/_Acquisition.c
../Acquisition/_Acquisition.cpython-36m-darwin.so
../Acquisition/__init__.py
../Acquisition/__pycache__/__init__.cpython-36.pyc
../Acquisition/__pycache__/interfaces.cpython-36.pyc
../Acquisition/__pycache__/tests.cpython-36.pyc
../Acquisition/interfaces.py
../Acquisition/tests.py
PKG-INFO
SOURCES.txt
dependency_links.txt
not-zip-safe
requires.txt
top_level.txt
@@ -1,2 +0,0 @@
ExtensionClass>=4.2.0
zope.interface
@@ -1,53 +0,0 @@
/*****************************************************************************
Copyright (c) 1996-2002 Zope Foundation and Contributors.
All Rights Reserved.
This software is subject to the provisions of the Zope Public License,
Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
FOR A PARTICULAR PURPOSE
****************************************************************************/
#ifndef __ACQUISITION_H_
#define __ACQUISITION_H_
typedef struct {
PyObject *(*AQ_Acquire) (PyObject *obj, PyObject *name, PyObject *filter,
PyObject *extra, int explicit, PyObject *deflt,
int containment);
PyObject *(*AQ_Get) (PyObject *obj, PyObject *name, PyObject *deflt,
int containment);
int (*AQ_IsWrapper) (PyObject *obj);
PyObject *(*AQ_Base) (PyObject *obj);
PyObject *(*AQ_Parent) (PyObject *obj);
PyObject *(*AQ_Self) (PyObject *obj);
PyObject *(*AQ_Inner) (PyObject *obj);
PyObject *(*AQ_Chain) (PyObject *obj, int containment);
} ACQUISITIONCAPI;
#ifndef _IN_ACQUISITION_C
#define aq_Acquire(obj, name, filter, extra, explicit, deflt, containment ) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Acquire(obj, name, filter, extra, explicit, deflt, containment)))
#define aq_acquire(obj, name) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Acquire(obj, name, NULL, NULL, 1, NULL, 0)))
#define aq_get(obj, name, deflt, containment) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Get(obj, name, deflt, containment)))
#define aq_isWrapper(obj) (AcquisitionCAPI == NULL ? -1 : (AcquisitionCAPI->AQ_IsWrapper(obj)))
#define aq_base(obj) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Base(obj)))
#define aq_parent(obj) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Parent(obj)))
#define aq_self(obj) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Self(obj)))
#define aq_inner(obj) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_Inner(obj)))
#define aq_chain(obj, containment) (AcquisitionCAPI == NULL ? NULL : (AcquisitionCAPI->AQ_CHain(obj, containment)))
static ACQUISITIONCAPI *AcquisitionCAPI = NULL;
#define aq_init() { \
AcquisitionCAPI = PyCapsule_Import("Acquisition.AcquisitionCAPI", 0); \
}
#endif
#endif
File diff suppressed because it is too large. Load diff
@@ -1,953 +0,0 @@
from __future__ import absolute_import, print_function
# pylint:disable=W0212,R0911,R0912
import os
import operator
import platform
import sys
import types
import weakref
import ExtensionClass
from zope.interface import classImplements
from .interfaces import IAcquirer
from .interfaces import IAcquisitionWrapper
IS_PYPY = getattr(platform, 'python_implementation', lambda: None)() == 'PyPy'
IS_PURE = 'PURE_PYTHON' in os.environ
class Acquired(object):
"Marker for explicit acquisition"
_NOT_FOUND = object() # marker
###
# Helper functions
###
def _has__of__(obj):
"""Check whether an object has an __of__ method for returning itself
in the context of a container."""
# It is necessary to check both the type (or we get into cycles)
# as well as the presence of the method (or mixins of Base pre- or
# post-class-creation as done in, e.g.,
# zopefoundation/Persistence) can fail.
return (isinstance(obj, ExtensionClass.Base) and
hasattr(type(obj), '__of__'))
def _apply_filter(predicate, inst, name, result, extra, orig):
return predicate(orig, inst, name, result, extra)
if sys.version_info < (3,):
import copy_reg
def _rebound_method(method, wrapper):
"""Returns a version of the method with self bound to `wrapper`"""
if isinstance(method, types.MethodType):
method = types.MethodType(method.im_func, wrapper, method.im_class)
return method
exec("""def _reraise(tp, value, tb=None):
raise tp, value, tb
""")
else: # pragma: no cover (python 2 is currently our reference)
import copyreg as copy_reg
def _rebound_method(method, wrapper):
"""Returns a version of the method with self bound to `wrapper`"""
if isinstance(method, types.MethodType):
method = types.MethodType(method.__func__, wrapper)
return method
def _reraise(tp, value, tb=None):
if value is None:
value = tp()
if value.__traceback__ is not tb:
raise value.with_traceback(tb)
raise value
###
# Wrapper object protocol, mostly ported from C directly
###
def _Wrapper_findspecial(wrapper, name):
"""
Looks up the special acquisition attributes of an object.
:param str name: The attribute to find, with 'aq' already stripped.
"""
result = _NOT_FOUND
if name == 'base':
result = wrapper._obj
while isinstance(result, _Wrapper) and result._obj is not None:
result = result._obj
elif name == 'parent':
result = wrapper._container
elif name == 'self':
result = wrapper._obj
elif name == 'explicit':
if type(wrapper)._IS_IMPLICIT:
result = ExplicitAcquisitionWrapper(
wrapper._obj, wrapper._container)
else:
result = wrapper
elif name == 'acquire':
result = object.__getattribute__(wrapper, 'aq_acquire')
elif name == 'chain':
# XXX: C has a second implementation here
result = aq_chain(wrapper)
elif name == 'inContextOf':
result = object.__getattribute__(wrapper, 'aq_inContextOf')
elif name == 'inner':
# XXX: C has a second implementation here
result = aq_inner(wrapper)
elif name == 'uncle':
result = 'Bob'
return result
def _Wrapper_acquire(wrapper, name,
predicate=None, predicate_extra=None,
orig_object=None,
explicit=True, containment=True):
"""
Attempt to acquire the `name` from the parent of the wrapper.
:raises AttributeError: If the wrapper has no parent or the
attribute cannot be found.
"""
if wrapper._container is None:
raise AttributeError(name)
search_self = True
search_parent = True
# If the container has an acquisition wrapper itself, we'll use
# _Wrapper_findattr to progress further
if isinstance(wrapper._container, _Wrapper):
if isinstance(wrapper._obj, _Wrapper):
# try to optimize search by recognizing repeated objects in path
if wrapper._obj._container is wrapper._container._container:
search_parent = False
elif wrapper._obj._container is wrapper._container._obj:
search_self = False
# Don't search the container when the container of the container
# is the same object as `wrapper`
if wrapper._container._container is wrapper._obj:
search_parent = False
containment = True
result = _Wrapper_findattr(wrapper._container, name,
predicate=predicate,
predicate_extra=predicate_extra,
orig_object=orig_object,
search_self=search_self,
search_parent=search_parent,
explicit=explicit,
containment=containment)
# XXX: Why does this branch of the C code check __of__,
# but the next one doesn't?
if _has__of__(result):
result = result.__of__(wrapper)
return result
# If the container has a __parent__ pointer, we create an
# acquisition wrapper for it accordingly. Then we can proceed
# with Wrapper_findattr, just as if the container had an
# acquisition wrapper in the first place (see above).
# NOTE: This mutates the wrapper
elif hasattr(wrapper._container, '__parent__'):
parent = wrapper._container.__parent__
# Don't search the container when the parent of the parent
# is the same object as 'self'
if parent is wrapper._obj:
search_parent = False
elif isinstance(parent, _Wrapper) and parent._obj is wrapper._obj:
# XXX: C code just does parent._obj, assumes its a wrapper
search_parent = False
wrapper._container = ImplicitAcquisitionWrapper(
wrapper._container, parent)
return _Wrapper_findattr(wrapper._container, name,
predicate=predicate,
predicate_extra=predicate_extra,
orig_object=orig_object,
search_self=search_self,
search_parent=search_parent,
explicit=explicit,
containment=containment)
else:
# The container is the end of the acquisition chain; if we
# can't look up the attributes here, we can't look it up at all
result = getattr(wrapper._container, name)
if result is not Acquired:
if predicate:
if _apply_filter(predicate, wrapper._container, name,
result, predicate_extra, orig_object):
return (result.__of__(wrapper)
if _has__of__(result) else result)
else:
raise AttributeError(name)
else:
if _has__of__(result):
result = result.__of__(wrapper)
return result
# this line cannot be reached
raise AttributeError(name) # pragma: no cover
def _Wrapper_findattr(wrapper, name,
predicate=None, predicate_extra=None,
orig_object=None,
search_self=True, search_parent=True,
explicit=True, containment=True):
"""
Search the `wrapper` object for the attribute `name`.
:param bool search_self: Search `wrapper.aq_self` for the attribute.
:param bool search_parent: Search `wrapper.aq_parent` for the attribute.
:param bool explicit: Explicitly acquire the attribute from the parent
(should be assumed with implicit wrapper)
:param bool containment: Use the innermost wrapper (`aq_inner`)
for looking up the attribute.
"""
orig_name = name
if orig_object is None:
orig_object = wrapper
# First, special names
if name.startswith('aq') or name == '__parent__':
# __parent__ is an alias of aq_parent
if name == '__parent__':
name = 'parent'
else:
name = name[3:]
result = _Wrapper_findspecial(wrapper, name)
if result is not _NOT_FOUND:
if predicate:
if _apply_filter(predicate, wrapper, orig_name,
result, predicate_extra, orig_object):
return result
else:
raise AttributeError(orig_name)
return result
elif name in ('__reduce__', '__reduce_ex__', '__getstate__',
'__of__', '__cmp__', '__eq__', '__ne__', '__lt__',
'__le__', '__gt__', '__ge__'):
return object.__getattribute__(wrapper, orig_name)
# If we're doing a containment search, replace the wrapper with aq_inner
if containment:
while isinstance(wrapper._obj, _Wrapper):
wrapper = wrapper._obj
if search_self and wrapper._obj is not None:
if isinstance(wrapper._obj, _Wrapper):
if wrapper is wrapper._obj:
raise RuntimeError("Recursion detected in acquisition wrapper")
try:
result = _Wrapper_findattr(wrapper._obj, orig_name,
predicate=predicate,
predicate_extra=predicate_extra,
orig_object=orig_object,
search_self=True,
search_parent=explicit or isinstance(wrapper._obj, ImplicitAcquisitionWrapper), # NOQA
explicit=explicit,
containment=containment)
if isinstance(result, types.MethodType):
result = _rebound_method(result, wrapper)
elif _has__of__(result):
result = result.__of__(wrapper)
return result
except AttributeError:
pass
# deal with mixed __parent__ / aq_parent circles
elif (isinstance(wrapper._container, _Wrapper) and
wrapper._container._container is wrapper):
raise RuntimeError("Recursion detected in acquisition wrapper")
else:
# normal attribute lookup
try:
result = getattr(wrapper._obj, orig_name)
except AttributeError:
pass
else:
if result is Acquired:
return _Wrapper_acquire(wrapper, orig_name,
predicate=predicate,
predicate_extra=predicate_extra,
orig_object=orig_object,
explicit=True,
containment=containment)
if isinstance(result, types.MethodType):
result = _rebound_method(result, wrapper)
elif _has__of__(result):
result = result.__of__(wrapper)
if predicate:
if _apply_filter(predicate, wrapper, orig_name,
result, predicate_extra, orig_object):
return result
else:
return result
# lookup has failed, acquire from the parent
if search_parent and (not name.startswith('_') or explicit):
return _Wrapper_acquire(wrapper, orig_name,
predicate=predicate,
predicate_extra=predicate_extra,
orig_object=orig_object,
explicit=explicit,
containment=containment)
raise AttributeError(orig_name)
_NOT_GIVEN = object() # marker
_OGA = object.__getattribute__
# Map from object types with slots to their generated, derived
# types (or None if no derived type is needed)
_wrapper_subclass_cache = weakref.WeakKeyDictionary()
def _make_wrapper_subclass_if_needed(cls, obj, container):
# If the type of an object to be wrapped has __slots__, then we
# must create a wrapper subclass that has descriptors for those
# same slots. In this way, its methods that use object.__getattribute__
# directly will continue to work, even when given an instance of _Wrapper
if getattr(cls, '_Wrapper__DERIVED', False):
return None
type_obj = type(obj)
wrapper_subclass = _wrapper_subclass_cache.get(type_obj, _NOT_GIVEN)
if wrapper_subclass is _NOT_GIVEN:
slotnames = copy_reg._slotnames(type_obj)
if slotnames and not isinstance(obj, _Wrapper):
new_type_dict = {'_Wrapper__DERIVED': True}
def _make_property(slotname):
return property(lambda s: getattr(s._obj, slotname),
lambda s, v: setattr(s._obj, slotname, v),
lambda s: delattr(s._obj, slotname))
for slotname in slotnames:
new_type_dict[slotname] = _make_property(slotname)
new_type = type(cls.__name__ + '_' + type_obj.__name__,
(cls,),
new_type_dict)
else:
new_type = None
wrapper_subclass = _wrapper_subclass_cache[type_obj] = new_type
return wrapper_subclass
class _Wrapper(ExtensionClass.Base):
__slots__ = ('_obj', '_container', '__dict__')
_IS_IMPLICIT = None
def __new__(cls, obj, container):
wrapper_subclass = _make_wrapper_subclass_if_needed(cls, obj, container) # NOQA
if wrapper_subclass:
inst = wrapper_subclass(obj, container)
else:
inst = super(_Wrapper, cls).__new__(cls)
inst._obj = obj
inst._container = container
if hasattr(obj, '__dict__') and not isinstance(obj, _Wrapper):
# Make our __dict__ refer to the same dict as the other object,
# so that if it has methods that use `object.__getattribute__`
# they still work. Note that because we have slots,
# we won't interfere with the contents of that dict.
object.__setattr__(inst, '__dict__', obj.__dict__)
return inst
def __init__(self, obj, container):
super(_Wrapper, self).__init__()
self._obj = obj
self._container = container
def __setattr__(self, name, value):
if name == '__parent__' or name == 'aq_parent':
object.__setattr__(self, '_container', value)
return
if name == '_obj' or name == '_container':
# should only happen at init time
object.__setattr__(self, name, value)
return
# If we are wrapping something, unwrap passed in wrappers
if self._obj is None:
raise AttributeError(
'Attempt to set attribute on empty acquisition wrapper')
while value is not None and isinstance(value, _Wrapper):
value = value._obj
setattr(self._obj, name, value)
def __delattr__(self, name):
if name == '__parent__' or name == 'aq_parent':
self._container = None
else:
delattr(self._obj, name)
def __getattribute__(self, name):
if name in ('_obj', '_container'):
return _OGA(self, name)
if (_OGA(self, '_obj') is not None or
_OGA(self, '_container') is not None):
return _Wrapper_findattr(self, name, None, None, None, True,
type(self)._IS_IMPLICIT, False, False)
return _OGA(self, name)
def __of__(self, parent):
# Based on __of__ in the C code;
# simplify a layer of wrapping.
# We have to call the raw __of__ method or we recurse on our
# own lookup (the C code does not have this issue, it can use
# the wrapped __of__ method because it gets here via the
# descriptor code path)...
wrapper = self._obj.__of__(parent)
if (not isinstance(wrapper, _Wrapper) or
not isinstance(wrapper._container, _Wrapper)):
return wrapper
# but the returned wrapper should be based on this object's
# wrapping chain
wrapper._obj = self
while (isinstance(wrapper._obj, _Wrapper) and
(wrapper._obj._container is wrapper._container._obj)):
# Since we mutate the wrapper as we walk up, we must copy
# XXX: This comes from the C implementation. Do we really need to
# copy?
wrapper = type(wrapper)(wrapper._obj, wrapper._container)
wrapper._obj = wrapper._obj._obj
return wrapper
def aq_acquire(self, name,
filter=None, extra=None,
explicit=True,
default=_NOT_GIVEN,
containment=False):
try:
return _Wrapper_findattr(self, name,
predicate=filter,
predicate_extra=extra,
orig_object=self,
search_self=True,
search_parent=explicit or type(self)._IS_IMPLICIT, # NOQA
explicit=explicit,
containment=containment)
except AttributeError:
if default is _NOT_GIVEN:
raise
return default
acquire = aq_acquire
def aq_inContextOf(self, o, inner=True):
return aq_inContextOf(self, o, inner=inner)
# Wrappers themselves are not picklable, but if the underlying
# object has a _p_oid, then the __getnewargs__ method is allowed
def __reduce__(self, *args):
raise TypeError("Can't pickle objects in acquisition wrappers.")
__reduce_ex__ = __reduce__
__getstate__ = __reduce__
def __getnewargs__(self):
return ()
# Equality and comparisons
def __hash__(self):
# The C implementation doesn't pass the wrapper
# to any __hash__ that the object implements,
# so it can't access derived attributes.
# (If that changes, just add this to __unary_special_methods__
# and remove this method)
return hash(self._obj)
# The C implementation forces all comparisons through the
# __cmp__ method, if it's implemented. If it's not implemented,
# then comparisons are based strictly on the memory addresses
# of the underlying object (aq_base). We could mostly emulate
# this behaviour on Python 2, but on Python 3 __cmp__ is gone,
# so users won't have an expectation to write it.
# Because users have never had an expectation that the rich comparison
# methods would be called on their wrapped objects (and so would not be
# accessing acquired attributes there), we can't/don't want to start
# proxying to them?
# For the moment, we settle for an emulation of the C behaviour:
# define __cmp__ the same way, and redirect the rich comparison operators
# to it. (Note that these attributes are also hardcoded in getattribute)
def __cmp__(self, other):
aq_self = self._obj
if hasattr(type(aq_self), '__cmp__'):
return _rebound_method(aq_self.__cmp__, self)(other)
my_base = aq_base(self)
other_base = aq_base(other)
if my_base is other_base:
return 0
return -1 if id(my_base) < id(other_base) else 1
def __eq__(self, other):
return self.__cmp__(other) == 0
def __ne__(self, other):
return self.__cmp__(other) != 0
def __lt__(self, other):
return self.__cmp__(other) < 0
def __le__(self, other):
return self.__cmp__(other) <= 0
def __gt__(self, other):
return self.__cmp__(other) > 0
def __ge__(self, other):
return self.__cmp__(other) >= 0
# Special methods looked up by the type of self._obj,
# but which must have the wrapper as self when called
def __nonzero__(self):
aq_self = self._obj
type_aq_self = type(aq_self)
nonzero = getattr(type_aq_self, '__nonzero__', None)
if nonzero is None:
# Py3 bool?
nonzero = getattr(type_aq_self, '__bool__', None)
if nonzero is None:
# a len?
nonzero = getattr(type_aq_self, '__len__', None)
if nonzero:
return bool(nonzero(self)) # Py3 is strict about the return type
# If nothing was defined, then it's true
return True
__bool__ = __nonzero__
def __unicode__(self):
f = getattr(self.aq_self, '__unicode__',
getattr(self.aq_self, '__str__', object.__str__))
return _rebound_method(f, self)()
def __repr__(self):
aq_self = self._obj
try:
return _rebound_method(aq_self.__repr__, self)()
except (AttributeError, TypeError):
return repr(aq_self)
def __str__(self):
aq_self = self._obj
try:
return _rebound_method(aq_self.__str__, self)()
except (AttributeError, TypeError): # pragma: no cover (Only Py3)
return str(aq_self)
__binary_special_methods__ = [
# general numeric
'__add__',
'__sub__',
'__mul__',
'__matmul__',
'__floordiv__', # not implemented in C
'__mod__',
'__divmod__',
'__pow__',
'__lshift__',
'__rshift__',
'__and__',
'__xor__',
'__or__',
# division; only one of these will be used at any one time
'__truediv__',
'__div__',
# reflected numeric
'__radd__',
'__rsub__',
'__rmul__',
'__rdiv__',
'__rtruediv__',
'__rfloordiv__',
'__rmod__',
'__rdivmod__',
'__rpow__',
'__rlshift__',
'__rrshift__',
'__rand__',
'__rxor__',
'__ror__',
# in place numeric
'__iadd__',
'__isub__',
'__imul__',
'__imatmul__',
'__idiv__',
'__itruediv__',
'__ifloordiv__',
'__imod__',
'__idivmod__',
'__ipow__',
'__ilshift__',
'__irshift__',
'__iand__',
'__ixor__',
'__ior__',
# conversion
'__coerce__',
# container
'__delitem__',
]
__unary_special_methods__ = [
# arithmetic
'__neg__',
'__pos__',
'__abs__',
'__invert__',
# conversion
'__complex__',
'__int__',
'__long__',
'__float__',
'__oct__',
'__hex__',
'__index__',
# '__len__',
# strings are special
# '__repr__',
# '__str__',
]
for _name in __binary_special_methods__:
def _make_op(_name):
def op(self, other):
aq_self = self._obj
return getattr(type(aq_self), _name)(self, other)
return op
locals()[_name] = _make_op(_name)
for _name in __unary_special_methods__:
def _make_op(_name):
def op(self):
aq_self = self._obj
return getattr(type(aq_self), _name)(self)
return op
locals()[_name] = _make_op(_name)
del _make_op
del _name
# Container protocol
def __len__(self):
# if len is missing, it should raise TypeError
# (AttributeError is acceptable under Py2, but Py3
# breaks list conversion if AttributeError is raised)
try:
l = getattr(type(self._obj), '__len__')
except AttributeError:
raise TypeError('object has no len()')
else:
return l(self)
def __iter__(self):
# For things that provide either __iter__ or just __getitem__,
# we need to be sure that the wrapper is provided as self
if hasattr(self._obj, '__iter__'):
return _rebound_method(self._obj.__iter__, self)()
if hasattr(self._obj, '__getitem__'):
# Unfortunately we cannot simply call iter(self._obj)
# and rebind im_self like we do above: the Python runtime
# complains:
# (TypeError: 'sequenceiterator' expected, got 'Wrapper' instead)
class WrapperIter(object):
__slots__ = ('_wrapper',)
def __init__(self, o):
self._wrapper = o
def __getitem__(self, i):
return self._wrapper.__getitem__(i)
it = WrapperIter(self)
return iter(it)
return iter(self._obj)
def __contains__(self, item):
# First, if the type of the object defines __contains__ then
# use it
aq_self = self._obj
aq_contains = getattr(type(aq_self), '__contains__', None)
if aq_contains:
return aq_contains(self, item)
# Next, we should attempt to iterate like the interpreter;
# but the C code doesn't do this, so we don't either.
# return item in iter(self)
raise AttributeError('__contains__')
def __setitem__(self, key, value):
aq_self = self._obj
try:
setter = type(aq_self).__setitem__
except AttributeError:
raise AttributeError("__setitem__") # doctests care about the name
else:
setter(self, key, value)
def __getitem__(self, key):
if isinstance(key, slice) and hasattr(operator, 'getslice'):
# Only on Python 2
# XXX: This is probably not proxying correctly, but the existing
# tests pass with this behaviour
return operator.getslice(
self._obj,
key.start if key.start is not None else 0,
key.stop if key.stop is not None else sys.maxint)
aq_self = self._obj
try:
getter = type(aq_self).__getitem__
except AttributeError:
raise AttributeError("__getitem__") # doctests care about the name
else:
return getter(self, key)
def __call__(self, *args, **kwargs):
try:
# Note we look this up on the completely unwrapped
# object, so as not to get a class
call = getattr(self.aq_base, '__call__')
except AttributeError: # pragma: no cover
# A TypeError is what the interpreter raises;
# AttributeError is allowed to percolate through the
# C proxy
raise TypeError('object is not callable')
else:
return _rebound_method(call, self)(*args, **kwargs)
class ImplicitAcquisitionWrapper(_Wrapper):
_IS_IMPLICIT = True
class ExplicitAcquisitionWrapper(_Wrapper):
_IS_IMPLICIT = False
def __getattribute__(self, name):
# Special case backwards-compatible acquire method
if name == 'acquire':
return object.__getattribute__(self, name)
return _Wrapper.__getattribute__(self, name)
class _Acquirer(ExtensionClass.Base):
def __getattribute__(self, name):
try:
return super(_Acquirer, self).__getattribute__(name)
except AttributeError:
# the doctests have very specific error message
# requirements (but at least we can preserve the traceback)
_, _, tb = sys.exc_info()
try:
_reraise(AttributeError, AttributeError(name), tb)
finally:
del tb
def __of__(self, context):
return type(self)._Wrapper(self, context)
class Implicit(_Acquirer):
_Wrapper = ImplicitAcquisitionWrapper
ImplicitAcquisitionWrapper._Wrapper = ImplicitAcquisitionWrapper
class Explicit(_Acquirer):
_Wrapper = ExplicitAcquisitionWrapper
ExplicitAcquisitionWrapper._Wrapper = ExplicitAcquisitionWrapper
###
# Exported module functions
###
def aq_acquire(obj, name,
filter=None, extra=None,
explicit=True,
default=_NOT_GIVEN,
containment=False):
if isinstance(obj, _Wrapper):
return obj.aq_acquire(name,
filter=filter, extra=extra,
default=default,
explicit=explicit or type(obj)._IS_IMPLICIT,
containment=containment)
# Does it have a parent, or do we have a filter?
# Then go through the acquisition code
if hasattr(obj, '__parent__') or filter is not None:
parent = getattr(obj, '__parent__', None)
return aq_acquire(ImplicitAcquisitionWrapper(obj, parent),
name,
filter=filter, extra=extra,
default=default,
explicit=explicit,
containment=containment)
# no parent and no filter, simple case
try:
return getattr(obj, name)
except AttributeError:
if default is _NOT_GIVEN:
raise AttributeError(name) # doctests are strict
return default
def aq_parent(obj):
# needs to be safe to call from __getattribute__ of a wrapper
# and reasonably fast
if isinstance(obj, _Wrapper):
return object.__getattribute__(obj, '_container')
# if not a wrapper, deal with the __parent__
return getattr(obj, '__parent__', None)
def aq_chain(obj, containment=False):
result = []
while True:
if isinstance(obj, _Wrapper):
if obj._obj is not None:
if containment:
while isinstance(obj._obj, _Wrapper):
obj = obj._obj
result.append(obj)
if obj._container is not None:
obj = obj._container
continue
else:
result.append(obj)
obj = getattr(obj, '__parent__', None)
if obj is not None:
continue
break
return result
def aq_base(obj):
result = obj
while isinstance(result, _Wrapper):
result = result._obj
return result
def aq_get(obj, name, default=_NOT_GIVEN, containment=False):
# Not wrapped. If we have a __parent__ pointer, create a wrapper
# and go as usual
if not isinstance(obj, _Wrapper) and hasattr(obj, '__parent__'):
obj = ImplicitAcquisitionWrapper(obj, obj.__parent__)
try:
# We got a wrapped object, business as usual
return (_Wrapper_findattr(obj, name, None, None, obj,
True, True, True, containment)
if isinstance(obj, _Wrapper)
# ok, plain getattr
else getattr(obj, name))
except AttributeError:
if default is _NOT_GIVEN:
raise
return default
def aq_inner(obj):
if not isinstance(obj, _Wrapper):
return obj
result = obj._obj
while isinstance(result, _Wrapper):
obj = result
result = result._obj
result = obj
return result
def aq_self(obj):
if isinstance(obj, _Wrapper):
return obj.aq_self
return obj
def aq_inContextOf(self, o, inner=True):
next = self
o = aq_base(o)
while True:
if aq_base(next) is o:
return True
if inner:
self = aq_inner(next)
if self is None: # pragma: no cover
# This branch is normally impossible to hit,
# it just mirrors a check in C
break
else:
self = next
next = aq_parent(self)
if next is None:
break
return False
if not (IS_PYPY or IS_PURE): # pragma: no cover
# Make sure we can import the C extension of our dependency.
from ExtensionClass import _ExtensionClass # NOQA
from ._Acquisition import * # NOQA
classImplements(Explicit, IAcquirer)
classImplements(ExplicitAcquisitionWrapper, IAcquisitionWrapper)
classImplements(Implicit, IAcquirer)
classImplements(ImplicitAcquisitionWrapper, IAcquisitionWrapper)
@@ -1,62 +0,0 @@
##############################################################################
#
# Copyright (c) 2005 Zope Foundation and Contributors.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Acquisition z3 interfaces.
$Id$
"""
from zope.interface import Attribute
from zope.interface import Interface
class IAcquirer(Interface):
"""Acquire attributes from containers.
"""
def __of__(context):
"""Get the object in a context.
"""
class IAcquisitionWrapper(Interface):
"""Wrapper object for acquisition.
"""
def aq_acquire(name, filter=None, extra=None, explicit=True, default=0,
containment=0):
"""Get an attribute, acquiring it if necessary.
"""
def aq_inContextOf(obj, inner=1):
"""Test whether the object is currently in the context of the argument.
"""
aq_base = Attribute(
"""Get the object unwrapped.""")
aq_parent = Attribute(
"""Get the parent of an object.""")
aq_self = Attribute(
"""Get the object with the outermost wrapper removed.""")
aq_inner = Attribute(
"""Get the object with all but the innermost wrapper removed.""")
aq_chain = Attribute(
"""Get a list of objects in the acquisition environment.""")
aq_explicit = Attribute(
"""Get the object with an explicit acquisition wrapper.""")
File diff suppressed because it is too large. Load diff
@@ -1,25 +0,0 @@
Overview
========
AuthEncoding is a framework for handling LDAP style password hashes.
It is used in Zope2 but does not depend on any other Zope package.
Changelog
=========
4.0.0 (2015-09-30)
------------------
- Supporting Python 3.3 up to 3.5 and PyPy2.
- Added ``SHA256DigestScheme``.
3.0.0 (2015-09-28)
------------------
- Extracted from ``AccessControl 3.0.11``
@@ -1,54 +0,0 @@
Metadata-Version: 2.0
Name: AuthEncoding
Version: 4.0.0
Summary: Framework for handling LDAP style password hashes.
Home-page: https://github.com/zopefoundation/AuthEncoding
Author: Zope Foundation and Contributors
Author-email: zope-dev@zope.org
License: ZPL 2.1
Platform: UNKNOWN
Classifier: Development Status :: 6 - Mature
Classifier: Environment :: Web Environment
Classifier: Framework :: Zope2
Classifier: License :: OSI Approved :: Zope Public License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP
Requires-Dist: six
Provides-Extra: test
Requires-Dist: pytest; extra == 'test'
Overview
========
AuthEncoding is a framework for handling LDAP style password hashes.
It is used in Zope2 but does not depend on any other Zope package.
Changelog
=========
4.0.0 (2015-09-30)
------------------
- Supporting Python 3.3 up to 3.5 and PyPy2.
- Added ``SHA256DigestScheme``.
3.0.0 (2015-09-28)
------------------
- Extracted from ``AccessControl 3.0.11``
@@ -1,18 +0,0 @@
AuthEncoding-4.0.0.dist-info/DESCRIPTION.rst,sha256=UKoEVLqA6eoGuaGlkVcj4mZJUnzBr3IdyZ4rLj9tBY4,381
AuthEncoding-4.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
AuthEncoding-4.0.0.dist-info/METADATA,sha256=LMz4ZjZ94m7OrJJAs4_0fs1X4C-gvWPTEw8uGwX-LvY,1588
AuthEncoding-4.0.0.dist-info/RECORD,,
AuthEncoding-4.0.0.dist-info/RECORD.jws,,
AuthEncoding-4.0.0.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113
AuthEncoding-4.0.0.dist-info/metadata.json,sha256=yBATAjh7I5YnUKtIQHGhhActRCg60BSsaAeM0r5dPFY,1294
AuthEncoding-4.0.0.dist-info/top_level.txt,sha256=r_cFzzt28gdOYPoRX7HjrbsJE6G-ZPK0n3sWbqE4PdQ,13
AuthEncoding/AuthEncoding.py,sha256=A82pAZQA-r1NSG7jBf1qDJn4utAQXMHMSF09Do35t0w,7265
AuthEncoding/__init__.py,sha256=9fdxLPEIHDUW2ig-pE92y7BkZAHItLvvFpgXTs4byiU,791
AuthEncoding/__pycache__/AuthEncoding.cpython-36.pyc,,
AuthEncoding/__pycache__/__init__.cpython-36.pyc,,
AuthEncoding/__pycache__/compat.cpython-36.pyc,,
AuthEncoding/compat.py,sha256=o2nbexNN16x67B8xLKZRQQo_F4LheBnRtKgO---vuPY,347
AuthEncoding/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
AuthEncoding/tests/__pycache__/__init__.cpython-36.pyc,,
AuthEncoding/tests/__pycache__/test_AuthEncoding.cpython-36.pyc,,
AuthEncoding/tests/test_AuthEncoding.py,sha256=zEj6Uz2eC3VPxmafNcy2ZvdSQLfVSu_Yf9X63X2XHfM,3814
@@ -1 +0,0 @@
{"payload": "eyJoYXNoIjogInNoYTI1Nj1FbUpVbjFTUEdYeXhKc2FnMWpxNGJkMnlnYW80TlhzY2hORW5iSEFISHdnIn0", "recipients": [{"header": "eyJhbGciOiAiRWQyNTUxOSIsICJqd2siOiB7Imt0eSI6ICJFZDI1NTE5IiwgInZrIjogInZUZU1lalVPMTV1SkQzY203enZPLV9oc0dMSld4ZlFNMEFFd2R5SUQyeTQifX0", "signature": "D1i5q57sD-x3nU_8L_49SwW7b--DjetQhUpnMDwDDui6PVsLfsAr65teCK_GbT4txrxkqzCHEMV8byYKzz4XDw"}]}
@@ -1,6 +0,0 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.30.0.a0)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any
@@ -1 +0,0 @@
{"classifiers": ["Development Status :: 6 - Mature", "Environment :: Web Environment", "Framework :: Zope2", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP"], "extensions": {"python.details": {"contacts": [{"email": "zope-dev@zope.org", "name": "Zope Foundation and Contributors", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/zopefoundation/AuthEncoding"}}}, "extras": ["test"], "generator": "bdist_wheel (0.30.0.a0)", "license": "ZPL 2.1", "metadata_version": "2.0", "name": "AuthEncoding", "run_requires": [{"extra": "test", "requires": ["pytest"]}, {"requires": ["six"]}], "summary": "Framework for handling LDAP style password hashes.", "version": "4.0.0"}
Loaded 100 of 2989 files, more files were not shown because too many files have changed in this diff. Show more