def userhome(request, language=''): """ Representa la vista de la pàgina privada d'usuari Des d'aquesta vista serà possible realitzar els CheckIn dels vols adquirits """ # per accedir a aquesta és condició impresicindible estar autenticat if not request.user.is_authenticated(): return HttpResponseRedirect("/flylo/" + language + "/users/login") # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) client_flights_items = ClientFlights.objects.filter( username=request.user.username) client_flights = [] # s'obtenen els atributs que falten de la relació 'Flight' original. for flight in client_flights_items: flight_obj = Flight.objects.get(flight_number=flight.flight_number) flight_obj.airline = flight.airline flight_obj.seats = flight.seats flight_obj.category = flight.category flight_obj.status = flight.status flight_obj.passengers_names = flight.passengers_names.split('/') client_flights.append(flight_obj) # s'adapta el preu en funció de l'algorisme de càlcul de preu de vol flight_obj.price = Flight.compute_flight_price_algorithm(flight_obj) context = {'request': request, 'client_flights': client_flights} # s'intenta accedir al client i es gestiona si es tracta de l'admin # normalment l'admin ppodria actuar com a client. Això és, però, una mesura de seguretat. try: user = User.objects.get(username=request.user.username) client = Client.objects.get(user=user) context['client'] = client except Client.DoesNotExist: context['error_client'] = True # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/userhome.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def airline_info(request, language='', name='', flight_number=None): """ Gestiona el template airline-info.html """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # s'intenta fer la consulta requerida per paràmetre try: # aerolinia per la que es fa la query airline = Airline.objects.get(name=name) # vol pel qual es dóna informació sobre l'aerolinia flight = Flight.objects.get(flight_number=flight_number) # si la consulta falla es redirecciona a 404 except Airline.DoesNotExist: raise handler404(request) # categories que ofereix l'aerolinia segons el vol airline_categories = flight.aircraft.category_set.all() context = { 'flight': flight, 'airline': airline, 'airline_categories': airline_categories } # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/airline-info.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def aircraft_info(request, language='', name=''): """ Gestiona el template aircraft-info.html """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # s'intenta fer la consulta requerida per paràmetre try: aircraft = Aircraft.objects.get(name=name) # si la consulta falla es redirecciona a 404 except Aircraft.DoesNotExist: raise Http404("Page not found") # Categories disponibles a l'avió aircraft_categories = aircraft.category_set.all() context = { 'aircraft': aircraft, 'aircraft_categories': aircraft_categories, 'total_passengers': Aircraft.get_total_aircraft_passengers(aircraft_categories) } # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/aircraft-info.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def buy_success(request, language=''): """ Gestiona la compra realitzada """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/buy-success.html', page_info) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def comparator(request, language=''): """ Gestiona el comparador de vols """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # llegeix les ips del fitxer de ips with open(os.path.join('flylo/static/flylo/files/', 'ip.dat')) as ip_reader: list_of_addresses = filter(lambda x: x != '\n', ip_reader) list_of_addresses = [ line.rstrip() for line in list_of_addresses if line.endswith('\n') ] # es genera el context de l'html context = { 'list_of_addresses': list_of_addresses, 'user_agent': request.META['HTTP_USER_AGENT'], 'is_alert': 'firefox' in str(request.META['HTTP_USER_AGENT']).lower() } # s'adjunta la informació de pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/comparator.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) print('firefox' in str(request.META['HTTP_USER_AGENT']).lower()) return response
def flight_info(request, language='', flight_number=None): """ Gestiona el template 'flight-info.html' """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # s'intenta fer la consulta requerida per paràmetre try: flight = Flight.objects.get(flight_number=flight_number) # si la consulta falla es redirecciona a 404 except Flight.DoesNotExist: raise handler404(request) # aerolinies que participen en el vol airlines = flight.airlines.all() # s'adapta el preu en funció de l'algorisme de càlcul de preu de vol flight.price = Flight.compute_flight_price_algorithm(flight) context = {'flight': flight, 'airlines': airlines} # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/flight-info.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def checkin(request, language='', flight_number=None, seats=1): """ Gestions el template checkin.html on l'usuari executarà el checkin """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # s'intenta fer la consulta requerida per paràmetre try: flight = Flight.objects.get(flight_number=flight_number) # si la consulta falla es redirecciona a 404 except Flight.DoesNotExist: raise handler404(request) # afegint rellevant info al vol flight.seats = seats flight.capacity = Aircraft.get_total_aircraft_passengers( flight.aircraft.category_set.all()) context = {'request': request, 'flight': flight} # s'afegeix la infomació de la pàgina al context context.update(page_info) # es crea la resposta del server response = render(request, 'flylo/checkin.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def register(request, language=''): """ Registra un usuari en el sistema """ # es redirigeix a l'usuari al seu userhome si ja està logat if request.user.is_authenticated(): return redirect("/flylo/" + language + "/users/me") # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) context = {'request': request} # es mira si s'arriba per POST, si és així vol dir que s'ha omplert el formulari # de registre if request.method == 'POST' and request.POST['in-register'] == '1': # es reben els camps d'autentificació username = request.POST.get('username', '') password = request.POST.get('password', '') email = request.POST.get('email', '') # es comprova que tots els camps tinguin valor if username.strip() and password.strip() and email.strip(): # no es permetrà repetir nom d'usuari try: User.objects.get(username=username) context['error_message'] = page_info['LANG_USER_EXISTS'] # si l'usuari no existeix es procedeix al seu registre, es loga i finalment es redirigeix # a la seva pàgina privada d'usuari. except User.DoesNotExist: # es crea l'usuari user = User.objects.create_user(username, email, password) user.save() # se li afegeix rol de client i s'inicia el client amb mil euros client = Client(user=user, money=1000.0) client.save() # s'autologueja al registrar-se auth.login(request, user) # es comprova si el motiu del registre és un intent de compra i si és així enlloc de redirigir # a l'userhome fem que l'usuari torni a la pantalla del carret de compra disposat a executar # la compra dels vols if 'redirect_because_user_not_logged_in' in request.session.keys( ): # es neteja la variable de sessió de redirecció i es redirigeix allà on toca request.session['redirect_because_user_not_logged_in'] = '' return HttpResponseRedirect("/flylo/" + language + "/buy") return HttpResponseRedirect("/flylo/" + language + "/users/me") else: context['error_message'] = page_info[ 'LANG_ALL_FILEDS_ARE_REQUIRED'] # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/register.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def do_checkin(request, language='', flight_number=None): """ Executa el check-in. La funció es diu success ja que si arribem a aquest punt vol dir que s'acompleixen totes les condicions per fer efectiu el checkin. La primer vegada s'arriba per POST, s'executa el checkin i es redirigeix sobre ell mateix per GET, aleshores es mostra el missatge d'èxit a l'usuari. """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # si s'arriba per POST s'executa el check-in i ràpidament es redirigeix per GET if request.method == 'POST' and request.POST['in-checkin'] == '1': # s'obté el vol dels vols generals (per ocupar el seient pel passatger) flight = Flight.objects.get(flight_number=flight_number) # tractament específic d'operació atòmica try: with transaction.atomic(): # s'ocupen els seients a l'avió # és molt important apreciar que si s'ha arribat a aquest punt vol dir que els seients estaven lliures # ja que s'han fet les comprovacions per Front-End a la funció de JavaScript del fitxer checkin.html, # però si una persona fa click abans que l'altra l'única manera possible d'asegurar la integritat # de l'operació és fent que sigui atòmica flight.seats_occupied += Settings.add_seats_to_flight(request) # s'executa l'update flight.save() # s'obté el vol dels vols del client client_flight = ClientFlights.objects.get( flight_number=flight_number, username=request.user.username) # s'obté el nom dels passatgers del vol client_flight.passengers_names = Settings.get_passengers_from_post( request) # es canvia l'estat del vol del client client_flight.status = 'after_checkin' # s'executa l'update client_flight.save() # si l'update ha fallat es redirigeix a una pàgina personalitzada d'error except IntegrityError: return redirect('/flylo/' + language + '/errors/transaction') return HttpResponseRedirect(page_info['current_path']) context = {'request': request, 'flight_number': flight_number} # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/checkin-success.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def buy(request, language=''): """ Representa la vista de la pàgina del carret de compra. L'usuari està apunt de comprar. Aquesta vista no ha fer cap query de vols, doncs ha de mostrar les dades que persisteixen a la sessió. """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # es genera el cobtext del template context = {'request': request} # es comprova si hi ha sessió d'usuari tenint en compte que es pot arribar al carret de compra # amb sessió o sense. S' s'hi arriba amb sessió, s'haurà de comprovar que l'usuari té prous diners if request.user.is_authenticated(): client = None # s'intenta accedir a l'usuari client try: user = User.objects.get(username=request.user.username) client = Client.objects.get(user=user) # es comprova si l'usuari té prous diners per comprar try: context[ 'user_has_money_to_buy'] = client.money >= request.session[ "shopping_cart"].get_price() except AttributeError: context['user_has_money_to_buy'] = True context['current_client_money'] = client.money # si no el troba vol dir que s'ha accedit amb un compte d'admin. S'avisa de l'error. except Client.DoesNotExist: context['client_error'] = page_info[ 'LANG_ERROR_USER_IS_NOT_A_CLIENT'] # si el carret encara no té preu és que s'hi accedeix per capcelera. S'estableix la quantia de diners del client except KeyError: context['current_client_money'] = client.money context['user_has_money_to_buy'] = True # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/shopping-cart.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def flights(request, language='', departure=''): """ Gestiona el template 'flights.html' """ # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) # s'intenta fer la consulta requerida per paràmetre try: # es comprova que departure tingui valor per mostrar els vols requerits if departure != '': _flights = Flight.objects.filter(location_departure=departure) # en cas contrari es mostra tot el llistat de vols else: _flights = Flight.objects.all() departure = 'all' # si la consulta falla es redirecciona a 404 except Flight.DoesNotExist: raise handler404(request) # es crea un diccionari que representa els vols de retorn per cada un dels vols return_flights = {} # per cada vol... for flight in _flights: # s'obtenen els seus vols de retorn return_flights[flight.id] = Flight.objects.filter( location_departure=flight.location_arrival, location_arrival=flight.location_departure) # s'adapta el preu en funció de l'algorisme de càlcul de preu de vol flight.price = Flight.compute_flight_price_algorithm(flight) # s'obtenen les quantitats de seients acquired_flights = ClientFlights.objects.filter( flight_number=flight.flight_number) number_of_seats_occupied = sum(af.seats for af in acquired_flights) number_of_seats_total = flight.aircraft.get_total_aircraft_passengers( flight.aircraft.category_set.all()) # es crea un atribut del vol amb els seients disponibles flight.number_of_available_seats = number_of_seats_total - number_of_seats_occupied # vols de l'usuari de la sessió user_flights_ids = [] # s'omple la llista de vols de l'usuari de la sessió per no oferir els mateixos vols més d'una vegada # en cas que l'usuari ja hagi adquirit el vol. if request.user.is_authenticated(): user_flights = ClientFlights.objects.filter( username=request.user.username) for x in user_flights: user_flights_ids.append(x.flight_number) context = { 'flights': _flights, 'user_flights_ids': user_flights_ids, 'return_flights': return_flights, 'departure': departure } # s'afegeix la infomació de la pàgina al context context.update(page_info) response = render(request, 'flylo/flights.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response
def login(request, language=''): """ Gestiona la pàgina de login al sistema """ # es redirigeix a l'usuari al seu userhome si ja està logat if request.user.is_authenticated(): return redirect("/flylo/" + language + "/users/me") # informació bàsica de la pàgina actual page_info = Settings.get_page_info(request, language) # s'afegeix l'idioma si la URL no el porta if language == '': cookie_language = request.COOKIES.get( 'language') if request.COOKIES.get( 'language') else Settings.DEFAULT_SITE_LANGUAGE return redirect(Settings.redirect_to(page_info, cookie_language)) context = {'request': request} # es mira si s'arriba per POST, si és així vol dir que s'ha omplert el formulari # d'inici de sessió if request.method == 'POST' and request.POST['in-login'] == '1': # es reben els camps d'autentificació username = request.POST.get('username', '') password = request.POST.get('password', '') # s'autentifica l'usuari user = auth.authenticate(username=username, password=password) # es comprova que els camps de text hagin estat omplerts adientment if username.strip() and password.strip(): # es mira que l'usuari estigui actiu al sistema if user is not None and user.is_active: # es loga l'usuari al sistema i es redirigeix a la seva pàgina privada auth.login(request, user) # es comprova si el motiu del login és un intent de compra i si és així enlloc de redirigir # a l'userhome fem que l'usuari torni a la pantalla del carret de compra disposat a executar # la compra dels vols if 'redirect_because_user_not_logged_in' in request.session.keys( ): # es neteja la variable de sessió de redirecció i es redirigeix allà on toca request.session['redirect_because_user_not_logged_in'] = '' return HttpResponseRedirect("/flylo/" + language + "/buy") return HttpResponseRedirect("/flylo/" + language + "/users/me") else: context['error_message'] = page_info['LANG_USER_NOT_EXISTS'] else: context['error_message'] = page_info[ 'LANG_ALL_FILEDS_ARE_REQUIRED'] # s'afegeix la infomació de la pàgina al context context.update(page_info) # es genera la resposta del servidor amb la sol·licitud la pàgina destí i el context response = render(request, 'flylo/login.html', context) # es crea la cookie de l'idioma si cal Settings.set_cookie_language(response, language) return response