Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02adc8fe6d | ||
|
|
ac66d766c5 | ||
|
|
535857581f | ||
|
|
7362469204 | ||
|
|
02551b24b5 | ||
|
|
6c5bcb0131 | ||
|
|
acb8668991 | ||
|
|
a577e47acc | ||
|
|
3b9f4c33f2 | ||
|
|
62c84570cc | ||
|
|
d773cba908 | ||
|
|
38a25437b6 | ||
|
|
292e9eda2a | ||
|
|
65d167a8b8 | ||
|
|
92fda4831a | ||
|
|
806718824c |
No files matched your search
+46
@@ -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/
|
||||
|
||||
@@ -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
@@ -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)
|
||||
@@ -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
@@ -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']
|
||||
@@ -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
@@ -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
|
||||
@@ -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()
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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
@@ -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>!',
|
||||
)
|
||||
File renamed without changes.
+36
@@ -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
|
||||
BIN
Binary file not shown.
@@ -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}
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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
@@ -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'
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Start Gunicorn processes
|
||||
python3 manage.py runserver
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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())
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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())
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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()
|
||||
Executable
BIN
Binary file not shown.
@@ -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())
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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')()
|
||||
)
|
||||
@@ -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
@@ -1 +0,0 @@
|
||||
|
||||
-15
@@ -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 +0,0 @@
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
ExtensionClass>=4.2.0
|
||||
zope.interface
|
||||
@@ -1 +0,0 @@
|
||||
Acquisition
|
||||
@@ -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
Binary file not shown.
@@ -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
Reference in new issue
Block a user