# -*- coding: utf-8 -*- from django.shortcuts import render,render_to_response,redirect from django.template import RequestContext from django.template.response import TemplateResponse from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth import logout,login,authenticate from django.contrib.auth.models import User from django.contrib.auth import views as auth_views from django.contrib.auth.decorators import login_required,user_passes_test from models import Boat,BoatCategory,Member,Outing,Races,MemberWork from forms import OutingForm,OutingCloseForm,OutingReserveForm,MemberEditForm from forms import UserEditForm,UserCreateForm,PassWordConfirmForm from forms import BoatEditForm,BoatCategoryEditForm,RacesEditForm from forms import MemberWorkCreateForm import datetime from django.utils import timezone,translation from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse,reverse_lazy from dateutil import parser from pytz import timezone as tz,utc from django.conf import settings from django.utils.encoding import smart_text from cvkbrno.tasks import handle_sendemailwork import json import pandas as pd from requests.utils import quote from django.utils.translation import ugettext as _ from django.core.exceptions import ObjectDoesNotExist import unidecode import django_rq queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low') # settings THISCLUB = "cvkbrno" LOCALTIMEZONE = tz('Europe/Prague') TEMPLATEPREFIX = THISCLUB+'_' USER_LANGUAGE = 'cs' translation.activate(USER_LANGUAGE) BLOCKHOURS = 1.5 RACEBLOCKHOURS = 2 RESERVATIONEXPIRYMINUTES = 15 OUTINGDURATIONHOURS = 1.5 # Create your views here. def distancecount(u): member = Member.objects.get(user=u) cumdistance = 0 monthdistance = 0 yeardistance = 0 weekdistance = 0 today = timezone.now().date() weeknr = today.isocalendar()[1] thisyear = today.year thismonth = today.month # sum km own rows theoutings = Outing.objects.filter(rower=member).filter(status="completed") for o in theoutings: cumdistance += o.distance oyear = o.starttime.year oweek = o.starttime.date().isocalendar()[1] omonth = o.starttime.month if thisyear == oyear: yeardistance += o.distance if thismonth == omonth: monthdistance += o.distance if weeknr == oweek: weekdistance += o.distance theoutings = Outing.objects.filter(otherrowers=member).filter(status="completed") for o in theoutings: cumdistance += o.distance oyear = o.starttime.year oweek = o.starttime.date().isocalendar()[1] omonth = o.starttime.month if thisyear == oyear: yeardistance += o.distance if thismonth == omonth: monthdistance += o.distance if weeknr == oweek: weekdistance += o.distance return [cumdistance,yeardistance,monthdistance,weekdistance] def distancecountb(boat): cumdistance = 0 monthdistance = 0 yeardistance = 0 weekdistance = 0 today = timezone.now().date() weeknr = today.isocalendar()[1] thisyear = today.year thismonth = today.month # sum km own rows theoutings = Outing.objects.filter(boat=boat).filter(status="completed") for o in theoutings: cumdistance += o.distance oyear = o.starttime.year oweek = o.starttime.date().isocalendar()[1] omonth = o.starttime.month if thisyear == oyear: yeardistance += o.distance if thismonth == omonth: monthdistance += o.distance if weeknr == oweek: weekdistance += o.distance return [cumdistance,yeardistance,monthdistance,weekdistance] def getclubmembers(): members = Member.objects.all().filter(contributions=True).filter(club=THISCLUB) return members def getmembers_json(u): members = Member.objects.all().filter(contributions=True).filter(club=THISCLUB).exclude(user=u).order_by('user__last_name') dd = {} for m in members: dd[m.user.id] = m.user.first_name+' '+m.user.last_name return json.dumps(dd) def thisclub_member(user): member = Member.objects.get(user=user) result = user.is_authenticated() and member.club==THISCLUB and member.contributions return result def thisclub_admin(user): if user.is_authenticated(): member = Member.objects.get(user=user) result = user.is_authenticated() and member.club==THISCLUB and \ (member.status in ["administrator","coach"]) else: result = False return result def conflicting_reservations(boat,starttime,endtime): thisboatoutings = Outing.objects.filter(boat=boat).exclude(status="completed") check = False message = "" # starttime = LOCALTIMEZONE.localize(starttime) for outing in thisboatoutings: if (outing.status == "active"): if outing.starttime+datetime.timedelta(hours=OUTINGDURATIONHOURS)>starttime: check = True message = _("Boat is on the water at that time") if (outing.status == "race"): # if boat goes on transport in two hours from reservation time if (outing.starttime < starttime+datetime.timedelta(hours=RACEBLOCKHOURS)): check = True message = _("Boat is planned to go on transport at that time") # if boat is out racing during reservation time if (outing.endtime > starttime): check = True message = _("Boat is at races at that time") # if boat is already back frmo racing during reservation time if (outing.endtime <= starttime): check = False message = "" if (outing.status == "reservation"): # check if our reservation end time is before # or our reservation start time is # after this reservation if (outing.starttime < endtime and outing.endtime > starttime): check = True message = _("Conflicting reservations") if (outing.endtime > starttime) and (outing.starttime < starttime): check = True message = _("Conflicting reservations") if (outing.status == "race"): # check if our reservation end time is before # or our reservation start time is # after this reservation if (outing.starttime-datetime.timedelta(RACEBLOCKHOURS) < endtime and outing.endtime > starttime): check = True message = _("Boat will go to races at that time") if (outing.endtime > starttime) and (outing.starttime-datetime.timedelta(RACEBLOCKHOURS) < starttime): check = True message = _("Boat is at races at that time") return check,message def cleanoldreservations(): reservations = Outing.objects.filter(status="reservation") now = timezone.now() for reservation in reservations: dt = reservation.starttime if dt < now-datetime.timedelta(minutes=RESERVATIONEXPIRYMINUTES): reservation.delete() # code to change boats that go on transport and remove boats that have returned from transport races = Outing.objects.filter(status="race") for race in races: if now > race.starttime-datetime.timedelta(hours=RACEBLOCKHOURS): race.boat.status="races" race.boat.save() if now > race.endtime: race.boat.status="hangar" race.boat.save() def get_damagedboats(): damagedboats = Boat.objects.filter(status="damaged") return list(set(damagedboats)) def get_availableboats(m,t): hangarboats = Boat.objects.filter(status="hangar") cleanoldreservations() allowedboats = [] reservations = Outing.objects.filter(status="reservation") starttime = timezone.now() # add boats from allowed categories for category in m.categories.all(): thiscategoryboats = hangarboats.filter(categories=category) for theboat in thiscategoryboats: thisboatreservations = Outing.objects.filter(status="reservation",boat=theboat) addboat = True # the below should go to a subroutine # do not allow to add boats that go on transport or are reserved # in the near future for res in thisboatreservations: if (res.starttime < starttime+datetime.timedelta(hours=OUTINGDURATIONHOURS)): addboat = False if res.rower == m: addboat = True if (res.endtime): if (res.endtime > starttime): addboat = False if res.rower == m: addboat=True thisboatrace = Outing.objects.filter(status="race",boat=theboat) for race in thisboatrace: if (race.starttime < starttime+datetime.timedelta(hours=RACEBLOCKHOURS)) and (race.endtime > starttime): addboat = False race.boat.status="races" race.boat.save() if (race.endtime < starttime): addboat = True race.boat.status="hangar" race.boat.save() if addboat: allowedboats += [theboat] return list(set(allowedboats)) def get_availableboats_reservation(m,t): hangarboats = Boat.objects.filter(status__in = ["hangar","water","reservation","races"]) allowedboats = [] cleanoldreservations() reservations = Outing.objects.filter(status="reservation") # code to remove reservations from list of hangar boats # & clear reservations that are >15 min beyond start time # code to remove boats that go on transport within two hours # add boats from available categories for category in m.categories.all(): allowedboats += hangarboats.filter(categories=category) return list(set(allowedboats)) def get_active_outings(): activeoutings = Outing.objects.filter(status="active") return activeoutings def get_future_reservations(): cleanoldreservations() reservations = Outing.objects.filter(status="reservation").order_by("starttime") return reservations def get_future_races(): cleanoldreservations() races = Races.objects.filter(startdatetime__gt=timezone.now()).order_by("startdatetime") return races def login_user_view(request,activeoutings=get_active_outings(),reservations=get_future_reservations()): logout(request) request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE username = password = '' if request.POST: username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: if user.is_active: login(request, user) url = reverse(base_view) return HttpResponseRedirect(url) return render(request,'cvkbrno_login.html', {'activeoutings':get_active_outings(), 'reservations':get_future_reservations()}) def change_language_view(request,languagecode): USER_LANGUAGE = languagecode translation.activate(USER_LANGUAGE) request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE url = request.META.get('HTTP_REFERER','/') return HttpResponseRedirect(url) @login_required(login_url='/cvkbrno/login/') def base_view(request): cleanoldreservations() request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE # Switcher between different views depending on user's status member = Member.objects.get(user=request.user) activeoutings = Outing.objects.filter(status="active",rower=member) if (len(activeoutings)!=0): # we are still out url = reverse(closeouting_view) return HttpResponseRedirect(url) else: url = reverse(createouting_view) return HttpResponseRedirect(url) def logout_then_login(request): logout(request) extra_context = {'activeoutings':get_active_outings()} context = RequestContext(request) context.update(extra_context) activeoutings = get_active_outings() url = reverse(base_view) return HttpResponseRedirect(url) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def boats_admin_view(request,message="",successmessage=""): cleanoldreservations() theboats = Boat.objects.all().order_by("boatcode") theoutings = Outing.objects.exclude(status="reservation").exclude(status="race").order_by("-starttime")[0:20] return render(request, TEMPLATEPREFIX+'boats_admin.html', {'theboats':theboats, 'theoutings':theoutings, 'message':message, 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def categories_admin_view(request,message="",successmessage=""): cleanoldreservations() thecats = BoatCategory.objects.all().order_by("name") return render(request, TEMPLATEPREFIX+'categories_admin.html', {'thecats':thecats, 'message':message, 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_admin_view(request,message="",successmessage=""): cleanoldreservations() themembers = Member.objects.filter(club=THISCLUB).order_by('user') return render(request, TEMPLATEPREFIX+'members_admin.html', {'themembers':themembers, 'message':message, 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_work_admin_view(request,message="",successmessage=""): cleanoldreservations() theworks = MemberWork.objects.filter(status='planned') return render(request, TEMPLATEPREFIX+'memberswork_admin.html', {'theworks':theworks, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_work_add_view(request,message="",successmessage=""): cleanoldreservations() if request.method == 'POST': # Form was submitted form = MemberWorkCreateForm(request.POST) if form.is_valid(): # do something res = addmemberwork(request.POST) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage.encode('utf8') if message != "": kwargs['message'] = message.encode('utf8') theworks = MemberWork.objects.filter(status='planned') # args['theworks'] = theworks url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'memberswork_add_form.html', {'form':form, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user), } ) else: form = MemberWorkCreateForm() if (message != ""): return render(request, TEMPLATEPREFIX+'memberswork_add_form.html', {'form':form, 'message':message, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'memberswork_add_form.html', {'form':form, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def boats_admin_delete_confirm_view(request,id): theboat = Boat.objects.get(id=id) return render(request, TEMPLATEPREFIX+'boat_delete_confirm.html', {'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def outing_admin_view(request,id): theouting = Outing.objects.get(id=id) return render(request, TEMPLATEPREFIX+'outing_admin.html', {'outing':theouting, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def categories_admin_delete_confirm_view(request,id): thecategory = BoatCategory.objects.get(id=id) return render(request, TEMPLATEPREFIX+'categories_delete_confirm.html', {'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_admin_delete_confirm_view(request,id): themember = Member.objects.get(id=id) return render(request, TEMPLATEPREFIX+'members_delete_confirm.html', {'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def boats_admin_delete_view(request,id): try: theboat = Boat.objects.get(id=id) theboat.delete() except: pass url = reverse(boats_admin_view,kwargs={ 'successmessage': _("boat deleted").encode('utf8'), }) return HttpResponseRedirect(url) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_admin_delete_view(request,id): try: themember = Member.objects.get(id=id) themember.user.delete() themember.delete() except: pass url = reverse(members_admin_view,kwargs={ 'successmessage': _("member deleted").encode('utf8'), }) return HttpResponseRedirect(url) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def categories_admin_delete_view(request,id): try: thecategory = BoatCategory.objects.get(id=id) thecategory.delete() except: pass url = reverse(categories_admin_view,kwargs={ 'successmessage': _("category deleted").encode('utf8'), }) return HttpResponseRedirect(url) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def boats_admin_add_view(request,message="",successmessage=""): if request.method == 'POST': # Form was submitted form = BoatEditForm(request.POST) if form.is_valid(): # do something res = addboat(request.POST) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage.encode('utf8') if message != "": kwargs['message'] = message.encode('utf8') if theid != 0: kwargs['id'] = int(theid) url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'boat_add_form.html', {'form':form, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user), } ) else: form = BoatEditForm() if (message != ""): return render(request, TEMPLATEPREFIX+'boat_add_form.html', {'form':form, 'message':message, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'boat_add_form.html', {'form':form, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_admin_add_view(request,message="",successmessage=""): if request.method == 'POST': # Form was submitted form = MemberEditForm(request.POST) if form.is_valid(): # do something res = addmember(request.POST) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage if message != "": kwargs['message'] = message if theid != 0: kwargs['id'] = int(theid) url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: memberform = form userform = UserCreateForm() passwordconfirmform = PassWordConfirmForm() return render(request, TEMPLATEPREFIX+'member_add_form.html', {'form1':memberform, 'form2':userform, 'form3':passwordconfirmform, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: memberform = MemberEditForm() userform = UserCreateForm() passwordconfirmform = PassWordConfirmForm() if (message != ""): return render(request, TEMPLATEPREFIX+'member_add_form.html', {'form1':memberform, 'form2':userform, 'form3':passwordconfirmform, 'message':message, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'member_add_form.html', {'form1':memberform, 'form2':userform, 'form3':passwordconfirmform, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def categories_admin_add_view(request,message="",successmessage=""): if request.method == 'POST': # Form was submitted form = BoatCategoryEditForm(request.POST) if form.is_valid(): # do something message = "" successmessage = "" name = request.POST['name'] thecategory = BoatCategory(name=name) thecategory.save() kwargs = {} if message != "": kwargs['message'] = message if successmessage != '': kwargs['successmessage'] = successmessage url = reverse(categories_admin_view,kwargs=kwargs) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'category_add_form.html', {'form':form, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: form = BoatCategoryEditForm() if (message != ""): return render(request, TEMPLATEPREFIX+'category_add_form.html', {'form':form, 'message':message, 'successmessage':successmessage, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'category_add_form.html', {'form':form, 'successmessage':successmessage, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def boats_admin_edit_view(request,id,message="",successmessage=""): theboat = Boat.objects.get(id=id) if request.method == 'POST': # Form was submitted form = BoatEditForm(request.POST) if form.is_valid(): res = editboat(request.POST,theboat) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage if message != "": kwargs['message'] = message if theid != 0: kwargs['id'] = int(theid) url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: theoutings = Outing.objects.exclude(status="reservation").filter(boat=theboat).order_by("-starttime")[0:20] return render(request, TEMPLATEPREFIX+'boat_edit_form.html', {'form':form, 'theoutings':theoutings, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: form = BoatEditForm(instance=theboat) theoutings = Outing.objects.exclude(status="reservation").filter(boat=theboat).order_by("-starttime")[0:20] if (message != ""): return render(request, TEMPLATEPREFIX+'boat_edit_form.html', {'form':form, 'message':message, 'theoutings':theoutings, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'boat_edit_form.html', {'form':form, 'theoutings':theoutings, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_work_edit_view(request,id,message="",successmessage=""): thework = MemberWork.objects.get(id=id) if request.method == 'POST': # Form was submitted form = MemberWorkCreateForm(request.POST) if form.is_valid(): res = editmemberwork(request.POST,thework) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage if message != "": kwargs['message'] = message if theid != 0: kwargs['id'] = int(theid) url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'memberwork_edit_form.html', {'form':form, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: form = MemberWorkCreateForm(instance=thework) if (message != ""): return render(request, TEMPLATEPREFIX+'memberwork_edit_form.html', {'form':form, 'message':message, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'memberwork_edit_form.html', {'form':form, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_admin_edit_view(request,id,message="",successmessage=""): themember = Member.objects.get(id=id) if request.method == 'POST': # Form was submitted form = MemberEditForm(request.POST) if form.is_valid(): res = editmember(request.POST,themember) func = res[0] message = res[1] successmessage = res[2] theid = res[3] kwargs = {} if successmessage != "": kwargs['successmessage'] = successmessage if message != "": kwargs['message'] = message if theid != 0: kwargs['id'] = int(theid) url = reverse(func,kwargs = kwargs) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'member_edit_form.html', {'form1':memberform, 'form2':userform, 'id':id, 'username': themember.user.username, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: memberform = MemberEditForm(instance=themember) userform = UserEditForm(instance=themember.user) if (message != ""): return render(request, TEMPLATEPREFIX+'member_edit_form.html', {'form1':memberform, 'form2':userform, 'username': themember.user.username, 'message':message, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'member_edit_form.html', {'form1':memberform, 'form2':userform, 'username': themember.user.username, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def categories_admin_edit_view(request,id,message="",successmessage=""): thecategory = BoatCategory.objects.get(id=id) if request.method == 'POST': # Form was submitted form = BoatCategoryEditForm(request.POST) if form.is_valid(): # do something message = "" successmessage = "" name = request.POST['name'] thecategory.name = name thecategory.save() if (message != ""): url = reverse(categories_admin_view, kwargs = { 'successmessage': _('Changes saved'), 'message': message }) else: url = reverse(categories_admin_view, kwargs = { 'successmessage': _('Changes saved'), }) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'categories_edit_form.html', {'form':form, 'successmessage':successmessage, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: form = BoatCategoryEditForm(instance=thecategory) if (message != ""): return render(request, TEMPLATEPREFIX+'categories_edit_form.html', {'form':form, 'message':message, 'successmessage':successmessage, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) else: return render(request, TEMPLATEPREFIX+'categories_edit_form.html', {'form':form, 'successmessage':successmessage, 'id':id, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,} ) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def meterboard_view(request,message="",successmessage="",sortby="year"): try: sortby = request.GET['sortby'] except KeyError: pass now = timezone.now() members = getclubmembers() boats = Boat.objects.all() df = pd.DataFrame() dfb = pd.DataFrame() theoutings = Outing.objects.exclude(status="reservation").exclude(status="race").order_by("-starttime")[0:20] for member in members: cumdist,yeardist,monthdist,weekdist = distancecount(member.user) df2 = pd.DataFrame( { 'Cumulative Distance':[cumdist], 'This Year':[yeardist], 'This Month':[monthdist], 'This Week':[weekdist], }, index = [member] ) df = df.append(df2) for boat in boats: cumdist,yeardist,monthdist,weekdist = distancecountb(boat) df3 = pd.DataFrame( { 'Cumulative':[cumdist], 'This Year':[yeardist], 'This Month':[monthdist], 'This Week':[weekdist], }, index = [boat] ) dfb = dfb.append(df3) sortorder = ['This Year', 'This Month', 'This Week'] if sortby == 'month': sortorder = ['This Month','This Year','This Week'] if sortby == 'week': sortorder = ['This Week','This Year','This Month'] data = df.sort_values(by=sortorder,ascending=False).to_html(classes='listtable paddedtable',columns=['This Year','This Month','This Week']) datab = dfb.sort_values(by=sortorder,ascending=False).to_html(classes='listtable paddedtable',columns=['This Year','This Month','This Week']) return render(request, TEMPLATEPREFIX+'meterboard.html', {'data':data, 'datab':datab, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def createouting_view(request,message="",successmessage=""): cleanoldreservations() today = timezone.now().date() member = Member.objects.get(user=request.user) activeoutings = Outing.objects.filter(rower=member,status="active") theboats = get_availableboats(member,timezone.now()) plannedwork = MemberWork.objects.filter(status='planned') # You are still out if (len(activeoutings)!=0): # we are still out errormessg = _("You still have an active outing. Check in first.").encode('utf8') url = reverse(closeouting_view, kwargs = { 'message':str(errormessg), }) return HttpResponseRedirect(url) # You have submitted the form if request.method == 'POST': # Form was submitted form = OutingForm(request.POST) # form is valid if form.is_valid(): # Get values from form dist = request.POST['distance'] boat = Boat.objects.get(id=request.POST['boat']) boat.status = "water" boat.save() additionalcrew = [] if boat.nrseats>1: for i in range(boat.nrseats-1): snr = i+2 try: crewid = int(request.POST['crew'+str(snr)]) except: message = _("You must select additional crew members for this boat") return render(request, TEMPLATEPREFIX+'outing_form.html', {'form':form, 'theboats':theboats, 'reservations':get_future_reservations(), 'races':get_future_races(), 'damagedboats':get_damagedboats(), 'plannedwork':plannedwork, 'member':member, 'message':message, 'jsonmembers':getmembers_json(request.user), 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) additionalcrew.append(Member.objects.get(user__id=crewid)) # remove duplicates additionalcrew = list(set(additionalcrew)) starttime = timezone.now() myreservations = Outing.objects.filter(status="reservation", rower=member, starttime__year=today.year, starttime__month=today.month, starttime__day=today.day).order_by("starttime") # form is valid and you have some reservation (for today) if len(myreservations) != 0: nextreservation=myreservations.first() # you are taking the boat that you reserved if (nextreservation.boat == boat): nextreservation.starttime = starttime nextreservation.status = "active" nextreservation.distance = dist nextreservation.save() for member in additionalcrew: nextreservation.otherrowers.add(member) nextreservation.save() # you are taking another boat else: o = Outing(starttime=starttime,rower=member, boat=boat,distance=dist, status="active") o.save() for member in additionalcrew: o.otherrowers.add(member) o.save() # form is valid and you have no reservations else: o = Outing(starttime=starttime,rower=member,boat=boat, distance=dist, status="active") o.save() for member in additionalcrew: o.otherrowers.add(member) o.save() if not settings.DEBUG: logout(request) url = reverse(base_view) return HttpResponseRedirect(url) # You have not submitted a form with errors else: return render(request, TEMPLATEPREFIX+'outing_form.html', {'form':form, 'theboats':theboats, 'reservations':get_future_reservations(), 'races':get_future_races(), 'member':member, 'damagedboats':get_damagedboats(), 'plannedwork':plannedwork, 'message':message, 'jsonmembers':getmembers_json(request.user), 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) # You have not submitted the form else: form = OutingForm( initial={'distance':12, } ) today = timezone.now().date() myreservations = Outing.objects.filter(status="reservation", rower=member, starttime__year=today.year, starttime__month=today.month, starttime__day=today.day).order_by("starttime") form = OutingForm( initial={ 'distance':12, }) return render(request, TEMPLATEPREFIX+'outing_form.html', {'form':form, 'theboats':theboats, 'reservations':get_future_reservations(), 'member':member, 'races':get_future_races(), 'damagedboats':get_damagedboats(), 'plannedwork':plannedwork, 'message':message, 'successmessage':successmessage, 'jsonmembers':getmembers_json(request.user), 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def closeouting_view(request,message="",successmessage=""): cleanoldreservations() member = Member.objects.get(user=request.user) activeoutings = Outing.objects.filter(rower=member,status="active") if (len(activeoutings)==0): # no active outings errormessg = _("You have no active outings. Go rowing first.").encode('utf8') url = reverse(createouting_view, kwargs = { 'message':str(errormessg), }) return HttpResponseRedirect(url) if request.method == 'POST': # Form was submitted form = OutingCloseForm(request.POST) if form.is_valid(): # Get values from form dist = request.POST['distance'] comment = request.POST['comment'] endtime = timezone.now() damagecheck = request.POST['damagecheck'] o = Outing.objects.get(rower=member,status="active") if (damagecheck == "No"): o.boat.status = _("damaged") o.boat.comment += "\n"+timezone.localtime(timezone.now()).strftime('%Y-%m-%d %H:%M:%S') o.boat.comment += " "+comment else: o.boat.status = "hangar" o.boat.save() o.endtime = endtime o.comment = comment o.distance = dist o.status = "completed" o.save() if not settings.DEBUG: logout(request) url = reverse(base_view) return HttpResponseRedirect(url) else: outing = Outing.objects.get(rower=member,status="active") form = OutingCloseForm() return render(request, TEMPLATEPREFIX+'outing_closeform.html', {'form':form, 'outing':outing, 'thisclub_admin':thisclub_admin(request.user), 'message':message, 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) def get_races(datum): allraces = Races.objects.filter(enddatetime__gt=datum) return allraces @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def transport_view(request,message="",successmessage=""): cleanoldreservations() theraces = get_future_races() return render(request, TEMPLATEPREFIX+'races_list.html', {'races':theraces, 'thisclub_admin':thisclub_admin(request.user), 'message':message, 'successmessage':successmessage, 'worked_hours':Member.objects.get(user=request.user).hoursworked, }) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def transport_add_view(request,message="",successmessage=""): cleanoldreservations() member = Member.objects.get(user=request.user) theboats = Boat.objects.all().order_by("boatcode") if request.method=='POST': #Form was submitted form = RacesEditForm(request.POST) if form.is_valid(): # Get values from form name = form.cleaned_data['name'] startdate = form.cleaned_data['startdate'] starttime = form.cleaned_data['starttime'] enddate = form.cleaned_data['enddate'] endtime = form.cleaned_data['endtime'] transportboats = form.cleaned_data['transportboats'] startdatetime = (str(startdate) + ' ' + str(starttime)) startdatetime = datetime.datetime.strptime(startdatetime, "%Y-%m-%d %H:%M:%S") startdatetime = timezone.make_aware(startdatetime, timezone=LOCALTIMEZONE) enddatetime = (str(enddate) + ' ' + str(endtime)) enddatetime = datetime.datetime.strptime(enddatetime, "%Y-%m-%d %H:%M:%S") enddatetime = timezone.make_aware(enddatetime, timezone=LOCALTIMEZONE) r = Races(name=name, startdatetime=startdatetime, enddatetime=enddatetime) r.save() for b in transportboats: r.transportboats.add(b) o = Outing(starttime=startdatetime, endtime=enddatetime, distance=0, comment=name, boat=b, rower=member, status="race") o.save() o.race.add(r) o.save() r.save() successmessage = _("Race has been saved").encode('utf8') return render(request, TEMPLATEPREFIX+'races_list.html', { 'thisclub_admin':thisclub_admin(request.user), 'message':message, 'races':get_future_races(), 'successmessage':successmessage, 'worked_hours':Member.objects.get(user=request.user).hoursworked, }) else: return render(request, TEMPLATEPREFIX+'races_form.html', {'form':form, 'theboats':theboats, 'thisclub_admin':thisclub_admin(request.user), 'message':message, 'successmessage':successmessage, 'worked_hours':Member.objects.get(user=request.user).hoursworked, }) else: form = RacesEditForm() return render(request, TEMPLATEPREFIX+'races_form.html', {'form':form, 'theboats':theboats, 'thisclub_admin':thisclub_admin(request.user), 'message':message, 'successmessage':successmessage, 'worked_hours':Member.objects.get(user=request.user).hoursworked, }) @user_passes_test(thisclub_admin,login_url="cvkbrno/login") def races_admin_delete_view(request,id): # put in a try except block try: therace = Races.objects.get(id=id) theoutings = Outing.objects.filter(race=therace) for outing in theoutings: outing.delete() therace.delete() except ObjectDoesNotExist: pass successmessage = _("Race deleted") url = reverse(transport_view, kwargs={ 'successmessage':successmessage, }) return HttpResponseRedirect(url) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_work_complete_view(request,id=0): thework = MemberWork.objects.get(id=id) thework.status = "executed" thework.save() for member in thework.worker.all(): member.hoursworked+=thework.hours member.save() theworks = MemberWork.objects.filter(status='planned') return render(request, TEMPLATEPREFIX+'memberswork_admin.html', {'theworks':theworks, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_admin,login_url="/cvkbrno/login") def members_work_delete_view(request,id=0): thework = MemberWork.objects.get(id=id) thework.delete() theworks = MemberWork.objects.filter(status='planned') return render(request, TEMPLATEPREFIX+'memberswork_admin.html', {'theworks':theworks, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def members_work_addme(request,id,message="",successmessage=""): thework = MemberWork.objects.get(id=id) themember = Member.objects.get(user=request.user) thework.worker.add(themember) url = reverse(base_view) return HttpResponseRedirect(url) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def members_work_removeme(request,id,message="",successmessage=""): thework = MemberWork.objects.get(id=id) themember = Member.objects.get(user=request.user) thework.worker.remove(themember) url = reverse(base_view) return HttpResponseRedirect(url) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def makereservation_view(request,message="",successmessage=""): cleanoldreservations() member = Member.objects.get(user=request.user) activeoutings = Outing.objects.filter(rower=member,status="active") theboats = get_availableboats_reservation(member,timezone.now()) # theboats = Boat.objects.filter(status__in = ["hangar", "water", "races"]) if (len(activeoutings)!=0): # we are still out url = reverse(closeouting_view) return HttpResponseRedirect(url) if request.method == 'POST': # Form was submitted form = OutingReserveForm(request.POST) if form.is_valid(): # Get values from form dist = request.POST['distance'] boat = Boat.objects.get(id=request.POST['boat']) stime = request.POST['starttime'] sdate = request.POST['startdate'] etime = request.POST['endtime'] starttime = parser.parse(sdate+' '+stime) #starttime = timezone.make_aware(starttime) starttime = LOCALTIMEZONE.localize(starttime) endtime = parser.parse(sdate+' '+etime) #endtime = timezone.make_aware(endtime) endtime = LOCALTIMEZONE.localize(endtime) # check if conflicting reservations exist check,errormessg = conflicting_reservations(boat,starttime,endtime) if check: url = reverse(makereservation_view, kwargs = { 'message':errormessg, }) return HttpResponseRedirect(url) else: o = Outing(starttime=starttime,endtime=endtime,rower=member, boat=boat,distance=dist, status="reservation") o.save() # if not settings.DEBUG: # logout(request) url = reverse(base_view) return HttpResponseRedirect(url) else: return render(request, TEMPLATEPREFIX+'reservation_form.html', {'form':form, 'theboats':theboats, 'reservations':get_future_reservations(), 'message':message, 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) else: nownaive = timezone.now().replace(tzinfo=None) nowlocal = timezone.now().astimezone(LOCALTIMEZONE) form = OutingReserveForm( initial={'distance':11, 'starttime': nowlocal, 'startdate': nowlocal, 'endtime': nowlocal+datetime.timedelta(hours=1.5)} ) return render(request, TEMPLATEPREFIX+'reservation_form.html', {'form':form, 'theboats':theboats, 'reservations':get_future_reservations(), 'message':message, 'successmessage':successmessage, 'thisclub_admin':thisclub_admin(request.user), 'worked_hours':Member.objects.get(user=request.user).hoursworked,}) return HttpResponse(_("Make a reservation")) @user_passes_test(thisclub_member,login_url="/cvkbrno/login") def members_outing_delete_view(request,id): o = Outing.objects.get(id=id) o.delete() url = reverse(makereservation_view) return HttpResponseRedirect(url) # functions def addmemberwork(formdict): message = "" successmessage = "" id = 0 date = formdict['date'] name = formdict['name'] comment = formdict['comment'] worker = dict(formdict)['worker'] hours = int(formdict['hours']) status = 'planned' thework = MemberWork(date=date, hours=hours, name=name,status=status,comment=comment) thework.save() if len(worker) != 0: for index in worker: theworker = Member.objects.get(id=index) thework.worker.add(theworker) thework.save() id = thework.id theview = members_work_admin_view successmessage = _("Members Work Created") message = "" # send email members = getclubmembers() bcclist = [] for member in members: bcclist.append(member.user.email) print bcclist if settings.DEBUG: res = handle_sendemailwork.delay(bcclist,thework.name, thework.date,thework.comment) else: res = queue.enqueue(handle_sendemailwork,bcclist, thework.name,thework.date,thework.comment) return [theview,message,successmessage,id] def addbulkboat(xlsfile): df = pd.read_excel(xlsfile) for index,row in df.iterrows(): boatcode = df.ix[index,'code'] boatname = smart_text(df.ix[index,'name']) nrseats = df.ix[index,'nrseats'] status = 'hangar' cats = df.ix[index,'categories'] cats = str(cats).split() print boatcode theboat = Boat(boatcode=boatcode,boatname=boatname, nrseats=int(nrseats), status=status) theboat.save() if (len(cats) !=0): for index in cats: print index thecategory = BoatCategory.objects.get(id=index) print unidecode.unidecode(thecategory.name) theboat.categories.add(thecategory) theboat.save() def addboat(formdict): message = "" successmessage = "" id = 0 cats = dict(formdict)["categories"] boatcode = formdict['boatcode'] boatname = formdict['boatname'] nrseats = formdict['nrseats'] status = formdict['status'] comment = formdict['comment'] theboat = Boat(boatcode=boatcode,boatname=boatname, nrseats=int(nrseats), status=status,comment=comment) # check if other boat exists with new code if len(Boat.objects.filter(boatcode=boatcode)) != 0: message = _("There is already a boat with that code") theview = boats_admin_add_view return [theview,message,"",id] else: theboat.save() if len(cats) !=0: for index in cats: thecategory = BoatCategory.objects.get(id=index) theboat.categories.add(thecategory) theview = boats_admin_view successmessage = _('Boat created') message = '' return [theview,message,successmessage,id] def editboat(formdict,theboat): # do something message = "" successmessage = "" theid = 0 boatcode = formdict['boatcode'] boatname = formdict['boatname'] cats = dict(formdict)["categories"] nrseats = formdict['nrseats'] status = formdict['status'] comment = formdict['comment'] theboat.boatname = boatname theboat.nrseats = nrseats theboat.status = status theboat.comment = comment theboat.categories.clear() theboat.save() if (len(cats) !=0): for index in cats: thecategory = BoatCategory.objects.get(id=index) theboat.categories.add(thecategory) # check if other boat exists with new code if boatcode != theboat.boatcode: if len(Boat.objects.filter(boatcode=boatcode)) != 0: message = _("There is already a boat with that code") theview = boats_admin_edit_view theid = theboat.id return [theview,message,"",theid] else: theboat.boatcode = boatcode theboat.save() successmessage = _("Changes Saved") theview = boats_admin_view return [theview,"",successmessage,theid] def addbulkmember(cats,xlsfile,sheetname): df = pd.read_excel(xlsfile,sheetname=sheetname) for index,row in df.iterrows(): lastname,firstname = df.ix[index,'name'].split() email = df.ix[index,'e-mail'] username = unidecode.unidecode(lastname)+unidecode.unidecode(firstname)[0] username = username.lower() password = 'cvkbrno' contributions = True hoursworked = 0 status = 'member' print username theuser = User.objects.create_user(username,password=password) theuser.first_name = firstname theuser.last_name = lastname theuser.email = email theuser.save() themember = Member(user=theuser,status=status, contributions=contributions, hoursworked=hoursworked, club=THISCLUB) themember.save() if (len(cats) !=0): for index in cats: thecategory = BoatCategory.objects.get(id=index) themember.categories.add(thecategory) themember.save() def addmember(formdict): message = "" successmessage = "" theid = 0 theview = members_admin_view status = formdict['status'] username = formdict['username'] email = formdict['email'] password = formdict['password'] password2 = formdict['passwordconfirm'] first_name = formdict['first_name'] last_name = formdict['last_name'] try: contributions = formdict['contributions'] except: contributions = False hoursworked = formdict['hoursworked'] cats = dict(formdict)["categories"] #check if passwords are equal if (password != password2): message = _("The two passwords are not equal") theview = members_admin_add_view theid = 0 return [theview,message,"",theid] #check if there isn't already a user with this username if len(User.objects.filter(username=username)) != 0: message = _("There is already a user with that username") theview = members_admin_add_view theid = 0 return [theview,message,"",theid] else: theuser = User.objects.create_user(username,password=password) theuser.first_name = first_name theuser.last_name = last_name theuser.email = email theuser.save() themember = Member(user=theuser,status=status, contributions=contributions, hoursworked=hoursworked, club=THISCLUB) themember.save() if (len(cats) !=0): for index in cats: thecategory = BoatCategory.objects.get(id=index) themember.categories.add(thecategory) themember.save() successmessage = _("New Member Created") return [theview,"",successmessage,theid] def editmemberwork(formdict,thework): message = "" successmessage = "" theid = thework.id theview = members_work_admin_view name = formdict['name'] date = formdict['date'] comment = formdict['comment'] workers = dict(formdict)["worker"] hours = formdict['hours'] thework.date = date thework.name = name thework.hours = hours thework.comment = comment thework.save() if (len(workers) != 0): for index in workers: theworker = Member.objects.get(id=index) thework.worker.add(theworker) thework.save() successmessage = _("Members Work Updated") return [theview,"",successmessage,0] def editmember(formdict,themember): message = "" successmessage = "" theid = themember.id theview = members_admin_view status = formdict['status'] first_name = formdict['first_name'] last_name = formdict['last_name'] try: contributions = formdict['contributions'] except: contributions = False hoursworked = formdict['hoursworked'] cats = dict(formdict)["categories"] email = formdict['email'] themember.status = status themember.contributions = contributions themember.hoursworked = hoursworked themember.categories.clear() if (len(cats) !=0): for index in cats: thecategory = BoatCategory.objects.get(id=index) themember.categories.add(thecategory) themember.save() theuser = themember.user theuser.first_name = first_name theuser.last_name = last_name theuser.email = email theuser.save() successmessage = _("Changes saved") return [theview,"",successmessage,0]