10 Commits

Author SHA1 Message Date
Martin Bley
99eaafff00 - getSeason() only for staff members
- new view staff()
- updated bootstrap to version 3.4.1
- updated jquery to 3.6.3
- changed container layout in main view 'matchday'
2023-04-02 21:24:20 +02:00
Martin Bley
446a55f3e5 New design and renaming for the blog which now named chat 2022-10-04 17:29:21 +02:00
Martin Bley
2f970d6eb4 fix for clean logout 2022-09-18 17:59:08 +02:00
Martin Bley
c1deabc692 fix for clean logout 2022-09-18 17:57:38 +02:00
Martin Bley
fb3e425471 fix for clean logout 2022-09-18 17:48:33 +02:00
Martin Bley
46bc47f046 Added migrations do tipp app 2022-09-18 13:59:06 +02:00
Martin Bley
8db2774f7c Added new file for lib deps 2022-09-18 13:54:36 +02:00
Martin Bley
272498b4ce Revised templates 2022-09-18 13:26:47 +02:00
Martin Bley
12323615c7 First import of migration to python 3 2022-09-18 13:24:58 +02:00
9d6857cfe2 „AUTHORS“ ändern 2022-01-05 19:38:04 +01:00
31 changed files with 986 additions and 893 deletions

1
.gitignore vendored
View File

@@ -8,4 +8,3 @@ static/
templates/blogindex.html-media
tippy/static/
warnings.txt
tags

View File

@@ -1 +1 @@
Martin Bley <martin@mb-oss.de>
Martin Bley <dev@mb-oss.de>

6
CHANGELOG Normal file
View File

@@ -0,0 +1,6 @@
- getSeason() only for staff members
- new view staff()
- updated bootstrap to version 3.4.1
- updated jquery to 3.6.3
- changed container layout in main view 'matchday'

0
TipPy/__init__.py Normal file
View File

16
TipPy/asgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
ASGI config for TipPy project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TipPy.settings')
application = get_asgi_application()

146
TipPy/settings.py Normal file
View File

@@ -0,0 +1,146 @@
"""
Django settings for TipPy project.
Generated by 'django-admin startproject' using Django 4.0.6.
For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-jiw8js(^@d)no7tv(oq+ugl3kj=f8@j-kz3bj530&!%!$cjqj9'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'tipp'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'TipPy.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates']
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'TipPy.wsgi.application'
WSGI_APPLICATION = 'TipPy.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'tippy',
'USER': 'tippy',
'PASSWORD': 'tippy',
'HOST': 'localhost',
'PORT': '5432',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/
LANGUAGE_CODE = 'de-de'
TIME_ZONE = 'Europe/Berlin'
USE_I18N = True
USE_TZ = True
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
if not DEBUG:
STATIC_ROOT = ''
STATICFILES_DIRS = [
#os.path.join(BASE_DIR, 'static/'),
]
# STATIC_ROOT=os.path.join(BASE_DIR,"static/")
# STATIC_URL = 'static/'
# STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# Redirect on logout
LOGOUT_REDIRECT_URL = "home"

8
TipPy/urls.py Normal file
View File

@@ -0,0 +1,8 @@
from django.contrib import admin, auth
from django.urls import include, path, re_path
urlpatterns = [
path('', include('tipp.urls')),
path('admin/', admin.site.urls),
]

16
TipPy/wsgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
WSGI config for TipPy project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TipPy.settings')
application = get_wsgi_application()

6
requirements.txt Normal file
View File

@@ -0,0 +1,6 @@
Django~=4.1.7
psycopg2~=2.9.5
suds~=1.1.2
Pillow~=9.4.0
pytz~=2023.2
urllib3~=1.26.15

View File

@@ -2,7 +2,7 @@
{% load i18n static %}
{% load humanize %}
{% block head %}
<script type="text/javascript" src="{{ STATIC_URL }}javascript/tippy.js"></script>
<script type="text/javascript" src="{% static 'javascript/tippy.js' %}"></script>
{% endblock %}
{% block nav %}

View File

@@ -1,68 +0,0 @@
{% extends "base.html" %}
{% load i18n static %}
{% load humanize %}
{% block head %}
<script type="text/javascript" src="{{ STATIC_URL }}javascript/tippy.js"></script>
{% endblock %}
{% block nav %}
{% include "nav.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
<div id="content-main">
<div class="row">
<div class="col-md-7">
<h2>Aktivierte Ligen</h2>
<table class="table table-striped">
<tr>
<th>Liga</th>
<th>Abkürzung</th>
</tr>
{% for i in leagues %}
<tr>
<td>{{ i.leagueName }}</td>
<td>{{ i.leagueShortcut }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<div class="row">
<div class="col-md-7">
<button class="btn btn-primary" type="button" data-toggle="collapse"
data-target="#collapseBeispiel" aria-expanded="false" aria-controls="collapseBeispiel">
Liga hinzufügen</button>
<div class="collapse" id="collapseBeispiel">
<form role="form" action="" method="post">{% csrf_token %}
<table class="table table-striped">
<tr>
<th>Liga</th>
<th>Abkürzung</th>
<th>Saison</th>
<th>ID</th>
</tr>
{% for i in avail_leagues %}
<tr>
<td>{{ i.leagueName }}</td>
<td>{{ i.leagueShortcut }}</td>
<td>{{ i.leagueSaison }}</td>
<td>{{ i.leagueID }}</td>
</tr>
{% endfor %}
</table>
</form>
</div>
</div>
</div>
{% if debug %}
<div class="row">
<div class="col-md-7">
{% for line in debug %}
<p>{{ line }}</p>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -16,13 +16,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap -->
<link href="{{ STATIC_URL }}css/bootstrap.min.css" rel="stylesheet">
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<!-- Bootstrap-Theme -->
<link href="{{ STATIC_URL }}css/bootstrap-theme.min.css" rel="stylesheet">
<link href="{% static 'css/bootstrap-theme.min.css' %}" rel="stylesheet">
<!-- Bootstrap-Theme -->
<link href="{{ STATIC_URL }}css/tippy-bootstrap.css" rel="stylesheet">
<link href="{% static 'css/tippy-bootstrap.css' %}" rel="stylesheet">
<!-- Unterstützung für Media Queries und HTML5-Elemente im Internet Explorer über HTML5 shim und Respond.js -->
<!-- ACHTUNG: Respond.js funktioniert nicht, wenn du die Seite über file:// aufrufst -->
@@ -36,9 +36,9 @@
<body>
<!-- jQuery (wird für Bootstrap JavaScript-Plugins benötigt) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
<!-- Binde alle kompilierten Plugins zusammen ein (wie hier unten) oder such dir einzelne Dateien nach Bedarf aus -->
<script src="{{ STATIC_URL }}js/bootstrap.min.js"></script>
<script src="{% static 'js/bootstrap.min.js'%}"></script>
{% block nav %}{% endblock %}
@@ -53,7 +53,7 @@
<div class="col-md-7">
<p>
<div class="pull-left">
© Martin Bley, 2014-2016 | Dank an
© Martin Bley, 2014-2023 | Dank an
<a href="http://openligadb.de">OpenLigaDB</a> für die Bereitstellung der
Spielergebnisse.
</div>

View File

@@ -2,70 +2,74 @@
{% load i18n static %}
{% load humanize %}
{% block head %}
<title> TipPy Blog</title>
<title> TipPy Blog</title>
{% endblock %}
{% block nav %}
{% include "nav.html" with ls=ls season=season %}
{% include "nav.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
<div id="content-main">
<div class="row">
<div class="col-md-7">
<h2>TipPy Blog</h2>
<p class="text-right">
<a class="btn btn-default" href="/blog/newpost" role="button">Neue Nachricht</a>
</p>
</div>
</div>
{% for post, avatar in posts %}
<div class="row">
<div class="col-md-7">
<div class="panel panel-default">
<div class="panel-heading">
{{post.author.first_name}} schrieb {{post.created|naturaltime}}
<div id="content-main">
<div class="row">
<div class="col-md-7">
<h2>TipPy Blog</h2>
<p class="text-right">
<a class="btn btn-default" href="/blog/newpost" role="button">Neue Nachricht</a>
</p>
</div>
</div>
<div class="panel-body">
{% if avatar %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic" src="/media/{{avatar}}" />
{% else %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic" src="/media/profiles/dummy.png" />
{% endif %}
{{post.content|safe}}
</div>
</div>
</div>
</div>
{% endfor %}
<div class="row">
<div class="col-md-7">
<nav>
<ul class="pager">
{% if posts.has_previous %}
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous">
<a href="/blog/{{ page|add:"-1" }}">
{% else %}
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous inactive">
<a href="/blog/{{ page }}">
{% endif %}
<span aria-hidden="true">&larr;</span>
</a>
</li>
Seite {{ posts.number }} von {{ posts.paginator.num_pages }}.
{% if posts.has_next %}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next">
<a href="/blog/{{ page|add:"1" }}">
{% else %}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next inactive">
<a href="/blog/{{ page }}">
{% endif %}
<span aria-hidden="true">&rarr;</span>
</a>
</li>
<ul class="media-list">
{% for post, avatar in posts %}
<li class="media">
<a href="#" class="pull-left">
{% if avatar %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic"
src="/media/{{ avatar }}"/>
{% else %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic"
src="/media/profiles/dummy.png"/>
{% endif %}
</a>
<div class="media-body">
<span class="text-muted pull-right">
<small class="text-muted">{{ post.created|naturaltime }}</small>
</span>
<strong class="text-success">{{ post.author.first_name }}</strong>
<p>{{ post.content|safe }}</p>
</div>
</li>
{% endfor %}
</ul>
</nav>
<div class="row">
<div class="col-md-7">
<nav>
<ul class="pager">
{% if posts.has_previous %}
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous">
<a href="/blog/{{ page|add:"-1" }}">
{% else %}
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous inactive">
<a href="/blog/{{ page }}">
{% endif %}
<span aria-hidden="true">&larr;</span>
</a>
</li>
Seite {{ posts.number }} von {{ posts.paginator.num_pages }}.
{% if posts.has_next %}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next">
<a href="/blog/{{ page|add:"1" }}">
{% else %}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next inactive">
<a href="/blog/{{ page }}">
{% endif %}
<span aria-hidden="true">&rarr;</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

28
templates/chat.xhtml Normal file
View File

@@ -0,0 +1,28 @@
{% load humanize %}
<hr>
<p class="text-left">
<a class="btn btn-default" href="/blog/newpost" role="button">neuer Post</a>
</p>
<ul class="media-list">
{% for post, avatar in posts %}
<li class="media">
<a href="#" class="pull-left">
{% if avatar %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic"
src="/media/{{ avatar }}"/>
{% else %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic"
src="/media/profiles/dummy.png"/>
{% endif %}
</a>
<div class="media-body">
<span class="text-muted pull-right">
<small class="text-muted">{{ post.created|naturaltime }}</small>
</span>
<strong class="text-success">{{ post.author.first_name }}</strong>
<p>{{ post.content|safe }}</p>
</div>
</li>
{% endfor %}
</ul>

View File

@@ -1,33 +0,0 @@
{% extends "base.html" %}
{% load url from future %}
{% comment %}
Main page to authenticate users.
{% endcomment %}
{% block head %}
<title>TipPy | Login</title>
{% endblock %}
{% block nav %}
{% include "nav_login.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
{% if form.errors %}
<div class="row">
<p>Benutzename und Passwort passen nicht zusammen. Bitte versuche es noch einmal.</p>
</div>
{% endif %}
<div class="row">
<div class="col-md-3">
<form class="form-signin" role="form" method="post" action="{% url 'django.contrib.auth.views.login' %}">
<h2 class="form-signin-heading">Bitte melde dich an</h2>
{% csrf_token %}
<input class="form-control" type="text" autofocus="" required="" name="{{form.username.html_name}}" placeholder="Anmeldename" />
<input class="form-control" type="password" required="" placeholder="Passwort" name="{{form.password.html_name}}" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Anmelden</button>
<input type="hidden" name="next" value="{{ next }}" />
</form>
</div>
</div>
{% endblock %}

View File

@@ -2,128 +2,114 @@
{% load i18n static %}
{% load humanize %}
{% block head %}
<script type="text/javascript" src="{{ STATIC_URL }}javascript/tippy.js"></script>
<script type="text/javascript" src="{% static 'javascript/tippy.js' %}"></script>
{% endblock %}
{% block nav %}
{% include "nav.html" with ls=ls season=season %}
{% include "nav.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
<div id="content-main">
<div class="row">
<div class="col-md-7">
<h2>Neueste Nachrichten</h2>
<p class="text-right">
<a class="btn btn-default" href="/blog/1" role="button">zum Blog</a>
</p>
{% for post, avatar in posts %}
<div class="panel panel-default">
<div class="panel-heading">
{{post.author.first_name}} schrieb {{post.created|naturaltime}}
<div id="content-main">
<div class="row">
<div class="col-md-6">
<h3>Deine Tipps</h3>
<nav>
<ul class="pager">
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous"><a
href="/matchday/{{ ls }}/{{ season }}/{{ cur_md|add:"-1"|stringformat:"02i" }}"><span
aria-hidden="true">&larr;</span></a></li>
{{ md_name }}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next"><a
href="/matchday/{{ ls }}/{{ season }}/{{ cur_md|add:"1"|stringformat:"02i" }}"><span
aria-hidden="true">&rarr;</span></a></li>
</ul>
</nav>
<form role="form" action="" method="post">{% csrf_token %}
<div class="table-responsive">
<table class="table table-hover table-condensed">
<tr>
<th>Anstoß</th>
<th>Heim</th>
<th>Gast</th>
<th>Erg.</th>
<th colspan="2">Tipp</th>
</tr>
{% for match in matches %}
{% if match.started and not match.finished %}
<tr class="danger">{% else %}
<tr>{% endif %}
<td>{{ match.matchDateTime }}</td>
{% if match.iconURLTeam1 != "" %}
<td><img src="{{ match.iconURLTeam1 }}" width="20"/>
{% else %}
<td><img src="{{ STATIC_URL }}{{ match.iconTeam1 }}"/>
{% endif %}
<span class="hidden-xs"> {{ match.nameTeam1 }}</span>
<span class="visible-xs"> {{ match.abbrTeam1 }}</span>
</td>
{% if match.iconURLTeam1 != "" %}
<td><img src="{{ match.iconURLTeam2 }}" width="20"/>
{% else %}
<td><img src="{{ STATIC_URL }}{{ match.iconTeam2 }}"/>
{% endif %}
<span class="hidden-xs"> {{ match.nameTeam2 }}</span>
<span class="visible-xs"> {{ match.abbrTeam2 }}</span>
</td>
<td>{{ match.matchResult }}</td>
<td>{{ match.tippFormTeam1 }}</td>
<td>{{ match.tippFormTeam2 }}</td>
</tr>
{% endfor %}
</table>
</div>
<button type="submit" class="btn btn-default btn-lg btn-block">
<span class="glyphicon glyphicon-saved" aria-hidden="true"></span> Tipps abgeben
</button>
</form>
{% for mandant, list in mandant_dict.items %}
<h3>Mitspieler {{ mandant }}</h3>
<div class="table-responsive">
<table class="table table-hover table-condensed">
<tr>
<th>Tipper</th>
<th>Gesamt</th>
{% for match in matches %}
<th>
{% if match.iconURLTeam1 != "" %}
<img src="{{ match.iconURLTeam1 }}" width="20"/>
{% else %}
<img src="{{ STATIC_URL }}{{ match.iconTeam1 }}"/>
{% endif %}
<br/><br/>
{% if match.iconURLTeam2 != "" %}
<img src="{{ match.iconURLTeam2 }}" width="20"/>
{% else %}
<img src="{{ STATIC_URL }}{{ match.iconTeam2 }}"/>
{% endif %}
</th>
{% endfor %}
</tr>
{% for mate in list %}
<tr>
<td>{{ mate.mate.first_name }}</td>
<td>{{ mate.sum_score }}</td>
{% for tipp in mate.tipps %}
<td>{{ tipp }}</td>
{% endfor %}
{% endfor %}
</tr>
</table>
</div>
{% endfor %}
</div>
<div class="col-md-6">
<h3>Chat</h3>
{% block chat %}
{% include "chat.xhtml" with posts=posts %}
{% endblock %}
</div>
</div>
<div class="panel-body">
{% if avatar %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic" src="/media/{{avatar}}" />
{% else %}
<img class="img-circle img-responsive pull-left blog" alt="Profile Pic" src="/media/profiles/dummy.png" />
{% endif %}
{{post.content|safe}}
</div>
</div>
{% endfor %}
</div>
</div>
<div class="row">
<div class="col-md-7">
<h2>Deine Tipps</h2>
<nav>
<ul class="pager">
<li data-toggle="tooltip" title="{% trans 'previous' %}" class="previous"><a href="/matchday/{{ ls }}/{{ season }}/{{ cur_md|add:"-1"|stringformat:"02i" }}"><span aria-hidden="true">&larr;</span></a></li>
{{ md_name }}
<li data-toggle="tooltip" title="{% trans 'next' %}" class="next"><a href="/matchday/{{ ls }}/{{ season }}/{{ cur_md|add:"1"|stringformat:"02i" }}"><span aria-hidden="true">&rarr;</span></a></li>
</ul>
</nav>
<form role="form" action="" method="post">{% csrf_token %}
<div class="table-responsive">
<table class="table table-hover table-condensed">
<tr>
<th>Anstoß</th>
<th>Heim</th>
<th>Gast</th>
<th>Erg.</th>
<th colspan="2">Tipp</th>
</tr>
{% for match in matches %}
{% if match.started and not match.finished %}
<tr class="danger">{% else %}<tr>{% endif %}
<td>{{ match.matchDateTime }}</td>
{% if match.iconURLTeam1 != "" %}
<td><img src="{{ match.iconURLTeam1 }}" width="20"/>
{% else %}
<td><img src="{{ STATIC_URL}}{{ match.iconTeam1 }}" />
{% endif %}
<span class="hidden-xs"> {{ match.nameTeam1 }}</span>
<span class="visible-xs"> {{ match.abbrTeam1 }}</span>
</td>
{% if match.iconURLTeam1 != "" %}
<td><img src="{{ match.iconURLTeam2 }}" width="20"/>
{% else %}
<td><img src="{{ STATIC_URL}}{{ match.iconTeam2 }}" />
{% endif %}
<span class="hidden-xs"> {{ match.nameTeam2 }}</span>
<span class="visible-xs"> {{ match.abbrTeam2 }}</span>
</td>
<td>{{ match.matchResult }}</td>
<td>{{ match.tippFormTeam1 }}</td><td>{{ match.tippFormTeam2 }}</td>
</tr>
{% endfor %}
</table>
</div>
<button type="submit" class="btn btn-default btn-lg btn-block">
<span class="glyphicon glyphicon-saved" aria-hidden="true"></span> Tipps abgeben
</button>
</form>
</div>
</div>
<div class="row">
{% for mandant, list in mandant_dict.items %}
<div class="col-md-7">
<h4>Mitspieler {{ mandant }}</h4>
<div class="table-responsive">
<table class="table table-hover table-condensed">
<tr>
<th>Tipper</th>
<th>Gesamt</th>
{% for match in matches %}
<th>
{% if match.iconURLTeam1 != "" %}
<img src="{{ match.iconURLTeam1 }}" width="20"/>
{% else %}
<img src="{{ STATIC_URL }}{{ match.iconTeam1 }}" />
{% endif %}
<br /><br />
{% if match.iconURLTeam2 != "" %}
<img src="{{ match.iconURLTeam2 }}" width="20"/>
{% else %}
<img src="{{ STATIC_URL }}{{ match.iconTeam2 }}" />
{% endif %}
</th>
{% endfor %}
</tr>
{% for mate in list %}
<tr>
<td>{{ mate.mate.first_name }}</td>
<td>{{ mate.sum_score }}</td>
{% for tipp in mate.tipps %}
<td>{{ tipp }}</td>
{% endfor %}
{% endfor %}
</tr>
</table>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -16,8 +16,8 @@
<li><a href="/">Tipps</a></li>
<li><a href="/charts/{{ ls }}/{{ season }}{% if pos %}/{{ pos }}{% endif %}">Bestenliste</a></li>
<li><a href="/blog/1">Blog</a></li>
{% if user.is_superuser %}
<li><a href="/adminpage">Admin</a></li>
{% if request.user.is_active and request.user.is_staff %}
<li><a href="/staff">Staff</a></li>
{% endif %}
</ul>
<ul class="nav navbar-nav navbar-right">
@@ -35,7 +35,7 @@
<ul class="dropdown-menu">
<li><a href="/accounts/profile/{{user.id}}">Profil ändern</a></li>
<li><a href="/accounts/password_change/">Passwort ändern</a></li>
<li><a href="/logout">Abmelden</a></li>
<li><a href="/accounts/logout">Abmelden</a></li>
</ul>
</li>
</ul>

View File

@@ -1,58 +1,58 @@
{% extends "base.html" %}
{% load i18n static %}
{% block head %}
<title> TipPy Blog</title>
<title> TipPy Blog</title>
{% endblock %}
{% block nav %}
{% include "nav.html" with ls=ls season=season %}
{% include "nav.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
<div id="content-main">
{% if form_bp.errors %}
<div>
<p class="errornote">
{% if form_bp.errors.items|length == 1 %}
{% trans "Please correct the error below." %}
{% else %}
{% trans "Please correct the errors below." %}
{% endif %}</p>
</div>
{% endif %}
<div class="row">
<div class="col-md-8">
<form class="form-horizontal" action="" method="post">{% csrf_token %}
<div class="form-group">
{{form_bp.content.errors}}
<label for="id_content" class="col-sm-4 control-label required">{% trans 'Content' %}</label>
<div class="col-sm-5">
<textarea class="form-control" maxlength="256" rows="2"
id="id_content" name="content"></textarea>
{% if cnt_mandants > 1 %}
{{ form_mandants.mandants.label_tag }}
{% for choice in form_mandants.mandants %}
<label for="{{choice.id_for_label}}">
{{ choice.tag }} {{choice.choice_label}}
</label>
{% endfor %}
{% endif %}
</div>
<div id="content-main">
{% if form_bp.errors %}
<div>
<p class="errornote">
{% if form_bp.errors.items|length == 1 %}
{% trans "Please correct the error below." %}
{% else %}
{% trans "Please correct the errors below." %}
{% endif %}</p>
</div>
{% endif %}
<div class="row">
<div class="col-md-8">
<form class="form-horizontal" action="" method="post">{% csrf_token %}
<div class="form-group">
{{ form_bp.content.errors }}
<div class="col-sm-5">
<div class="panel-body">
<textarea class="form-control" placeholder="Schreibe einen Kommentar..." id="id_content"
name="content" maxlength="100" rows="2"></textarea>
{% if cnt_mandants > 1 %}
{{ form_mandants.mandants.label_tag }}
{% for choice in form_mandants.mandants %}
<label for="{{ choice.id_for_label }}">
{{ choice.tag }} {{ choice.choice_label }}
</label>
{% endfor %}
{% endif %}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">{% trans 'Sent' %}</button>
</div>
</div>
</form>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">{% trans 'Sent' %}</button>
</div>
</div>
</form>
{% if debug %}
<div class="row">
<div class="col-md-8">
<p>{{ debug }}</p>
</div>
</div>
{% endif %}
</div>
</div>
{% if debug %}
<div class="row">
<div class="col-md-8">
<p>{{ debug }}</p>
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -1,5 +1,6 @@
{% extends "base.html" %}
{% load url from future %}
{% load admin_urls %}
{% comment %}
Main page to authenticate users.
{% endcomment %}
@@ -20,7 +21,7 @@
{% endif %}
<div class="row">
<div class="col-md-3">
<form class="form-signin" role="form" method="post" action="{% url 'django.contrib.auth.views.login' %}">
<form class="form-signin" role="form" method="post" action="{% url 'login' %}">
<h2 class="form-signin-heading">Bitte melde dich an</h2>
{% csrf_token %}
<input class="form-control" type="text" autofocus="" required="" name="{{form.username.html_name}}" placeholder="Anmeldename" />

34
templates/staff.html Normal file
View File

@@ -0,0 +1,34 @@
{% extends "base.html" %}
{% load i18n static %}
{% load humanize %}
{% block head %}
<script type="text/javascript" src="{% static 'javascript/tippy.js' %}"></script>
{% endblock %}
{% block nav %}
{% include "nav.html" with ls=ls season=season %}
{% endblock %}
{% block body %}
<div id="content-main">
<div class="row">
<div class="col-md-12">
<h3>Wettbewerbe</h3>
{% for comp in competitions %}
{{ comp }}<br/>
{% endfor %}
<h3></h3>
</div>
</div>
{% if debug %}
<div class="row">
<div class="col-md-12">
<h2 class="form-signin-heading">{% trans 'Debug' %}</h2>
{% for line in debug %}
<p>{{ line }}</p>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -55,8 +55,8 @@ class BlogpostForm(ModelForm):
class MandantsForm(forms.Form):
mandants = forms.MultipleChoiceField(
label= "Posten in ",
widget=forms.CheckboxSelectMultiple({'checked':'checked'})
label= "Posten in",
widget=forms.CheckboxSelectMultiple({'checked':'checked'})
)
class UserForm(forms.ModelForm):
@@ -69,9 +69,3 @@ class UserProfileForm(forms.ModelForm):
model = UserProfile
fields = ['avatar']
class LeagueImportForm(forms.Form):
leagues = forms.ChoiceField(
widget=forms.RadioSelect()
)

View File

@@ -0,0 +1,146 @@
# Generated by Django 4.0.6 on 2022-07-14 15:15
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Competition',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('leagueShortcut', models.CharField(max_length=32)),
('leagueName', models.CharField(max_length=128)),
('season', models.CharField(max_length=4)),
],
),
migrations.CreateModel(
name='Mandant',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32, unique=True)),
('description', models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name='Post',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField()),
('published', models.BooleanField(default=True)),
('created', models.DateTimeField(auto_now_add=True)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['-created'],
},
),
migrations.CreateModel(
name='Team',
fields=[
('teamID', models.IntegerField(primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('icon', models.FileField(upload_to='images/team_logos/')),
('abbr', models.CharField(max_length=3)),
('iconURL', models.CharField(max_length=2000)),
],
options={
'managed': True,
},
),
migrations.CreateModel(
name='UserProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('avatar', models.ImageField(blank=True, upload_to='profiles/')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Score',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('exact_high', models.PositiveSmallIntegerField()),
('exact', models.PositiveSmallIntegerField()),
('diff', models.PositiveSmallIntegerField()),
('tendency', models.PositiveSmallIntegerField()),
('client', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.mandant')),
],
),
migrations.CreateModel(
name='Match',
fields=[
('matchID', models.IntegerField(primary_key=True, serialize=False, unique=True)),
('matchDateTime', models.DateTimeField()),
('group', models.IntegerField()),
('matchday', models.IntegerField()),
('matchday_name', models.CharField(max_length=128)),
('pointsTeam1', models.SmallIntegerField()),
('pointsTeam2', models.SmallIntegerField()),
('finished', models.BooleanField()),
('season', models.CharField(max_length=4)),
('leagueShortcut', models.CharField(max_length=12)),
('idTeam1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='tipp.team')),
('idTeam2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='tipp.team')),
],
),
migrations.CreateModel(
name='Tipp',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('pointsTeam1', models.PositiveSmallIntegerField()),
('pointsTeam2', models.PositiveSmallIntegerField()),
('score', models.PositiveIntegerField(blank=True, null=True)),
('matchID', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.match')),
('tipperID', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('matchID', 'tipperID')},
},
),
migrations.CreateModel(
name='RelUserMandant',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('mandant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.mandant')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('user', 'mandant')},
},
),
migrations.CreateModel(
name='RelPostMandant',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('mandant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.mandant')),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.post')),
],
options={
'unique_together': {('post', 'mandant')},
},
),
migrations.CreateModel(
name='chart',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('points', models.PositiveSmallIntegerField()),
('diff', models.SmallIntegerField()),
('games', models.PositiveSmallIntegerField()),
('competition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.competition')),
('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tipp.team')),
],
options={
'unique_together': {('team', 'competition')},
},
),
]

View File

View File

@@ -17,25 +17,29 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TipPy. If not, see <http://www.gnu.org/licenses/>.
"""
from django.db import models
from django.core.urlresolvers import reverse
"""
from django.contrib.auth.models import User
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField(User)
user = models.OneToOneField(
User,
on_delete=models.CASCADE
)
avatar = models.ImageField(upload_to="profiles/", blank=True)
def __unicode__(self):
return self.user.username
class Competition(models.Model):
leagueShortcut = models.CharField(max_length=32)
leagueName = models.CharField(max_length=128)
season = models.CharField(max_length=4)
def __unicode__(self):
return(self.leagueShortcut)
return (self.leagueShortcut)
class Team(models.Model):
teamID = models.IntegerField(unique=True, primary_key=True)
@@ -48,31 +52,43 @@ class Team(models.Model):
return self.name
class Meta:
managed = True
app_label = 'tipp'
managed = True
app_label = 'tipp'
class Match(models.Model):
matchID = models.IntegerField(unique=True,primary_key=True)
matchID = models.IntegerField(unique=True, primary_key=True)
matchDateTime = models.DateTimeField()
group = models.IntegerField()
matchday = models.IntegerField()
matchday_name = models.CharField(max_length=128)
idTeam1 = models.ForeignKey(Team, related_name='+')
idTeam2 = models.ForeignKey(Team, related_name='+')
idTeam1 = models.ForeignKey(
Team, related_name='+',
on_delete=models.CASCADE
)
idTeam2 = models.ForeignKey(
Team, related_name='+',
on_delete=models.CASCADE
)
pointsTeam1 = models.SmallIntegerField()
pointsTeam2 = models.SmallIntegerField()
finished = models.BooleanField()
season = models.CharField(max_length=4)
#leagueShortcut = models.ForeignKey(Competition)
leagueShortcut = models.CharField(max_length=12)
def __unicode__(self):
return (str(self.matchID))
class Tipp(models.Model):
matchID = models.ForeignKey(Match)
tipperID = models.ForeignKey(User)
matchID = models.ForeignKey(
Match,
on_delete=models.CASCADE
)
tipperID = models.ForeignKey(
User,
on_delete=models.CASCADE
)
pointsTeam1 = models.PositiveSmallIntegerField()
pointsTeam2 = models.PositiveSmallIntegerField()
score = models.PositiveIntegerField(
@@ -82,58 +98,91 @@ class Tipp(models.Model):
class Meta:
unique_together = ("matchID", "tipperID")
class Mandant(models.Model):
name = models.CharField(max_length=32, unique=True)
description = models.CharField(max_length=255)
def __unicode__(self):
return self.name
class Score(models.Model):
client = models.ForeignKey(Mandant)
client = models.ForeignKey(
Mandant,
on_delete=models.CASCADE
)
exact_high = models.PositiveSmallIntegerField()
exact = models.PositiveSmallIntegerField()
diff = models.PositiveSmallIntegerField()
tendency = models.PositiveSmallIntegerField()
def __unicode__(self):
return str(self.client)
class chart(models.Model):
team = models.ForeignKey(Team)
competition = models.ForeignKey(Competition)
team = models.ForeignKey(
Team,
on_delete=models.CASCADE
)
competition = models.ForeignKey(
Competition,
on_delete=models.CASCADE
)
points = models.PositiveSmallIntegerField()
diff = models.SmallIntegerField()
games = models.PositiveSmallIntegerField()
class Meta:
unique_together = ("team", "competition")
class RelUserMandant(models.Model):
user = models.ForeignKey(User)
mandant = models.ForeignKey(Mandant)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
mandant = models.ForeignKey(
Mandant,
on_delete=models.CASCADE
)
class Meta:
unique_together = ("user", "mandant")
def __unicode__(self):
return (str(self.user) + " -> " + str(self.mandant))
class Post(models.Model):
content = models.TextField()
published = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User)
author = models.ForeignKey(
User,
on_delete=models.CASCADE
)
class Meta:
ordering = ['-created']
def __unicode__(self):
return u'%s' % self.created
class RelPostMandant(models.Model):
post = models.ForeignKey(Post)
mandant = models.ForeignKey(Mandant)
post = models.ForeignKey(
Post,
on_delete=models.CASCADE
)
mandant = models.ForeignKey(
Mandant,
on_delete=models.CASCADE
)
class Meta:
unique_together = ("post", "mandant")
def __unicode__(self):
return (str(self.post) + " -> " + str(self.mandant))

View File

@@ -18,50 +18,56 @@
# You should have received a copy of the GNU General Public License
# along with TipPy. If not, see <http://www.gnu.org/licenses/>.
#
import sys, locale, suds, urllib2, psycopg2
import locale
import urllib.error
import urllib.parse
import urllib.request
from suds.client import Client
class OpenLiga(object):
version = "0.1"
error = ""
proxyurl = None
debug = None
client = None
version = "0.1"
error = ""
proxyurl = None
debug = None
client = None
def __init__(self, proxyurl=None, debug=False):
# set locale to environment (for dispaying localized dates)
locale.setlocale(locale.LC_TIME, "")
locale.setlocale(locale.LC_TIME, "")
self.debug = debug
# get a SUDS client object
if self.proxyurl is None:
try:
self.client = suds.client.Client(
'http://www.openligadb.de/'
+ 'Webservices/Sportsdata.asmx?WSDL')
except (urllib2.URLError):
self.client = Client(
'http://www.openligadb.de/'
+ 'Webservices/Sportsdata.asmx?WSDL')
except (urllib.error.URLError):
self.error += "Connect to webservice failed."
else:
try:
t = suds.transport.http.HttpTransport()
proxy = urllib2.ProxyHandler({'http':proxyurl})
opener = urllib2.build_opener(proxy)
proxy = urllib.request.ProxyHandler({'http': proxyurl})
opener = urllib.request.build_opener(proxy)
t.urlopener = opener
self.client = suds.client.Client(
'http://www.openligadb.de/Webservices/'
+ 'Sportsdata.asmx?WSDL', transport=t)
except urllib2.URLError as e:
'http://www.openligadb.de/Webservices/'
+ 'Sportsdata.asmx?WSDL', transport=t)
except urllib.error.URLError as e:
self.error += "Connect to webservice failed " \
+ "(via proxy " + proxyurl + "): " + str(e) + "\n"
+ "(via proxy " + proxyurl + "): " + str(e) + "\n"
def getSeason(self, season, league='bl1'):
""" Get the whole season.
Args: season and league shortcut (optional)
"""
return(self.client.service.GetMatchdataByLeagueSaison(
leagueShortcut=league,leagueSaison=season)
return (self.client.service.GetMatchdataByLeagueSaison(
leagueShortcut=league, leagueSaison=season)
)
def getMatchday(self, season, matchdaynumber, league='bl1'):
@@ -69,24 +75,19 @@ class OpenLiga(object):
Args: season, matchdaynumber and league shortcut (optional)
"""
return(self.client.service.GetMatchdataByGroupLeagueSaison(
return (self.client.service.GetMatchdataByGroupLeagueSaison(
groupOrderID=matchdaynumber,
leagueShortcut=league,
leagueSaison=season)
)
def getTeams(self, season, league='bl1'):
return(self.client.service.GetTeamsByLeagueSaison(
return (self.client.service.GetTeamsByLeagueSaison(
leagueShortcut=league,
leagueSaison=season)
)
def getCurrentGroup(self, league):
return(self.client.service.GetCurrentGroup(
return (self.client.service.GetCurrentGroup(
leagueShortcut=league)
)
def getAvailLeagues(self):
return(self.client.service.GetAvailLeaguesBySports(1))

33
tipp/urls.py Normal file
View File

@@ -0,0 +1,33 @@
from django.contrib.auth import views as auth_views
from django.urls import re_path
from django.conf.urls import include
from django.conf import settings
from django.conf.urls.static import static
from . import views
urlpatterns = [
re_path(r'^$', views.home, name='home'),
re_path(r'^getSeason/(?P<ls>.*)/(?P<season>\d{4})$',
views.getSeason),
re_path(r'^update/(?P<ls>.*)/(?P<season>\d{4})/(?P<cur_md>\d{2})$',
views.update, name='update'),
re_path(r'^matchday/(?P<ls>.{3,})/(?P<season>\d{4})/(?P<matchday>\d{2})$',
views.matchday, name='matchday'),
re_path(r'^charts/(?P<ls>\w{3,})/(?P<season>\d{4})$', views.charts,
name='charts'),
re_path(r'^charts/(?P<ls>\w{3,})/(?P<season>\d{4})/(?P<pos>\w{1,})$',
views.charts, name='charts'),
re_path(r'^accounts/profile/(\d+)', views.profile),
re_path(r'^accounts/', include('django.contrib.auth.urls')),
re_path(r'^blog/newpost$', views.newBlogpost),
re_path(r'^blog/(?P<page>\d)$', views.blogindex),
re_path(r'^about$', views.about),
re_path(r'^staff', views.staff),
re_path(r'^accounts/login/', auth_views.LoginView.as_view()),
re_path(r'^accounts/logout/', auth_views.LogoutView.as_view())
]
# Redirect on logout
LOGOUT_REDIRECT_URL = "home"
if settings.DEBUG is True:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
"""
Copyright (c) 2015-2016 by Martin Bley (martin@mb-oss.de)
Copyright (c) 2015-2016 by Martin Bley (dev@mb-oss.de)
This file is part of TipPy.
@@ -17,41 +17,32 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TipPy. If not, see <http://www.gnu.org/licenses/>.
"""
from django.http import HttpResponse
from django.shortcuts import render_to_response, redirect, render, \
get_object_or_404
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.views import password_reset, \
password_reset_confirm
from django.core.context_processors import csrf
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.core.paginator import Paginator, InvalidPage, EmptyPage, \
PageNotAnInteger
from django.utils import timezone
from django.utils.text import slugify
from django.db.models import Sum, Max
from django.conf import settings
"""
import os
from os.path import join as pjoin
from tipp.models import *
from tipp.forms import *
from openliga import *
from datetime import datetime
from PIL import Image as PImage
import urllib2, pytz, os, sys
# setting utf-8 as default encoding to avoid errors in file
# uploads and form data
reload(sys)
sys.setdefaultencoding('utf8')
import django.shortcuts
import pytz
from PIL import Image as PImage
from django.conf import settings
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ObjectDoesNotExist
from django.core.paginator import Paginator, EmptyPage, \
PageNotAnInteger
from django.db.models import Sum
from django.http import HttpResponseRedirect
from django.utils import timezone
from tipp.forms import *
from tipp.models import *
from tipp.openliga import *
timezoneLocal = pytz.timezone('Europe/Berlin')
def about(request):
return render(request, 'about.html')
return django.shortcuts.render(request, 'about.html')
@login_required
@@ -60,11 +51,12 @@ def home(request):
season = get_current_season()
md = get_current_md(ls)
return redirect("matchday",
ls = ls,
season = season,
matchday=str(md).zfill(2)
)
return django.shortcuts.redirect("matchday",
ls=ls,
season=season,
matchday=str(md).zfill(2)
)
@login_required
def profile(request, pk):
@@ -75,7 +67,7 @@ def profile(request, pk):
img = profile.avatar.name
else:
img = None
debug = []
debug.append('avatar: ' + str(img))
@@ -87,7 +79,7 @@ def profile(request, pk):
)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
profile = profile_form.save(commit=False)
@@ -102,92 +94,74 @@ def profile(request, pk):
# create thumbnail
imfn = pjoin(settings.MEDIA_ROOT, profile.avatar.name)
im = PImage.open(imfn)
im.thumbnail((50,50), PImage.ANTIALIAS)
im.thumbnail((50, 50), PImage.ANTIALIAS)
im.save(settings.MEDIA_ROOT + profile.avatar.name)
if 'avatar-clear' in request.POST:
if 'on' in request.POST['avatar-clear']:
image = pjoin(settings.MEDIA_ROOT, img)
debug.append('Is the image ' + str(image)
+ ' a regular file? '
+ str(os.path.isfile(image))
)
debug.append('Is the image ' + str(image)
+ ' a regular file? '
+ str(os.path.isfile(image))
)
if os.path.isfile(image):
os.remove(image)
profile.save()
for item in request.POST:
debug.append(str(item) + " -> "
+ str(request.POST[item])
)
debug.append(str(item) + " -> "
+ str(request.POST[item])
)
# Invalid form or forms - mistakes or something else?
# Print problems to the terminal.
# They'll also be shown to the user.
else:
print user_form.errors, profile_form.errors
print(
user_form.errors,
profile_form.errors
)
return redirect( '/accounts/profile/' + str(user.id) )
return django.shortcuts.redirect('/accounts/profile/' + str(user.id))
# Not a HTTP POST, so we render our form using two ModelForm
# instances. These forms will be blank, ready for user input.
else:
user_form = UserForm(
initial={ 'last_name': user.last_name,
'first_name': user.first_name,
'email': user.email },
initial={'last_name': user.last_name,
'first_name': user.first_name,
'email': user.email},
instance=user
)
profile_form = UserProfileForm(instance=profile)
return render(request, 'registration/profile.html', {
'user_form': user_form,
return django.shortcuts.render(request, 'registration/profile.html', {
'user_form': user_form,
'profile_form': profile_form,
#'debug': debug,
'debug': debug,
'img': img}
)
)
@user_passes_test(lambda u: u.is_superuser)
def adminpage(request, pos='default', template_name='adminpage.html'):
debug = []
lss = Match.objects.values('leagueShortcut').distinct(). \
values_list('leagueShortcut', flat=True)
leagues = Competition.objects.values('leagueShortcut', 'leagueName').\
filter(leagueShortcut__in=lss)
@staff_member_required
def staff(request):
season = get_current_season(),
""" get available competitions """
competitions = Competition.objects.filter(season=season).order_by('leagueName')
ol = OpenLiga()
avail_leagues = []
for l in ol.getAvailLeagues()[0]:
if int(l["leagueSaison"]) >= int(get_current_season()):
avail_leagues.append({
'leagueID' : l["leagueID"],
'leagueShortcut' : l["leagueShortcut"],
'leagueName' : l["leagueName"],
'leagueSaison' : l["leagueSaison"]
})
form_leagues = LeagueImportForm()
form_leagues.fields["leagues"].choices = avail_leagues
return render(request, template_name, {
'debug': debug,
'leagues': leagues,
'avail_leagues': avail_leagues
})
return django.shortcuts.render(request, 'staff.html', {'competitions': competitions})
@staff_member_required
def getSeason(request, ls, season):
ol = OpenLiga()
teams = ol.getTeams(str(season), ls)
season = ol.getSeason(str(season), ls)
md = get_current_md(ls)
return_vals = []
for team in teams[0]:
t = Team(
teamID=team['teamID'],
name=team['teamName'],
iconURL = team['teamIconURL']
iconURL=team['teamIconURL']
)
"""
@@ -195,36 +169,34 @@ def getSeason(request, ls, season):
"""
try:
to = Team.objects.get(teamID=int(t.teamID))
if to.iconURL is None:
t.save(update_fields=['iconURL'])
except Team.DoesNotExist:
t.save()
if to.iconURL is None:
t.save(update_fields=['iconURL'])
for match in season[0]:
m = Match(matchID=unicode(match['matchID']),
matchDateTime=datetime.strptime(
unicode(match['matchDateTime']), '%Y-%m-%d %H:%M:%S'),
group=int(match['groupID']),
matchday=int(match['groupOrderID']),
matchday_name=unicode(match['groupName']),
idTeam1=Team.objects.get(teamID=int(match['idTeam1'])),
idTeam2=Team.objects.get(teamID=int(match['idTeam2'])),
pointsTeam1=match['pointsTeam1'],
pointsTeam2=match['pointsTeam2'],
finished=bool(match['matchIsFinished']),
season=match['leagueSaison'],
leagueShortcut=match['leagueShortcut']
)
m = Match(matchID=match['matchID'],
matchDateTime=match['matchDateTime'],
group=int(match['groupID']),
matchday=int(match['groupOrderID']),
matchday_name=match['groupName'],
idTeam1=Team.objects.get(teamID=int(match['idTeam1'])),
idTeam2=Team.objects.get(teamID=int(match['idTeam2'])),
pointsTeam1=match['pointsTeam1'],
pointsTeam2=match['pointsTeam2'],
finished=bool(match['matchIsFinished']),
season=match['leagueSaison'],
leagueShortcut=match['leagueShortcut']
)
m.save()
return redirect("matchday",
ls=ls,
season=get_current_season(),
matchday=str(get_current_md(ls)).zfill(2)
)
return django.shortcuts.redirect("matchday",
ls=ls,
season=get_current_season(),
matchday=str(get_current_md(ls)).zfill(2)
)
@login_required
def update(request, ls, season, cur_md):
"""
@@ -233,7 +205,7 @@ def update(request, ls, season, cur_md):
"""
ol = OpenLiga()
md_matches = ol.getMatchday(str(season), int(cur_md) ,ls)
md_matches = ol.getMatchday(str(season), int(cur_md), ls)
# Achtung: DateTimeField prüfen
for match in md_matches[0]:
@@ -242,40 +214,46 @@ def update(request, ls, season, cur_md):
try:
for result in matchResults[0]:
if result['resultName'] == "Halbzeit":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
pointsTeam1 = int(result['pointsTeam1'])
pointsTeam2 = int(result['pointsTeam2'])
elif result['resultName'] == "Endergebnis":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
pointsTeam1 = int(result['pointsTeam1'])
pointsTeam2 = int(result['pointsTeam2'])
break
elif str(result['resultName']) == u"nach Verlängerung":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
pointsTeam1 = int(result['pointsTeam1'])
pointsTeam2 = int(result['pointsTeam2'])
else:
pointsTeam1=-1
pointsTeam2=-1
pointsTeam1 = -1
pointsTeam2 = -1
except:
pointsTeam1=-1
pointsTeam2=-1
pointsTeam1 = -1
pointsTeam2 = -1
m = Match(matchID=unicode(match['matchID']),
matchDateTime=match['matchDateTime'],
pointsTeam1=pointsTeam1,
pointsTeam2=pointsTeam2,
finished=bool(match['matchIsFinished']),
)
m = Match(matchID=match['matchID'],
matchDateTime=match['matchDateTime'],
pointsTeam1=pointsTeam1,
pointsTeam2=pointsTeam2,
finished=bool(match['matchIsFinished']),
)
m.save(update_fields=['matchDateTime', 'pointsTeam1', 'pointsTeam2', 'finished'])
pointsTeam1=-1
pointsTeam2=-1
pointsTeam1 = -1
pointsTeam2 = -1
# evaluate scores
scores = Score.objects.get(client=Mandant.objects.get(name='huse'))
finished_matches=Match.objects.filter(
finished=True,
# evaluate scores
""" get mandants current user is related """
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
# scores = Score.objects.get(client=Mandant.objects.get(name='huse'))
scores = Score.objects.get(client=mandants[0])
finished_matches = Match.objects.filter(
finished=True,
leagueShortcut=ls,
season=season,
matchday = cur_md
matchday=cur_md
)
for match in finished_matches:
tipps = Tipp.objects.filter(matchID=match.matchID)
@@ -284,8 +262,8 @@ def update(request, ls, season, cur_md):
goals_total = match.pointsTeam1 + match.pointsTeam2
# Tipp is acurate
if (tipp.pointsTeam1 == match.pointsTeam1
and tipp.pointsTeam2 == match.pointsTeam2):
if (tipp.pointsTeam1 == match.pointsTeam1
and tipp.pointsTeam2 == match.pointsTeam2):
if goals_total >= 5:
score = scores.exact_high
else:
@@ -294,29 +272,29 @@ def update(request, ls, season, cur_md):
tipp.score = score
tipp.save()
continue
# who won?
winnerReal = None
if match.pointsTeam1 > match.pointsTeam2:
winnerReal = 1
elif (match.pointsTeam2 > match.pointsTeam1):
elif match.pointsTeam2 > match.pointsTeam1:
winnerReal = 2
elif (match.pointsTeam1 == match.pointsTeam2):
elif match.pointsTeam1 == match.pointsTeam2:
winnerReal = 0
winnerTipp = None
if tipp.pointsTeam1 > tipp.pointsTeam2:
winnerTipp = 1
elif (tipp.pointsTeam2 > tipp.pointsTeam1):
elif tipp.pointsTeam2 > tipp.pointsTeam1:
winnerTipp = 2
elif (tipp.pointsTeam1 == tipp.pointsTeam2):
elif tipp.pointsTeam1 == tipp.pointsTeam2:
winnerTipp = 0
diffReal = match.pointsTeam1 - match.pointsTeam2
diffTipp = tipp.pointsTeam1 - tipp.pointsTeam2
if ( winnerTipp == winnerReal ):
if ( diffTipp == diffReal ):
if winnerTipp == winnerReal:
if diffTipp == diffReal:
score = scores.diff
else:
score = scores.tendency
@@ -329,21 +307,23 @@ def update(request, ls, season, cur_md):
tipp.save()
continue
return redirect("matchday",
ls=ls,
season=season,
matchday=cur_md
)
return django.shortcuts.redirect("matchday",
ls=ls,
season=season,
matchday=cur_md
)
@login_required
def matchday(request, ls, season, matchday, template_name='md.html'):
update(request, ls, season, matchday)
debug = ''
debug += "Debugging: "
has_refresh = True
""" get matches of the matchday """
md_matches = Match.objects.filter(leagueShortcut=ls, season=season,
matchday=int(matchday)).order_by('matchDateTime')
md_matches = Match.objects.filter(leagueShortcut=ls, season=season,
matchday=int(matchday)).order_by('matchDateTime')
""" get the current user """
user = User.objects.get(username=request.user.username)
@@ -351,7 +331,7 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
""" get mandants current user is related """
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
""" get mates """
mandant_dict = {}
for m in mandants:
@@ -360,8 +340,8 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
rs = RelUserMandant.objects.filter(mandant=m)
for r in rs:
mandant_dict[mandant.description].append({
'mate': r.user,
mandant_dict[mandant.description].append({
'mate': r.user,
'tipps': [],
'sum_score': 0
})
@@ -378,7 +358,7 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
"""
try:
tipp = Tipp.objects.get(tipperID=user.id,
matchID=match.matchID)
matchID=match.matchID)
except ObjectDoesNotExist:
tipp = None
@@ -391,52 +371,52 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
if tipp is not None:
""" Tipp exists an needs an UPDATE"""
tipp = Tipp(id=tipp.pk,
matchID=match,
tipperID=user,
pointsTeam1=data['tippTeam1'],
pointsTeam2=data['tippTeam2']
)
matchID=match,
tipperID=user,
pointsTeam1=data['tippTeam1'],
pointsTeam2=data['tippTeam2']
)
tipp.save()
else:
else:
""" do INSERT """
tipp = Tipp( matchID=match,
tipperID=user,
pointsTeam1=data['tippTeam1'],
pointsTeam2=data['tippTeam2'])
tipp = Tipp(matchID=match,
tipperID=user,
pointsTeam1=data['tippTeam1'],
pointsTeam2=data['tippTeam2'])
tipp.save()
match_started = timezone.now() >= match.matchDateTime
if tipp is not None:
f = TippForm(prefix=str(match.matchID),
initial={'tippTeam1': tipp.pointsTeam1,
'tippTeam2': tipp.pointsTeam2}
)
initial={'tippTeam1': tipp.pointsTeam1,
'tippTeam2': tipp.pointsTeam2}
)
else:
f = TippForm(prefix=str(match.matchID))
item = {}
item['matchDateTime'] = (match.matchDateTime. \
astimezone(timezoneLocal).strftime('%a %d.%m, %H:%M'))
item['matchDateTime'] = (match.matchDateTime.
astimezone(timezoneLocal).strftime('%a %d.%m, %H:%M'))
item['iconTeam1']= str(match.idTeam1.icon)
item['iconTeam1'] = str(match.idTeam1.icon)
item['iconURLTeam1'] = str(match.idTeam1.iconURL)
item['nameTeam1']= str(match.idTeam1)
item['abbrTeam1']= str(match.idTeam1.abbr)
item['nameTeam1'] = str(match.idTeam1.name)
item['abbrTeam1'] = str(match.idTeam1.abbr)
item['iconTeam2'] = str(match.idTeam2.icon)
item['iconURLTeam2'] = str(match.idTeam2.iconURL)
item['nameTeam2'] = str(match.idTeam2)
item['abbrTeam2']= str(match.idTeam2.abbr)
item['nameTeam2'] = str(match.idTeam2.name)
item['abbrTeam2'] = str(match.idTeam2.abbr)
item['started'] = match_started
item['finished'] = match.finished
item['md_name'] = match.matchday_name
if (match.pointsTeam1 == -1 or match.pointsTeam2 == -1):
if (match.pointsTeam1 == -1 or match.pointsTeam2 == -1):
item['matchResult'] = "-:-"
else:
item['matchResult'] = str(match.pointsTeam1) + ":" \
+ str(match.pointsTeam2)
+ str(match.pointsTeam2)
item['tippFormTeam1'] = f['tippTeam1']
item['tippFormTeam2'] = f['tippTeam2']
@@ -450,27 +430,26 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
for mate in mandant_dict[mandant]:
try:
matetipp = Tipp.objects.get(tipperID=mate['mate'],
matchID=match.matchID)
matchID=match.matchID)
if match_started is True:
if matetipp.score is None:
score = u'\u231B'
else:
score = matetipp.score
mate['tipps'].append(str(matetipp.pointsTeam1)
+ ":" + str(matetipp.pointsTeam2)
+ "(" + str(score) + ")")
mate['tipps'].append(str(matetipp.pointsTeam1)
+ ":" + str(matetipp.pointsTeam2)
+ "(" + str(score) + ")")
if match.finished is True:
mate['sum_score'] += matetipp.score
else:
mate['tipps'].append(u'\u2714')
mate['tipps'].append(u'\u2714')
except Exception as e:
mate['tipps'].append(u'\u2717')
""" sort items in mandant_dict by score """
mandant_dict[mandant] = sorted(mandant_dict[mandant],
key=lambda k: k['sum_score'], reverse=True)
mate['tipps'].append(u'\u2717')
""" sort items in mandant_dict by score """
mandant_dict[mandant] = sorted(mandant_dict[mandant],
key=lambda k: k['sum_score'], reverse=True)
matches.append(item)
@@ -478,58 +457,58 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
pm = RelPostMandant.objects.filter(mandant__in=mandants). \
values_list('post', flat=True)
posts = []
for post in Post.objects.filter(id__in=pm, published=True)[:1]:
for post in Post.objects.filter(id__in=pm, published=True)[:5]:
try:
avatar = UserProfile.objects.get(user_id=post.author_id). \
avatar.name
except:
except:
avatar = None
posts.append( (post, avatar) )
posts.append((post, avatar))
try:
cur_group = matches[0]['md_name']
cur_group = matches[0]['md_name']
except:
cur_group = "N/A"
debug += str(mandant_dict)
return render(request, 'md.html', {
'debug': debug,
#'mds_season': mds_in_season,
return django.shortcuts.render(request, 'md.html', {
'debug': debug,
# 'mds_season': mds_in_season,
'cur_md': matchday,
'md_name': cur_group,
'matches': matches,
'matches': matches,
'ls': ls,
'season': season,
'username': user,
'mandant_dict': mandant_dict,
#'tipp_mates': sorted(tipp_mates, key=lambda k: k['sum_score'],
#reverse=True),
# 'tipp_mates': sorted(tipp_mates, key=lambda k: k['sum_score'],
# reverse=True),
'posts': posts,
'has_refresh': has_refresh
})
@login_required
def charts(request, ls, season, pos='default',
template_name='charts.html'):
@login_required
def charts(request, ls, season, pos='default',
template_name='charts.html'):
debug = ''
if pos == 'default':
if get_current_md(ls) < 18:
if get_current_md(ls) < 18:
pos = 'hin'
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__lte=17)
else:
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__lte=17)
else:
pos = 'rueck'
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__gte=18)
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__gte=18)
elif pos == 'hin':
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__lte=17)
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__lte=17)
elif pos == 'rueck':
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__gte=18)
matches = Match.objects.filter(leagueShortcut=ls,
season=season, matchday__gte=18)
else:
matches = Match.objects.filter(leagueShortcut=ls, season=season)
@@ -550,25 +529,26 @@ def charts(request, ls, season, pos='default',
for userid in users:
# get user object, then fetch matches for user
user = User.objects.get(id=userid)
score = Tipp.objects.filter(matchID__in=matches, \
tipperID=user).aggregate(Sum('score'))
score = Tipp.objects.filter(matchID__in=matches,
tipperID=user).aggregate(Sum('score'))
if score['score__sum'] is None:
user_dict[user.first_name] = 0
else:
user_dict[user.first_name] = score['score__sum']
mandant_dict[mandant.name] = sorted(user_dict.items(),
key=lambda x: x[1], reverse=True)
mandant_dict[mandant.name] = sorted(user_dict.items(),
key=lambda x: x[1], reverse=True)
return render(request, template_name, {
#'debug': debug,
return django.shortcuts.render(request, template_name, {
# 'debug': debug,
'mandant_dict': mandant_dict,
'season': season,
'ls': ls,
'pos': pos
})
@login_required
def blogindex(request, page):
# get the blog posts that are published
@@ -583,9 +563,9 @@ def blogindex(request, page):
try:
avatar = UserProfile.objects.get(user_id=post.author_id). \
avatar.name
except:
except:
avatar = None
post_list.append( (post, avatar) )
post_list.append((post, avatar))
p = Paginator(post_list, 5)
@@ -596,13 +576,14 @@ def blogindex(request, page):
except EmptyPage:
posts = p.page(p.num_pages)
return render(request, 'blogindex.html', {
return django.shortcuts.render(request, 'blogindex.html', {
'posts': posts,
'ls': get_current_ls(),
'season': get_current_season(),
'page': page
})
@login_required
def newBlogpost(request):
debug = ''
@@ -611,10 +592,10 @@ def newBlogpost(request):
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
choices = []
if mandants.count > 1:
if mandants.count() > 1:
has_mandant = True
for m in Mandant.objects.filter(id__in=mandants):
choices.append( (m.name, m.description) )
choices.append((m.name, m.description))
if request.method == 'POST':
form_bp = BlogpostForm(request.POST)
@@ -630,31 +611,32 @@ def newBlogpost(request):
if has_mandant is True and form_mandant.is_valid():
data = form_mandant.cleaned_data
for m in data['mandants']:
debug += str(m) + " "
m = RelPostMandant(post=p,
mandant=Mandant.objects.get(name=m))
debug += str(m) + " "
m = RelPostMandant(post=p,
mandant=Mandant.objects.get(name=m))
m.save()
else:
m = RelPostMandant(post=p,
mandant=Mandant.objects.get(id=mandants[0]))
m = RelPostMandant(post=p,
mandant=Mandant.objects.get(id=mandants[0]))
m.save()
return redirect( '/blog/1')
return django.shortcuts.redirect('/blog/1')
blogpostForm = BlogpostForm()
form_mandant = MandantsForm()
form_mandant.fields["mandants"].choices = choices
cnt_mandants = len(choices)
return render(request, 'newblogpost.html', {
'debug': debug,
return django.shortcuts.render(request, 'newblogpost.html', {
'debug': debug,
'form_bp': blogpostForm,
'form_mandants': form_mandant,
'cnt_mandants' : cnt_mandants,
'cnt_mandants': cnt_mandants,
'ls': get_current_ls(),
'season': get_current_season()
})
def logout(request):
"""
Log users out and re-direct them to the main page.
@@ -662,6 +644,7 @@ def logout(request):
logout(request)
return HttpResponseRedirect('/')
def get_current_md(ls):
"""
get current matchday()
@@ -674,14 +657,15 @@ def get_current_md(ls):
try:
ol = OpenLiga()
cur_md = ol.getCurrentGroup(ls)
except:
except:
cur_md = {'groupName': u"1. Spieltag", 'groupOrderID': 1}
return(cur_md['groupOrderID'])
return (cur_md['groupOrderID'])
def get_current_ls():
return("bl1")
return ("bl1")
def get_current_season():
return("2016")
return ("2022")

View File

@@ -1 +0,0 @@
__version__ = '1.0.1'

View File

@@ -1,188 +0,0 @@
"""
Django settings for tippy project.
For more information on this file, see
https://docs.djangoproject.com/en/1.7/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.7/ref/settings/
"""
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# Django settings for tippy project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
('Martin Bley', 'martin@mb-oss.de'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'tippy',
'USER': 'tippy',
'PASSWORD': 'tippy',
'HOST': 'localhost',
'PORT': '5432',
}
}
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['*']
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'Europe/Berlin'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'de-de'
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = '/home/martin/dev/TipPy/src/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
'/home/martin/dev/TipPy/src/tippy/static/',
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
# Make this unique, and don't share it with anybody.
SECRET_KEY = '-7%ge^nl1b0t0694%ws&amp;0$ft_lo)j4l1f-qv#ku^=$)s(sw6us'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'tippy.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'tippy.wsgi.application'
TEMPLATE_DIRS = (
[os.path.join(BASE_DIR, 'templates')]
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
'django.contrib.admindocs',
'tipp',
)
# URL of the login page.
LOGIN_URL = '/login'
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
EMAIL_USE_TLS = True
EMAIL_HOST = 'hermes.mb-oss.de'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'tippy@mb-oss.de'
#EMAIL_HOST_PASSWORD = 'p@ssword'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER
SESSION_COOKIE_AGE = 7200
AUTH_PROFILE_MODULE = 'tippy.UserProfile'

View File

@@ -1,46 +0,0 @@
from django.conf.urls import patterns, include, url
from django.conf import settings
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
url(r'^$', 'tipp.views.home', name='home'),
url(r'^login$', 'django.contrib.auth.views.login', {
'template_name': 'login.html'}),
url(r'^logout$', 'django.contrib.auth.views.logout', {
'next_page': '/'}),
url(r'^getSeason/(?P<ls>.*)/(?P<season>\d{4})$',
'tipp.views.getSeason'),
url(r'^update/(?P<ls>.*)/(?P<season>\d{4})/(?P<cur_md>\d{2})$',
'tipp.views.update', name='update'),
url(r'^matchday/(?P<ls>.{3,})/(?P<season>\d{4})/(?P<matchday>\d{2})$',
'tipp.views.matchday', name='matchday'),
url(r'^charts/(?P<ls>\w{3,})/(?P<season>\d{4})$', 'tipp.views.charts',
name='charts'),
url(r'^charts/(?P<ls>\w{3,})/(?P<season>\d{4})/(?P<pos>\w{1,})$',
'tipp.views.charts', name='charts'),
url(r'^accounts/profile/(\d+)', 'tipp.views.profile'),
url(r'^accounts/', include('django.contrib.auth.urls')),
url(r'^blog/newpost$', 'tipp.views.newBlogpost'),
url(r'^blog/(?P<page>\d)$', 'tipp.views.blogindex'),
url(r'^adminpage$', 'tipp.views.adminpage'),
url(r'^about$', 'tipp.views.about'),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
if settings.DEBUG:
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT,
}),
)

View File

@@ -1,28 +0,0 @@
"""
WSGI config for tippy project.
This module contains the WSGI application used by Django's development server
and any production WSGI deployments. It should expose a module-level variable
named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
this application via the ``WSGI_APPLICATION`` setting.
Usually you will have the standard Django WSGI application here, but it also
might make sense to replace the whole Django WSGI application with a custom one
that later delegates to the Django one. For example, you could introduce WSGI
middleware here, or combine a Django application with an application of another
framework.
"""
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tippy.settings")
# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)