Private
Public Access
1
0

Merge branch 'develop' into feature/bg2

This commit is contained in:
Sander Roosendaal
2017-04-13 15:02:28 +02:00
22 changed files with 469 additions and 111 deletions

View File

@@ -572,9 +572,15 @@ def new_workout_from_file(r,f2,
with zipfile.ZipFile(f2) as z:
# for now, we're getting only the first file
# from the NK zip file (issue #69 on bitbucket)
f2 = z.extract(z.namelist()[0],path='media/')
fileformat = fileformat[2]
for fname in z.namelist():
f3 = z.extract(fname,path='media/')
id,message,f2 = new_workout_from_file(r,f3,
workouttype=workouttype,
makeprivate=makeprivate,
title = title,
notes='')
os.remove(f_to_be_deleted)
return id,message,f2
# Some people try to upload Concept2 logbook summaries
if fileformat == 'c2log':

View File

@@ -90,6 +90,24 @@ class UploadOptionsForm(forms.Form):
class Meta:
fields = ['make_plot','plottype','upload_toc2','makeprivate']
# The form to indicate additional actions to be performed immediately
# after a successful upload. This version allows the Team manager to select
# a team member
class TeamUploadOptionsForm(forms.Form):
plotchoices = (
('timeplot','Time Plot'),
('distanceplot','Distance Plot'),
('pieplot','Pie Chart'),
)
make_plot = forms.BooleanField(initial=False,required=False)
plottype = forms.ChoiceField(required=False,
choices=plotchoices,
initial='timeplot',
label='Plot Type')
class Meta:
fields = ['make_plot','plottype']
# This form is used on the Analysis page to add a custom distance/time
# trial and predict the pace
class PredictedPieceForm(forms.Form):

View File

@@ -159,7 +159,7 @@ def create_request(team,user):
if r2 in Rower.objects.filter(team=team):
return (0,'Already a member of that team')
if count_club_members(team.manager)+count_invites(team.manager) < r.clubsize:
if count_club_members(team.manager)+count_invites(team.manager) <= r.clubsize:
codes = [i.code for i in TeamRequest.objects.all()]
code = uuid.uuid4().hex[:10].upper()
# prevent duplicates
@@ -200,7 +200,7 @@ def create_invite(team,manager,user=None,email=''):
except Rower.MultipleObjectsReturned:
return (0,'There is more than one user with that email address')
if count_club_members(team.manager)+count_invites(team.manager) < r.clubsize:
if count_club_members(team.manager)+count_invites(team.manager) <= r.clubsize:
codes = [i.code for i in TeamInvite.objects.all()]
code = uuid.uuid4().hex[:10].upper()
# prevent duplicates

View File

@@ -1,4 +1,4 @@
{% extends "bases.html" %}
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}

View File

@@ -1,4 +1,4 @@
{% extends "bases.html" %}
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}

View File

@@ -1,4 +1,4 @@
{% extends "bases.html" %}
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}

View File

@@ -1,4 +1,4 @@
{% extends "bases.html" %}
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}

View File

@@ -1,5 +1,6 @@
{% load cookielaw_tags %}
{% load analytical %}
{% load rowerfilters %}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
@@ -143,13 +144,17 @@
{% endif %}
</div>
<div class="grid_1 tooltip">
{% if user.is_authenticated and teams %}
{% if user.is_authenticated and user|has_teams %}
<div class="grid_1 alpha dropdown">
<button class="grid_1 alpha button gray small dropbtn">
Teams
</button>
<div class="dropdown-content">
{% for t in teams %}
<a class="button gray small" href="/rowers/me/teams/">Manage Teams</a>
{% if user|is_manager %}
<a class="button gray small" href="/rowers/workout/upload/team/">Upload Team Member Workout</a>
{% endif %}
{% for t in user|user_teams %}
<a class="button gray small" href="/rowers/list-workouts/team/{{ t.id }}/">{{ t.name }}</a>
{% endfor %}
</div>

View File

@@ -1,5 +1,6 @@
{% load cookielaw_tags %}
{% load analytical %}
{% load rowerfilters %}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
@@ -162,13 +163,17 @@
{% endif %}
</div>
<div class="grid_1 tooltip">
{% if user.is_authenticated and teams %}
{% if user.is_authenticated and user|user_teams %}
<div class="grid_1 alpha dropdown">
<button class="grid_1 alpha button gray small dropbtn">
Teams
</button>
<div class="dropdown-content">
{% for t in teams %}
<a class="button gray small" href="/rowers/me/teams/">Manage Teams</a>
{% if user|is_manager %}
<a class="button gray small" href="/rowers/workout/upload/team/">Upload Team Member Workout</a>
{% endif %}
{% for t in user|user_teams %}
<a class="button gray small" href="/rowers/list-workouts/team/{{ t.id }}/">{{ t.name }}</a>
{% endfor %}
</div>

View File

@@ -1,12 +1,17 @@
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}File loading{% endblock %}
{% block content %}
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
<div id="left" class="grid_6 alpha">
<h1>Upload Workout File</h1>
<h1>Upload Workout File</h1>
{% if user.is_authenticated and user|is_manager %}
<p>Looking for <a href="/rowers/workout/upload/team/">Team Manager
Upload?</a></p>
{% endif %}
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.

View File

@@ -35,7 +35,9 @@
<div id="workouts_table" class="grid_8 alpha">
{% if team %}
{% include "teambuttons.html" with teamid=team.id %}
<div class="grid_8 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
<h3>{{ team.name }} Team Workouts</h3>
{% else %}
<h3>My Workouts</h3>

View File

@@ -0,0 +1,55 @@
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}File loading{% endblock %}
{% block content %}
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
<div id="left" class="grid_6 alpha">
<h1>Upload Workout File</h1>
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<table>
{{ rowerform.as_table }}
{{ form.as_table }}
</table>
{% csrf_token %}
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
<input class="button green" type="submit" value="Submit">
</div>
</div>
<div id="right" class="grid_6 omega">
<h1>Optional extra actions</h1>
<p>
<table>
{{ optionsform.as_table }}
</table>
</p>
<p>
You can select one static plot to be generated immediately for this workout. You can select to upload to Concept2 automatically. If you check "make private", this workout will not be visible to your followers and will not show up in your teams' workouts list.
</p>
<p>
Valid file types are:
<ul>
<li>Painsled iOS Stroke Export (CSV)</li>
<li>Painsled desktop version Stroke Export (CSV)</li>
<li>A TCX file with location data (lat,long) - with or without Heart Rate value, for example from RiM or CrewNerd</li>
<li>RowPro CSV export</li>
<li>SpeedCoach GPS and SpeedCoach GPS 2 CSV export</li>
<li>ErgData CSV export</li>
<li>ErgStick CSV export</li>
<li>BoatCoach CSV export</li>
<li>A FIT file with location data (experimental)</li>
</ul>
</p>
</div>
</form>
{% endblock %}

View File

@@ -1,3 +1,4 @@
{% load rowerfilters %}
<div class="grid_2 alpha">
<p>
<a class="button gray small" href="/rowers/list-workouts/team/{{ teamid }}/">Team Workouts</a>
@@ -8,8 +9,17 @@
<a class="button gray small" href="/rowers/team-compare-select/team/{{ teamid }}/">Multi Compare</a>
</p>
</div>
<div class="grid_2 suffix_2 omega">
<div class="grid_2">
<p>
<a class="button gray small" href="/rowers/team/{{ teamid }}/">Team Page</a>
</p>
</div>
</p>
</div>
<div class="grid_2 omega">
{% if user|is_manager and user|has_teams %}
<p>
<a class="button gray small" href="/rowers/workout/upload/team/">Upload Workout</a>
</p>
{% else %}
<p>&nbsp;</p>
{% endif %}
</div>

View File

@@ -36,10 +36,76 @@
</p>
</div>
<div class="grid_6 omega">
{% if otherteams %}
<h2>Other Teams</h2>
<table width="70%" class="listtable">
<thead>
<tr>
<th>Name</th>
<th>Manager</th>
</tr>
</thead>
<tbody>
{% for team in otherteams %}
<tr>
<td>
<a href="/rowers/team/{{ team.id }}/">{{ team.name }}</a>
</td>
<td>
{{ team.manager.first_name }} {{ team.manager.last_name }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>&nbsp;</p>
{% endif %}
</div>
</div>
<div class="grid_12 alpha">
<div class="grid_6 alpha">
{% if user.rower.rowerplan == 'coach' %}
<h2>Teams I manage</h2>
<p>Number of members: {{ clubsize }}</p>
<p>Maximum club size: {{ max_clubsize }}</p>
{% if myteams %}
<table width="70%" class="listtable">
<thead>
<tr>
<th>Name</th>
<th>Manager</th>
</tr>
</thead>
<tbody>
{% for team in myteams %}
<tr>
<td>
<a href="/rowers/team/{{ team.id }}/">{{ team.name }}</a>
</td>
<td>
<div class="grid_1">
<a class="button small red" href="/rowers/team/{{ team.id }}/deleteconfirm">Delete</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<div class="grid_2 suffix_4 alpha">
<a class="button green" href="/rowers/team/create">New Team</a>
</div>
{% else %}
<p>&nbsp;</p>
{% endif %}
</div>
<div class="grid_6 omega">
{% if invites or requests or myrequests or myinvites %}
<p>
<h2>Invitations and Requests</h2>
<table width="90%" class="listtable">
<thead>
@@ -126,70 +192,5 @@
</div>
</div>
<div class="grid_12 alpha">
<div class="grid_6 alpha">
{% if user.rower.rowerplan == 'coach' %}
<h2>Teams I manage</h2>
{% if myteams %}
<table width="70%" class="listtable">
<thead>
<tr>
<th>Name</th>
<th>Manager</th>
</tr>
</thead>
<tbody>
{% for team in myteams %}
<tr>
<td>
<a href="/rowers/team/{{ team.id }}/">{{ team.name }}</a>
</td>
<td>
<div class="grid_1">
<a class="button small red" href="/rowers/team/{{ team.id }}/deleteconfirm">Delete</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<div class="grid_2 suffix_4 alpha">
<a class="button green" href="/rowers/team/create">New Team</a>
</div>
{% else %}
<p>&nbsp;</p>
{% endif %}
</div>
<div class="grid_6 omega">
{% if otherteams %}
<h2>Other Teams</h2>
<table width="70%" class="listtable">
<thead>
<tr>
<th>Name</th>
<th>Manager</th>
</tr>
</thead>
<tbody>
{% for team in otherteams %}
<tr>
<td>
<a href="/rowers/team/{{ team.id }}/">{{ team.name }}</a>
</td>
<td>
{{ team.manager.first_name }} {{ team.manager.last_name }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>&nbsp;</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -65,3 +65,35 @@ def times(number):
def get_field_id(id,s,form):
field_name = s+str(id)
return form.__getitem__(field_name)
from rowers.models import Rower,Team
@register.filter
def is_manager(user):
r = Rower.objects.get(user=user)
return r.rowerplan == 'coach'
@register.filter
def user_teams(user):
try:
therower = Rower.objects.get(user=user)
teams1 = therower.team.all()
teams2 = Team.objects.filter(manager=user)
teams = list(set(teams1).union(set(teams2)))
except TypeError:
teams = []
return teams
@register.filter
def has_teams(user):
try:
therower = Rower.objects.get(user=user)
teams1 = therower.team.all()
teams2 = Team.objects.filter(manager=user)
teams = list(set(teams1).union(set(teams2)))
return True
except TypeError:
return False
return False

View File

@@ -702,7 +702,7 @@ class ViewTest(TestCase):
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/upload/This%20C2%20logbook%20summary%20does%20not%20contain%20stroke%20data.%20Please%20download%20the%20Export%20Stroke%20Data%20file%20from%20the%20workout%20details%20on%20the%20C2%20logbook.',
self.assertRedirects(response, expected_url='/rowers/workout/upload/c/This%20C2%20logbook%20summary%20does%20not%20contain%20stroke%20data.%20Please%20download%20the%20Export%20Stroke%20Data%20file%20from%20the%20workout%20details%20on%20the%20C2%20logbook.',
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)

View File

@@ -157,8 +157,12 @@ urlpatterns = [
url(r'^graph/(\d+)/$',views.graph_show_view),
url(r'^graph/(\d+)/deleteconfirm$',views.graph_delete_confirm_view),
url(r'^graph/(\d+)/delete$',views.graph_delete_view),
url(r'^workout/upload/team/s/(?P<successmessage>\w+.*)/c/(?P<message>\w+.*)/$',views.team_workout_upload_view),
url(r'^workout/upload/team/c/(?P<message>\w+.*)/$',views.team_workout_upload_view),
url(r'^workout/upload/team/s/(?P<successmessage>\w+.*)/$',views.team_workout_upload_view),
url(r'^workout/upload/team/$',views.team_workout_upload_view),
url(r'^workout/upload/$',views.workout_upload_view),
url(r'^workout/upload/(.+.*)$',views.workout_upload_view),
url(r'^workout/upload/c/(?P<message>\w+.*)$',views.workout_upload_view),
url(r'^workout/(?P<id>\d+)/histo$',views.workout_histo_view),
url(r'^workout/(?P<id>\d+)/forcecurve$',views.workout_forcecurve_view),
url(r'^workout/(?P<id>\d+)/unsubscribe$',views.workout_unsubscribe_view),

View File

@@ -14,7 +14,10 @@ from django.http import (
HttpResponseNotFound,Http404
)
from django.contrib.auth import authenticate, login, logout
from rowers.forms import LoginForm,DocumentsForm,UploadOptionsForm
from rowers.forms import (
LoginForm,DocumentsForm,UploadOptionsForm,
TeamUploadOptionsForm,
)
from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied
from django.template import RequestContext
@@ -1004,6 +1007,7 @@ def workout_strava_upload_view(request,id=0):
# ready to upload. Hurray
try:
w = Workout.objects.get(id=id)
r = w.user
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
if (checkworkoutuser(request.user,w)):
@@ -1086,16 +1090,18 @@ def workout_strava_upload_view(request,id=0):
@login_required()
def workout_c2_upload_view(request,id=0):
message = ""
try:
thetoken = c2_open(request.user)
except C2NoTokenError:
return HttpResponseRedirect("/rowers/me/c2authorize/")
# ready to upload. Hurray
try:
w = Workout.objects.get(id=id)
r = w.user
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
try:
thetoken = c2_open(r.user)
except C2NoTokenError:
return HttpResponseRedirect("/rowers/me/c2authorize/")
if (checkworkoutuser(request.user,w)):
c2userid = c2stuff.get_userid(thetoken)
if not c2userid:
@@ -1172,15 +1178,17 @@ def workout_c2_upload_view(request,id=0):
def workout_runkeeper_upload_view(request,id=0):
message = ""
try:
thetoken = runkeeper_open(request.user)
w = Workout.objects.get(id=id)
r = w.user
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
try:
thetoken = runkeeper_open(r.user)
except RunKeeperNoTokenError:
return HttpResponseRedirect("/rowers/me/runkeeperauthorize/")
# ready to upload. Hurray
try:
w = Workout.objects.get(id=id)
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
if (checkworkoutuser(request.user,w)):
data = runkeeperstuff.createrunkeeperworkoutdata(w)
@@ -1233,17 +1241,19 @@ def workout_runkeeper_upload_view(request,id=0):
@login_required()
def workout_sporttracks_upload_view(request,id=0):
message = ""
try:
thetoken = sporttracks_open(request.user)
except SportTracksNoTokenError:
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
# ready to upload. Hurray
try:
w = Workout.objects.get(id=id)
r = w.user
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
try:
thetoken = sporttracks_open(r.user)
except SportTracksNoTokenError:
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
if (checkworkoutuser(request.user,w)):
data = sporttracksstuff.createsporttracksworkoutdata(w)
if not data:
@@ -5159,11 +5169,24 @@ def workout_upload_view(request,message="",
request.session['uploadoptions'] = uploadoptions
try:
makeprivate = uploadoptions['makeprivate']
except KeyError:
makeprivate = False
try:
make_plot = uploadoptions['make_plot']
except KeyError:
make_plot = False
makeprivate = uploadoptions['makeprivate']
make_plot = uploadoptions['make_plot']
plottype = uploadoptions['plottype']
upload_toc2 = uploadoptions['upload_to_C2']
try:
plottype = uploadoptions['plottype']
except KeyError:
plottype = 'timeplot'
try:
upload_toc2 = uploadoptions['upload_to_C2']
except KeyError:
upload_toc2 = False
r = Rower.objects.get(user=request.user)
if request.method == 'POST':
@@ -5350,6 +5373,183 @@ def workout_upload_view(request,message="",
'optionsform': optionsform,
'message':message})
# This is the main view for processing uploaded files
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
def team_workout_upload_view(request,message="",
successmessage="",
uploadoptions={
'make_plot':False,
'plottype':'timeplot',
}):
if 'uploadoptions' in request.session:
uploadoptions = request.session['uploadoptions']
else:
request.session['uploadoptions'] = uploadoptions
myteams = Team.objects.filter(manager=request.user)
make_plot = uploadoptions['make_plot']
plottype = uploadoptions['plottype']
r = Rower.objects.get(user=request.user)
if request.method == 'POST':
form = DocumentsForm(request.POST,request.FILES)
optionsform = TeamUploadOptionsForm(request.POST)
rowerform = TeamInviteForm(request.POST)
rowerform.fields.pop('email')
rowerform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct()
if form.is_valid():
f = request.FILES['file']
res = handle_uploaded_file(f)
t = form.cleaned_data['title']
if rowerform.is_valid():
u = rowerform.cleaned_data['user']
if u:
r = Rower.objects.get(user=u)
else:
message = 'Please select a rower'
response = render(request,
'team_document_form.html',
{'form':form,
'teams':get_my_teams(request.user),
'optionsform': optionsform,
'rowerform': rowerform,
'message':message,
'successmessage':successmessage,
})
return response
workouttype = form.cleaned_data['workouttype']
notes = form.cleaned_data['notes']
if optionsform.is_valid():
make_plot = optionsform.cleaned_data['make_plot']
plottype = optionsform.cleaned_data['plottype']
uploadoptions = {
'makeprivate':False,
'make_plot':make_plot,
'plottype':plottype,
'upload_to_C2':False,
}
request.session['uploadoptions'] = uploadoptions
f1 = res[0] # file name
f2 = res[1] # file name incl media directory
id,message,f2 = dataprep.new_workout_from_file(r,f2,
workouttype=workouttype,
makeprivate=False,
title = t,
notes='')
if not id:
url = reverse(team_workout_upload_view,
args=[str(message)])
response = HttpResponseRedirect(url)
return response
else:
if message:
successmessage = "The workout was added to the user's account"
url = reverse(team_workout_upload_view,
kwargs = {
'message':message,
'successmessage':successmessage,
})
else:
successmessage = "The workout was added to the user's account"
url = reverse(team_workout_upload_view,
kwargs = {
'successmessage':successmessage,
})
response = HttpResponseRedirect(url)
w = Workout.objects.get(id=id)
if (make_plot):
imagename = f1[:-4]+'.png'
fullpathimagename = 'static/plots/'+imagename
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
r.pw_at,
r.pw_tr,r.pw_an])/r.ftp
hrpwrdata = {
'hrmax':r.max,
'hrut2':r.ut2,
'hrut1':r.ut1,
'hrat':r.at,
'hrtr':r.tr,
'hran':r.an,
'ftp':r.ftp,
'powerperc':serialize_list(powerperc),
'powerzones':serialize_list(r.powerzones),
}
# make plot - asynchronous task
plotnrs = {
'timeplot':1,
'distanceplot':2,
'pieplot':3,
}
plotnr = plotnrs[plottype]
if (workouttype=='water'):
plotnr = plotnr+3
if settings.DEBUG:
res = handle_makeplot.delay(f1,f2,t,
hrpwrdata,plotnr,
imagename)
else:
res = queue.enqueue(handle_makeplot,f1,f2,
t,hrpwrdata,
plotnr,imagename)
i = GraphImage(workout=w,
creationdatetime=timezone.now(),
filename=fullpathimagename)
i.save()
else:
response = render(request,
'team_document_form.html',
{'form':form,
'teams':get_my_teams(request.user),
'optionsform': optionsform,
'rowerform': rowerform,
'message':message,
'successmessage':successmessage,
})
return response
else:
form = DocumentsForm()
optionsform = TeamUploadOptionsForm(initial=uploadoptions)
rowerform = TeamInviteForm()
rowerform.fields.pop('email')
rowerform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct()
return render(request, 'team_document_form.html',
{'form':form,
'teams':get_my_teams(request.user),
'optionsform': optionsform,
'rowerform':rowerform,
'message':message,
'successmessage':successmessage,
})
# Ask the user if he really wants to delete the workout
@@ -6416,11 +6616,14 @@ def rower_teams_view(request,message='',successmessage=''):
requests = TeamRequest.objects.filter(user=request.user)
myrequests = TeamRequest.objects.filter(team__in=myteams)
myinvites = TeamInvite.objects.filter(team__in=myteams)
clubsize = teams.count_invites(request.user)+teams.count_club_members(request.user)
max_clubsize = r.clubsize
return render(request, 'teams.html',
{
'teams':ts,
'teams':get_my_teams(request.user),
'clubsize':clubsize,
'max_clubsize':max_clubsize,
'myteams':myteams,
'invites':invites,
'otherteams':otherteams,
@@ -6431,6 +6634,7 @@ def rower_teams_view(request,message='',successmessage=''):
'successmessage':successmessage,
'myinvites':myinvites,
})
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
def invitation_revoke_view(request,id):
res,text = teams.revoke_invite(request.user,id)

View File

@@ -29,7 +29,8 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'z_@2yia858=2i1cygo4ne3+14&i_&@wlty68$q1igdvn=9k5mo'
SECRET_KEY = CFG['secret_key']
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
@@ -104,7 +105,6 @@ TEMPLATES = [
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.i18n',

View File

@@ -0,0 +1,11 @@
{% load i18n %}
<div id="CookielawBanner">
<div class="container">
<h6>{% trans "COOKIE_INFO_HEADER" %}</h6>
<p>
<a class="btn btn-primary pull-right" href="javascript:Cookielaw.createCookielawCookie();">{% trans "COOKIE_INFO_OK" %}</a>
{% trans "COOKIE_INFO_PARA" %}
</p>
</div>
</div>

View File

@@ -8,7 +8,7 @@
}
#CookielawBanner #CookielawCross {
background: url('../img/close.png') no-repeat 0 0;
background: url('/static/img/close.png') no-repeat 0 0;
cursor: pointer;
display: block;
position: absolute;

BIN
static/img/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B