31 Commits
iss02 ... iss16

Author SHA1 Message Date
2fa6dd0709 Keine Ahnung / not known 2018-06-22 15:03:25 +02:00
91f210883f stuff on adminpage 2017-10-03 18:31:14 +02:00
c21e0d3292 added new page for admistrative purpose 2017-10-02 18:59:30 +02:00
Martin Bley
565bb3963e Fixed issue #15 2016-12-21 11:04:30 +01:00
3b2deb865e Merge branch 'iss07' (about) 2016-11-23 18:52:20 +01:00
a221c0e37d Fixed iss#07 (About) 2016-11-23 18:48:33 +01:00
de3e844089 Fixed ticket #14 2016-11-23 17:58:37 +01:00
72be0aebdb Sorted mate table 2016-10-06 21:04:19 +02:00
929b540753 Changed width of TippForm to be able to see the values 2016-10-06 11:33:15 +02:00
b44d31d128 Fix of iss11 2016-10-06 11:20:49 +02:00
26833e389a No output in mate list 2016-10-06 10:45:18 +02:00
ffed1ef6e8 Fixed issue #13 2016-10-06 09:59:26 +02:00
db5ece431b Work on issue 11 2016-09-22 17:31:19 +02:00
20ef745b3f Uncomitted changes 2016-09-22 16:37:05 +02:00
45293586a7 Fixed issues in getSeason() 2016-08-20 13:58:35 +02:00
8f9398ced5 Don't know 2016-07-17 11:48:14 +02:00
589884c4be Fixed long lines 2016-06-24 16:11:43 +02:00
5c3c56ecc3 Implemented selection of mandants when posting blog items 2016-06-23 15:03:12 +02:00
6042838f28 Fixed getSeason() and update() in views.py 2016-06-23 10:51:12 +02:00
c2eede9500 Implemented mandant based blog posts 2016-06-17 22:37:43 +02:00
e3ef06a41a Minor changes 2016-06-14 12:49:10 +02:00
9be82123da Better update() using a nother query 2016-06-13 21:27:31 +02:00
911b19068c Renewed get_current_md() based on OL method 2016-06-11 17:09:13 +02:00
c02f137c0b fixed some issues regarding template 2016-06-10 17:54:59 +02:00
538f6262fd modified for EURO 2016 2016-06-10 17:36:02 +02:00
4b2f7e4641 Finished templates for new HTTP method 2016-06-08 08:15:54 +02:00
d99eee4751 Merge branch 'iss02' 2016-06-07 18:20:35 +02:00
5a0a1daa39 finished import function 2016-06-07 18:19:22 +02:00
20f0a836e5 new url for import added 2016-06-07 17:24:15 +02:00
c0eb583a69 import function created 2016-06-07 17:22:28 +02:00
7292957497 Don't know 2016-06-07 16:52:22 +02:00
15 changed files with 552 additions and 165 deletions

1
.gitignore vendored
View File

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

29
templates/about.html Normal file
View File

@@ -0,0 +1,29 @@
{% 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>Über TipPy</h2>
<p>TipPy ist eine responsive Web-Applikation für Tippspiele mit
einem "Mobile-First-Ansatz" . Unterstützt werden alle auf
<a href="http://www.OpenLigaDB.de">OpenLigaDB</a> bereitgestellten
Sportarten und Ligen.
TipPy wurde in <a href="http://www.python.org">Python</a> umgesetzt
und benutzt die Frameworks <a href="http://www.django.org">Django</a>
als Web Application Framework, und Twitters <a href="www.getbootstrap.com">
Bootstrap</a> für CSS.</p>
</div>
</div>
</div>
{% endblock %}

68
templates/adminpage.html Normal file
View File

@@ -0,0 +1,68 @@
{% 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

@@ -40,7 +40,7 @@
<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>
{{ cur_md }}. Spieltag
{{ 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>
@@ -51,18 +51,26 @@
<th>Anstoß</th>
<th>Heim</th>
<th>Gast</th>
<th>Erg.></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>
<td><img src="{{ STATIC_URL}}{{ match.iconTeam1 }}" />
{% 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>
<td><img src="{{ STATIC_URL}}{{ match.iconTeam2 }}" />
{% 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>
@@ -79,30 +87,43 @@
</div>
</div>
<div class="row">
<div class="col-md-7">
<h2>Mitspieler</h2>
<div class="table-responsive">
<table class="table table-hover table-condensed">
<tr>
<th>Tipper</th>
<th>Gesamt</th>
{% for match in matches %}
<th><img src="{{ STATIC_URL }}{{ match.iconTeam1 }}" /><br /><br />
<img src="{{ STATIC_URL }}{{ match.iconTeam2 }}" /></th>
{% endfor %}
</tr>
{% for mate in tipp_mates %}
{% 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>
<td>{{ mate.mate }}</td>
<td>{{ mate.sum_score }}</td>
{% for tipp in mate.tipps %}
<td>{{ tipp }}</td>
<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>
{% endfor %}
</table>
{% 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>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -9,13 +9,16 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand">TipPy 1.0</span>
<a class="navbar-brand" href="/about">TipPy 1.0</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<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>
{% endif %}
</ul>
<ul class="nav navbar-nav navbar-right">
{% if has_refresh %}

View File

@@ -10,10 +10,10 @@
{% block body %}
<div id="content-main">
{% if form.errors %}
{% if form_bp.errors %}
<div>
<p class="errornote">
{% if form.errors.items|length == 1 %}
{% if form_bp.errors.items|length == 1 %}
{% trans "Please correct the error below." %}
{% else %}
{% trans "Please correct the errors below." %}
@@ -24,10 +24,19 @@
<div class="col-md-8">
<form class="form-horizontal" action="" method="post">{% csrf_token %}
<div class="form-group">
{{form.content.errors}}
{{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>
<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>
<div class="form-group">
@@ -38,5 +47,12 @@
</form>
</div>
</div>
{% if debug %}
<div class="row">
<div class="col-md-8">
<p>{{ debug }}</p>
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License
along with TipPy. If not, see <http://www.gnu.org/licenses/>.
"""
from tipp.models import Team, Match, Tipp, Score, Mandant, RelUserMandant, Competition, Post, UserProfile
from tipp.models import *
from django.contrib import admin
class PostAdmin(admin.ModelAdmin):
@@ -41,4 +41,5 @@ admin.site.register(Score)
admin.site.register(RelUserMandant)
admin.site.register(Competition)
admin.site.register(Post, PostAdmin)
admin.site.register(RelPostMandant)

View File

@@ -22,32 +22,43 @@ from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User
from django.core.files.images import get_image_dimensions
from tipp.models import Match, Competition, Post, UserProfile
from tipp.models import Match, Competition, Post, UserProfile, \
Mandant, RelUserMandant
class NumberInput(forms.TextInput):
input_type = 'number'
class TippForm(forms.Form):
tippTeam1 = forms.IntegerField(required=True,widget=NumberInput(attrs={
'cols': '2',
'min': '0', 'max': '99', 'step': '1',
'class':'form-inline',
'role': 'form'}
tippTeam1 = forms.IntegerField(required=True,widget=NumberInput(
attrs={
'cols': '2',
'min': '0', 'max': '99', 'step': '1',
'class':'form-inline',
'role': 'form'
}
))
tippTeam2 = forms.IntegerField(required=True,widget=NumberInput(attrs={
'cols': '2',
'min': '0', 'max': '99', 'step': '1',
'class':'form-inline',
'role': 'form'}
tippTeam2 = forms.IntegerField(required=True,widget=NumberInput(
attrs={
'cols': '2',
'min': '0', 'max': '99', 'step': '1',
'class':'form-inline',
'role': 'form'
}
))
tippTeam1.widget.attrs['style'] = "width:35px"
tippTeam2.widget.attrs['style'] = "width:35px"
tippTeam1.widget.attrs['style'] = "width:45px"
tippTeam2.widget.attrs['style'] = "width:45px"
class BlogpostForm(ModelForm):
class Meta:
model = Post
fields = ['content']
class MandantsForm(forms.Form):
mandants = forms.MultipleChoiceField(
label= "Posten in ",
widget=forms.CheckboxSelectMultiple({'checked':'checked'})
)
class UserForm(forms.ModelForm):
class Meta:
model = User
@@ -58,3 +69,9 @@ class UserProfileForm(forms.ModelForm):
model = UserProfile
fields = ['avatar']
class LeagueImportForm(forms.Form):
leagues = forms.ChoiceField(
widget=forms.RadioSelect()
)

View File

@@ -42,29 +42,32 @@ class Team(models.Model):
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)
def __unicode__(self):
return self.name
class Meta:
managed = True
app_label = 'tipp'
class Match(models.Model):
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='+')
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) +
str(Team.objects.get(teamID=int(self.idTeam1)).values(name)) + " - " +
str(Team.objects.get(teamID=int(self.idTeam2)).values(name)))
"""
return (str(self.matchID))
class Tipp(models.Model):
@@ -72,7 +75,9 @@ class Tipp(models.Model):
tipperID = models.ForeignKey(User)
pointsTeam1 = models.PositiveSmallIntegerField()
pointsTeam2 = models.PositiveSmallIntegerField()
score = models.PositiveIntegerField(blank=True, null=True)
score = models.PositiveIntegerField(
blank=True, null=True
)
class Meta:
unique_together = ("matchID", "tipperID")
@@ -123,4 +128,12 @@ class Post(models.Model):
def __unicode__(self):
return u'%s' % self.created
class RelPostMandant(models.Model):
post = models.ForeignKey(Post)
mandant = models.ForeignKey(Mandant)
class Meta:
unique_together = ("post", "mandant")
def __unicode__(self):
return (str(self.post) + " -> " + str(self.mandant))

34
tipp/openliga.py Executable file → Normal file
View File

@@ -37,7 +37,9 @@ class OpenLiga(object):
# get a SUDS client object
if self.proxyurl is None:
try:
self.client = suds.client.Client('http://www.openligadb.de/Webservices/Sportsdata.asmx?WSDL')
self.client = suds.client.Client(
'http://www.openligadb.de/'
+ 'Webservices/Sportsdata.asmx?WSDL')
except (urllib2.URLError):
self.error += "Connect to webservice failed."
else:
@@ -46,25 +48,45 @@ class OpenLiga(object):
proxy = urllib2.ProxyHandler({'http':proxyurl})
opener = urllib2.build_opener(proxy)
t.urlopener = opener
self.client = suds.client.Client('http://www.openligadb.de/Webservices/Sportsdata.asmx?WSDL', transport=t)
self.client = suds.client.Client(
'http://www.openligadb.de/Webservices/'
+ 'Sportsdata.asmx?WSDL', transport=t)
except urllib2.URLError as e:
self.error += "Connect to webservice failed (via proxy " + proxyurl + "): " + str(e) + "\n"
self.error += "Connect to webservice failed " \
+ "(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'):
""" Get matchday.
Args: season, matchdaynumber and league shortcut (optional)
"""
return(self.client.service.GetMatchdataByGroupLeagueSaison(groupOrderID=matchdaynumber,leagueShortcut=league,leagueSaison=season))
return(self.client.service.GetMatchdataByGroupLeagueSaison(
groupOrderID=matchdaynumber,
leagueShortcut=league,
leagueSaison=season)
)
def getTeams(self, season, league='bl1'):
return(self.client.service.GetTeamsByLeagueSaison(leagueShortcut=league,leagueSaison=season))
return(self.client.service.GetTeamsByLeagueSaison(
leagueShortcut=league,
leagueSaison=season)
)
def getCurrentGroup(self, league):
return(self.client.service.GetCurrentGroup(
leagueShortcut=league)
)
def getAvailLeagues(self):
return(self.client.service.GetAvailLeaguesBySports(1))

View File

@@ -1,6 +1,6 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
This file demonstrates writing tests using the unittest module.
These will pass when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""

View File

@@ -19,15 +19,18 @@ 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.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
from django.contrib.auth.views import password_reset, password_reset_confirm
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.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
@@ -47,15 +50,20 @@ sys.setdefaultencoding('utf8')
timezoneLocal = pytz.timezone('Europe/Berlin')
def about(request):
return render(request, 'about.html')
@login_required
def home(request):
ls = get_current_ls()
season = get_current_season()
md = get_current_md(ls)
return redirect("matchday",
ls = ls,
season = season,
matchday=str(get_current_md(ls, season)).zfill(2)
matchday=str(md).zfill(2)
)
@login_required
@@ -74,7 +82,9 @@ def profile(request, pk):
# If it's a HTTP POST, we're interested in processing form data.
if request.method == 'POST':
user_form = UserForm(data=request.POST, instance=user)
profile_form = UserProfileForm(data=request.POST, instance=profile)
profile_form = UserProfileForm(
data=request.POST, instance=profile
)
if user_form.is_valid() and profile_form.is_valid():
@@ -97,13 +107,18 @@ def profile(request, pk):
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.
@@ -113,8 +128,8 @@ def profile(request, pk):
return 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.
# 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,
@@ -127,10 +142,89 @@ def profile(request, pk):
return 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)
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
})
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']
)
"""
check if object exits and do insert if not
"""
try:
to = Team.objects.get(teamID=int(t.teamID))
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.save()
return 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):
"""
@@ -147,43 +241,51 @@ def update(request, ls, season, cur_md):
matchResults = match['matchResults']
try:
for result in matchResults[0]:
if result['resultName'] == "Endergebnis":
if result['resultName'] == "Halbzeit":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
elif result['resultName'] == "Halbzeitergebnis":
elif result['resultName'] == "Endergebnis":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
elif str(result['resultName']) == u"nach Verlängerung":
pointsTeam1=int(result['pointsTeam1'])
pointsTeam2=int(result['pointsTeam2'])
else:
pointsTeam1=-1
pointsTeam2=-1
except:
pointsTeam1=-1
pointsTeam2=-1
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']),
idTeam1=Team.objects.get(teamID=int(match['idTeam1'])),
idTeam2=Team.objects.get(teamID=int(match['idTeam2'])),
matchDateTime=match['matchDateTime'],
pointsTeam1=pointsTeam1,
pointsTeam2=pointsTeam2,
finished=bool(match['matchIsFinished']),
season=match['leagueSaison'],
leagueShortcut=match['leagueShortcut']
)
m.save()
m.save(update_fields=['matchDateTime', 'pointsTeam1', 'pointsTeam2', 'finished'])
pointsTeam1=-1
pointsTeam2=-1
""" evaluate scores """
# evaluate scores
scores = Score.objects.get(client=Mandant.objects.get(name='huse'))
finished_matches=Match.objects.filter(finished=True)
finished_matches=Match.objects.filter(
finished=True,
leagueShortcut=ls,
season=season,
matchday = cur_md
)
for match in finished_matches:
tipps = Tipp.objects.filter(matchID=match.matchID)
for tipp in tipps:
score = 0
goals_total = match.pointsTeam1 + match.pointsTeam2
""" Tipp is acurate """
if (tipp.pointsTeam1 == match.pointsTeam1 and tipp.pointsTeam2 == match.pointsTeam2):
# Tipp is acurate
if (tipp.pointsTeam1 == match.pointsTeam1
and tipp.pointsTeam2 == match.pointsTeam2):
if goals_total >= 5:
score = scores.exact_high
else:
@@ -193,7 +295,7 @@ def update(request, ls, season, cur_md):
tipp.save()
continue
""" who won? """
# who won?
winnerReal = None
if match.pointsTeam1 > match.pointsTeam2:
winnerReal = 1
@@ -227,7 +329,11 @@ def update(request, ls, season, cur_md):
tipp.save()
continue
return redirect("matchday", ls=ls, season=season, matchday=cur_md)
return redirect("matchday",
ls=ls,
season=season,
matchday=cur_md
)
@login_required
def matchday(request, ls, season, matchday, template_name='md.html'):
@@ -235,21 +341,26 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
debug += "Debugging: "
has_refresh = True
""" get matchday closest to current date """
md_matches = Match.objects.filter(leagueShortcut=ls, season=season, matchday=int(matchday)).order_by('matchDateTime')
""" get matches of the matchday """
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)
""" get mandants current user is related """
mandants = RelUserMandant.objects.filter(user=request.user).values_list('mandant', flat=True)
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
""" get mates """
tipp_mates = []
mandant_dict = {}
for m in mandants:
mandant = Mandant.objects.get(id=m)
mandant_dict[mandant.description] = []
rs = RelUserMandant.objects.filter(mandant=m)
for r in rs:
tipp_mates.append({
mandant_dict[mandant.description].append({
'mate': r.user,
'tipps': [],
'sum_score': 0
@@ -266,7 +377,8 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
check if Tipp already exists
"""
try:
tipp = Tipp.objects.get(tipperID=user.id,matchID=match.matchID)
tipp = Tipp.objects.get(tipperID=user.id,
matchID=match.matchID)
except ObjectDoesNotExist:
tipp = None
@@ -298,27 +410,33 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
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['iconURLTeam1'] = str(match.idTeam1.iconURL)
item['nameTeam1']= str(match.idTeam1)
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['started'] = match_started
item['finished'] = match.finished
item['md_name'] = match.matchday_name
if (match.pointsTeam1 == -1 or match.pointsTeam2 == -1):
item['matchResult'] = "-:-"
else:
item['matchResult'] = str(match.pointsTeam1) + ":" + str(match.pointsTeam2)
item['matchResult'] = str(match.pointsTeam1) + ":" \
+ str(match.pointsTeam2)
item['tippFormTeam1'] = f['tippTeam1']
item['tippFormTeam2'] = f['tippTeam2']
@@ -327,68 +445,97 @@ def matchday(request, ls, season, matchday, template_name='md.html'):
f.fields['tippTeam1'].widget.attrs['disabled'] = True
f.fields['tippTeam2'].widget.attrs['disabled'] = True
for mate in tipp_mates:
try:
matetipp = Tipp.objects.get(tipperID=mate['mate'],matchID=match.matchID)
if match_started is True:
if matetipp.score is None:
score = u'\u231B'
else:
score = matetipp.score
""" get tipps from mates """
for mandant in mandant_dict:
for mate in mandant_dict[mandant]:
try:
matetipp = Tipp.objects.get(tipperID=mate['mate'],
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) + ")")
if match.finished is True:
mate['sum_score'] += matetipp.score
else:
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(str(matetipp.pointsTeam1) + ":" + str(matetipp.pointsTeam2) + \
"(" + str(score) + ")")
if match.finished is True:
mate['sum_score'] += matetipp.score
else:
mate['tipps'].append(u'\u2714')
except Exception as e:
mate['tipps'].append(u'\u2717')
matches.append(item)
# get the newest blogposts
pm = RelPostMandant.objects.filter(mandant__in=mandants). \
values_list('post', flat=True)
posts = []
for post in Post.objects.filter(published=True)[:2]:
for post in Post.objects.filter(id__in=pm, published=True)[:1]:
try:
avatar = UserProfile.objects.get(user_id=post.author_id).avatar.name
avatar = UserProfile.objects.get(user_id=post.author_id). \
avatar.name
except:
avatar = None
posts.append( (post, avatar) )
try:
cur_group = matches[0]['md_name']
except:
cur_group = "N/A"
debug += str(mandant_dict)
return render(request, 'md.html', {
#'debug': debug,
'debug': debug,
#'mds_season': mds_in_season,
'cur_md': matchday,
'md_name': cur_group,
'matches': matches,
'ls': ls,
'season': season,
'username': user,
'tipp_mates': sorted(tipp_mates, key=lambda k: k['sum_score'], reverse=True),
'mandant_dict': mandant_dict,
#'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'):
def charts(request, ls, season, pos='default',
template_name='charts.html'):
debug = ''
if pos == 'default':
if get_current_md(ls, season) < 18:
if get_current_md(ls) < 18:
pos = 'hin'
matches = Match.objects.filter(leagueShortcut=ls, season=season, matchday__lte=17)
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)
# get mandants of current user
mandants = RelUserMandant.objects.filter(user=request.user).values_list('mandant', flat=True)
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
# main loop
mandant_dict = {}
@@ -396,20 +543,23 @@ def charts(request, ls, season, pos='default', template_name='charts.html'):
mandant = Mandant.objects.get(id=m)
# get users
users = RelUserMandant.objects.filter(mandant=m).values_list('user', flat=True)
users = RelUserMandant.objects.filter(mandant=m). \
values_list('user', flat=True)
user_dict = {}
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,
@@ -422,10 +572,17 @@ def charts(request, ls, season, pos='default', template_name='charts.html'):
@login_required
def blogindex(request, page):
# get the blog posts that are published
# and related to mandant
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
posts = RelPostMandant.objects.filter(mandant__in=mandants). \
values_list('post', flat=True)
post_list = []
for post in Post.objects.filter(published=True):
for post in Post.objects.filter(published=True, id__in=posts):
try:
avatar = UserProfile.objects.get(user_id=post.author_id).avatar.name
avatar = UserProfile.objects.get(user_id=post.author_id). \
avatar.name
except:
avatar = None
post_list.append( (post, avatar) )
@@ -435,13 +592,10 @@ def blogindex(request, page):
try:
posts = p.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
posts = p.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
posts = p.page(p.num_pages)
# now return the rendered template
return render(request, 'blogindex.html', {
'posts': posts,
'ls': get_current_ls(),
@@ -451,30 +605,55 @@ def blogindex(request, page):
@login_required
def newBlogpost(request):
"""
if this is a POST request we need to process the form data
"""
debug = ''
has_mandant = False
mandants = RelUserMandant.objects.filter(user=request.user). \
values_list('mandant', flat=True)
choices = []
if mandants.count > 1:
has_mandant = True
for m in Mandant.objects.filter(id__in=mandants):
choices.append( (m.name, m.description) )
if request.method == 'POST':
# create form instance and populate it with data from the request
form = BlogpostForm(request.POST)
# check whether it's valid:
if form.is_valid():
data = form.cleaned_data
form_bp = BlogpostForm(request.POST)
if has_mandant is True:
form_mandant = MandantsForm(request.POST)
form_mandant.fields["mandants"].choices = choices
if form_bp.is_valid():
data = form_bp.cleaned_data
p = Post(author_id=request.user.id, content=data['content'])
p.save()
# ...
# redirect to a new URL:
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))
m.save()
else:
m = RelPostMandant(post=p,
mandant=Mandant.objects.get(id=mandants[0]))
m.save()
return redirect( '/blog/1')
# if a GET (or any other method) we'll create a blank form
else:
blogpostForm = BlogpostForm()
return render(request, 'newblogpost.html', {
'form': blogpostForm,
'ls': get_current_ls(),
'season': get_current_season()
})
blogpostForm = BlogpostForm()
form_mandant = MandantsForm()
form_mandant.fields["mandants"].choices = choices
cnt_mandants = len(choices)
return render(request, 'newblogpost.html', {
'debug': debug,
'form_bp': blogpostForm,
'form_mandants': form_mandant,
'cnt_mandants' : cnt_mandants,
'ls': get_current_ls(),
'season': get_current_season()
})
def logout(request):
"""
@@ -483,20 +662,26 @@ def logout(request):
logout(request)
return HttpResponseRedirect('/')
def get_current_md(ls,season):
""" get current matchday """
try:
current_md = Match.objects.filter(leagueShortcut=ls, season=season, \
finished=False).order_by('matchday').values_list('matchday', \
flat=True).distinct()[0]
except IndexError:
current_md = Match.objects.filter(leagueShortcut=ls, season=season).aggregate(Max('matchday'))
def get_current_md(ls):
"""
get current matchday()
returns dict with keys
['groupName']
['groupOrderID']
['groupID']
"""
return(current_md)
try:
ol = OpenLiga()
cur_md = ol.getCurrentGroup(ls)
except:
cur_md = {'groupName': u"1. Spieltag", 'groupOrderID': 1}
return(cur_md['groupOrderID'])
def get_current_ls():
return("bl1")
def get_current_season():
return("2015")
return("2016")

View File

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

View File

@@ -25,7 +25,7 @@ MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'django_tippy',
'NAME': 'tippy',
'USER': 'tippy',
'PASSWORD': 'tippy',
'HOST': 'localhost',
@@ -73,7 +73,7 @@ MEDIA_URL = '/media/'
# 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/TipPy/static/'
STATIC_ROOT = '/home/martin/dev/TipPy/src/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
# URL prefix for static files.
@@ -85,7 +85,7 @@ 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/TipPy/tippy/static',
'/home/martin/dev/TipPy/src/tippy/static/',
)
# List of finder classes that know how to find static files in

View File

@@ -8,16 +8,26 @@ 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'^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'^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')),