Private
Public Access
1
0

adding race logo functionality

This commit is contained in:
Sander Roosendaal
2018-11-28 21:48:44 +01:00
parent 22f122f195
commit 2fabd3c61b
5 changed files with 476 additions and 1 deletions

View File

@@ -1804,6 +1804,8 @@ class PlannedSession(models.Model):
from django.core.validators import RegexValidator,validate_email
registerchoices = (
('windowstart','Start of Race Window'),
('windowend','End of Race Window'),
@@ -1825,6 +1827,7 @@ class VirtualRace(PlannedSession):
end_time = models.TimeField(blank=True,null=True)
country = models.CharField(max_length=100,blank=True)
timezone = models.CharField(default='UTC',
choices=timezones,
max_length=100)
@@ -1881,6 +1884,21 @@ class VirtualRace(PlannedSession):
super(VirtualRace,self).save(*args, **kwargs)
class RaceLogo(models.Model):
filename = models.CharField(default='',max_length=150)
creationdatetime = models.DateTimeField()
user = models.ForeignKey(User)
width = models.IntegerField(default=1200)
height = models.IntegerField(default=600)
race = models.ManyToManyField(VirtualRace,related_name='logos')
def __str__(self):
return self.filename
def delete(self, *args, **kwargs):
os.remove(self.filename)
print 'file deleted'
super(RaceLogo,self).delete(*args, **kwargs)
# Date input utility
class DateInput(forms.DateInput):

View File

@@ -0,0 +1,280 @@
{% extends "newbase.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}File loading{% endblock %}
{% block meta %}
<script type='text/javascript'
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
</script>
<script type='text/javascript'
src='https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js'>
</script>
<script>
</script>
{% endblock %}
{% block main %}
{% if race.logo %}
<h1>Current Logo</h1>
<img src="/{{ race.logo.filename }}" alt="{{ race.logo.filename }}">
{% endif %}
<ul class="main-content">
{% if logos %}
<li class="grid_4">
<h1>Set logo by clicking on one of the logos you have used in the past</h1>
</li>
{% for logo in logos %}
<li>
<img src="/{{ logo.filename }}"
alt="{{ logo.filename }}" width="120" height="100">
<a href="/rowers/virtualevent/{{ race.id }}/setimage/{{ logo.id }}/">
Use this logo
</a>
<a href="/rowers/logo/{{ logo.id }}/delete">
Delete this logo
</a>
</li>
{% endfor %}
{% endif %}
{% if logos|length <= 5 %}
<li class="grid_4">
<h1>Upload New Image (Race Logo)</h1>
<div id="id_dropregion" class="watermark invisible">
<p>Drag and drop files here </p>
</div>
<div id="id_drop-files" class="drop-files">
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<table>
{{ form.as_table }}
</table>
{% csrf_token %}
<p>
<input type="submit" value="Submit">
</p>
</form>
</div>
</li>
{% endif %}
</ul>
{% endblock %}
{% block scripts %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var td = new FormData();
var formdatasetok = false;
try {
td.set('aap','noot');
formdatasetok = true;
console.log('FormData.set OK');
}
catch(err) {
console.log('FormData.set not OK');
formdatasetok = false;
}
if (!formdatasetok) {
$("#id_dropregion").remove();
}
if (formdatasetok) {
$(document).ready(function() {
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
console.log("CSRF token",csrftoken);
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
console.log("Loading dropper");
jQuery.event.props.push('dataTransfer');
$(window).on('dragenter', function() {
$("#id_drop-files").css("background-color","#E9E9E4");
$("#id_dropregion").addClass("watermark").removeClass("invisible");})
$(window).on('dragleave', function() {
$("#id_drop-files").css("background-color","#FFFFFF");
$("#id_dropregion").removeClass("watermark").addClass("invisible");})
var frm = $("#file_form");
if( window.FormData === undefined ) {
console.log('no formdata');
alert("No FormData");
} else {
console.log('we have formdata');
}
var data = new FormData(frm[0]);
$('#id_file').on('change', function(evt) {
var f = this.files[0];
console.log(f);
var istcx = false;
var isgzip = false;
var size1 = 10485760;
var size2 = 1048576;
if ((/\.(tcx|TCX)/i).test(f.name)) {
istcx = true;
console.log('tcx');
if ((/\.(gz|GZ)/i).test(f.name)) {
isgzip = true;
console.log('gzip');
size1 /= 5;
size2 /= 5;
}
}
console.log(size1)
console.log(size2)
if (f.size > size1) {
alert("File Size must be smaller than 10 MB");
this.value = null;
} else {
if (f.size > size2) {
$('#id_offline').val('True');
$('#id_offline').prop('checked','True');
data.set($('#id_offline').attr('name'),$('#id_offline').prop('checked'));
console.log("Set offline to True");
}
}
});
$('input').each(function( i ) {
$(this).change(function() {
if ($(this).attr('type') == 'checkbox') {
data.set($(this).attr('name'),$(this).prop('checked'));
console.log($(this).attr('id'),$(this).attr('name'),$(this).prop('checked'));
} else {
data.set($(this).attr('name'),$(this).val());
if ($(this).attr('id') == 'id_file') {
data.set("file",this.files[0]);
}
console.log($(this).attr('name'),$(this).val());
};
});});
$('select').each(function( i ) {
console.log($(this).attr('name'),$(this).val());
$(this).change(function() {
data.set($(this).attr('name'),$(this).val());
console.log($(this).attr('id'),$(this).attr('name'),$(this).val());
});
});
frm.submit(function() {
console.log("Form submission");
$(data.values()).each(function(value) {
console.log(value);
});
$("#id_drop-files").replaceWith(
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="60" height="50" style="width:60px">'
);
$.ajax({
data: data,
type: $(this).attr('method'),
url: '/rowers/virtualevent/{{ race.id }}/image',
contentType: false,
processData: false,
error: function(result) {
$("#id_waiting").replaceWith(
'<div id="id_failed" class="grid_12 alpha message">Your upload failed</div>'
);
setTimeout(function() {
location.reload();
},1000);
},
success: function(result) {
console.log('got something back');
console.log(result);
if (result.result == 1) {
window.location.href = result.url;
} else {
console.log(result," reloading");
location.reload();
};
}
});
return false;
});
$('#id_drop-files').bind({
drop: function(e) {
e.preventDefault();
console.log("you dropped something");
var files = e.dataTransfer.files;
console.log(files[0]);
var f = files[0];
var istcx = false;
var isgzip = false;
var size1 = 10485760;
var size2 = 1048576;
if ((/\.(tcx|TCX)/i).test(f.name)) {
istcx = true;
console.log('tcx');
if ((/\.(gz|GZ)/i).test(f.name)) {
isgzip = true;
console.log('gzip');
size1 /= 5;
size2 /= 5;
}
}
console.log(f);
console.log(size1)
console.log(size2)
if (f.size > size1) {
alert("File Size must be smaller than 10 MB");
$("#id_file").value = 0;
return false;
}
data.set("file",f);
// data.append("file",f);
$("#id_file").replaceWith('<div id="id_file">'+files[0].name+'&nbsp; <a class="remove" href="javascript:void(0);"><b><font color="red">X</font></b></a></div>');
},
mouseenter:function(){$("#id_drop-files").css("background-color","#E9E9E4");},
mouseleave:function(){$("#id_drop-files").css("background-color","#FFFFFF");},
dragover:function(e){
e.preventDefault();
$("#id_drop-files").css("background-color","#E9E9E4");},
dragleave:function(e){ e.preventDefault();},
});
$(document).on("click", "a.remove", function() {
$(this).parent().replaceWith('<td><input id="id_file" name="file" type="file" /></td>');
});
});
};
</script>
{% endblock %}
{% block sidebar %}
{% include 'menu_racing.html' %}
{% endblock %}

View File

@@ -13,7 +13,19 @@
<h1>{{ race.name }}</h1>
{% if not racelogo and race.manager == request.user %}
<a href="/rowers/virtualevent/{{ race.id }}/image">Add Race Logo</a>
{% endif %}
<ul class="main-content">
{% if racelogo %}
<li class="grid_2">
<img src="/{{ racelogo.filename }}" alt="{{ racelogo.filename }}" height="100" width="120">
{% if race.manager == request.user %}
<a href="/rowers/virtualevent/{{ race.id }}/image">Edit Image</a>
{% endif %}
</li>
{% endif %}
{% if race.sessiontype == 'race' %}
<li class="grid_2">
<p>

View File

@@ -272,6 +272,12 @@ urlpatterns = [
url(r'^workout/(?P<id>\d+)/interactiveotwplot$',views.workout_otwpowerplot_view),
url(r'^workout/(?P<id>\d+)/wind$',views.workout_wind_view),
url(r'^workout/(?P<id>\d+)/image$',views.workout_uploadimage_view),
url(r'^virtualevent/(?P<id>\d+)/image$',
views.virtualevent_uploadimage_view),
url(r'^virtualevent/(?P<id>\d+)/setimage/(?P<logoid>\d+)/$',
views.virtualevent_setlogo_view),
url(r'^logo/(?P<id>\d+)/delete/$',
views.logo_delete_view),
url(r'^workout/(?P<id>\d+)/darkskywind$',views.workout_downloadwind_view),
url(r'^workout/(?P<id>\d+)/metar/(?P<airportcode>\w+)$',views.workout_downloadmetar_view),
url(r'^workout/(?P<id>\d+)/stream$',views.workout_stream_view),

View File

@@ -83,6 +83,7 @@ from rowers.models import (
createmicrofillers, createmesofillers,
microcyclecheckdates,mesocyclecheckdates,macrocyclecheckdates,
TrainingMesoCycleForm, TrainingMicroCycleForm,
RaceLogo,
)
from rowers.models import (
RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm,
@@ -10231,7 +10232,159 @@ def workout_map_view(request,id=0):
'mapdiv':mapdiv,
'mayedit':mayedit,
})
@login_required()
def logo_delete_view(request,id=0):
try:
logo = RaceLogo.objects.get(id=id)
except RaceLogo.DoesNotExist:
raise Http404("Logo doesn't exist")
if logo.user == request.user:
logo.delete()
messages.info(request,"Logo Deleted")
url = reverse(virtualevents_view)
return HttpResponseRedirect(url)
@login_required()
def virtualevent_setlogo_view(request,id=0,logoid=0):
try:
race = VirtualRace.objects.get(id=id)
except VirtualRace.DoesNotExist:
raise Http404("Race doesn't exist")
try:
logo = RaceLogo.objects.get(id=logoid)
except RaceLogo.DoesNotExist:
raise Http404("Logo doesn't exist")
if logo.user == request.user and race.manager == request.user:
otherlogos = race.logos.all()
for otherlogo in otherlogos:
otherlogo.race.remove(race)
logo.race.add(race)
logo.save()
else:
message = "You do not own this race or this image"
messages.error(request,message)
url = reverse(virtualevent_view,
kwargs={'id':id})
return HttpResponseRedirect(url)
# Image upload to virtual event
@login_required()
def virtualevent_uploadimage_view(request,id=0):
is_ajax = False
if request.is_ajax():
is_ajax = True
r = getrower(request.user)
try:
race = VirtualRace.objects.get(id=id)
except VirtualRace.DoesNotExist:
raise Http404("Race doesn't exist")
logos = RaceLogo.objects.filter(user=request.user).order_by("-creationdatetime")
breadcrumbs = [
{
'url': reverse(virtualevents_view),
'name': 'Racing'
},
{
'url': reverse(virtualevent_view,kwargs={'id':id}),
'name': race.name
},
{
'url': reverse(virtualevent_uploadimage_view,
kwargs={'id':id}),
'name': 'Add Image'
}
]
if request.method == 'POST':
if len(logos) >= 6:
messages.error(request,"You cannot have more than 6 logos")
url = reverse(virtualevent_imageupload_view,
kwargs={'id':id})
return HttpResponseRedirect(url)
form = ImageForm(request.POST, request.FILES)
if form.is_valid():
f = form.cleaned_data['file']
if f is not None:
filename, path_and_filename = handle_uploaded_image(f)
try:
width, height = Image.open(path_and_filename).size
except:
message = "Not a valid image"
messages.error(request,message)
os.remove(path_and_filename)
url = reverse(virtualevent_image_view,
kwargs={'id':id})
if is_ajax:
return JSONResponse({'result':0, 'url':0})
else:
return HttpResponseRedirect(url)
otherlogos = race.logos.all()
for logo in otherlogos:
logo.race.remove(race)
logo = RaceLogo(user = request.user,
creationdatetime=timezone.now(),
filename = path_and_filename,
width=width, height=height)
logo.save()
logo.race.add(race)
logo.save()
url = reverse(virtualevent_view,
kwargs={'id':id})
if is_ajax:
return JSONResponse({'result':1, 'url':url})
else:
return HttpResponseRedirect(url)
else:
messages.error(request,"Something went wrong - no file attached")
url = reverse(virtualevent_uploadimage_view,
kwargs = {'id':id})
if is_ajax:
return JSONResponse({'result':0,'url':1})
else:
return HttpResponseRedirect(url)
else:
form = ImageForm()
if is_ajax:
return {'result':0}
return render(request,'logo_form.html',
{'form':form,
'rower':r,
'logos':logos,
'active':'nav-racing',
'breadcrumbs':breadcrumbs,
'race':race,
})
# Image upload
@login_required()
@@ -16104,7 +16257,12 @@ def virtualevent_view(request,id=0):
}
]
racelogos = race.logos.all()
if racelogos:
racelogo = racelogos[0]
else:
racelogo = None
return render(request,'virtualevent.html',
{
@@ -16117,6 +16275,7 @@ def virtualevent_view(request,id=0):
'buttons':buttons,
'dns':dns,
'records':records,
'racelogo':racelogo,
'form':form,
'active':'nav-racing',
})