From 6a57f533b6e4137518737549dbf3be9ded9fd3c2 Mon Sep 17 00:00:00 2001 From: l3-washbrook <luke2.washbrook@live.uwe.ac.uk> Date: Fri, 5 May 2023 12:03:58 +0100 Subject: [PATCH 1/6] re added booking cancelations --- ...rvation_cancellation_requested_and_more.py | 23 +++++++++++++ uwe-flix/booking/models.py | 3 +- uwe-flix/booking/templates/view_bookings.html | 19 ++++++++--- uwe-flix/booking/views.py | 4 +++ .../cinema/manage_cancellations.html | 5 +++ uwe-flix/cinema/views.py | 32 +++++++++++++----- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes 7 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 uwe-flix/booking/migrations/0011_reservation_cancellation_requested_and_more.py diff --git a/uwe-flix/booking/migrations/0011_reservation_cancellation_requested_and_more.py b/uwe-flix/booking/migrations/0011_reservation_cancellation_requested_and_more.py new file mode 100644 index 00000000..08180ac9 --- /dev/null +++ b/uwe-flix/booking/migrations/0011_reservation_cancellation_requested_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.5 on 2023-05-05 10:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('booking', '0010_alter_reservation_adult_quantity_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='reservation', + name='cancellation_requested', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='reservation', + name='cancelled', + field=models.BooleanField(blank=True, default=None, null=True), + ), + ] diff --git a/uwe-flix/booking/models.py b/uwe-flix/booking/models.py index f390b1a6..a696c4e8 100644 --- a/uwe-flix/booking/models.py +++ b/uwe-flix/booking/models.py @@ -14,7 +14,8 @@ class Reservation(models.Model): child_quantity = models.IntegerField(default=0) booking_cost = models.FloatField() reservee = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='reservees', default=None) - cancelled = models.BooleanField(default=False, blank=False, null=False) + cancellation_requested = models.BooleanField(default=False, blank=False, null=False) + cancelled = models.BooleanField(default=None, blank=True, null=True) reservee_email = models.EmailField(blank=True, null=True) class Cancelation(models.Model): diff --git a/uwe-flix/booking/templates/view_bookings.html b/uwe-flix/booking/templates/view_bookings.html index 371b50b8..5c67eccb 100644 --- a/uwe-flix/booking/templates/view_bookings.html +++ b/uwe-flix/booking/templates/view_bookings.html @@ -26,11 +26,20 @@ <td>{{ book.adult_quantity }}</td> <td>{{ book.child_quantity }}</td> <td>{{ book.student_quantity }}</td> - <td> - <a href="{% url 'request_cancelation' pk=book.pk %}" - class="btn btn-danger"> - Cancel - </a> + {% if book.cancellation_requested == False and book.cancelled == None %} + <td> + <a href="{% url 'request_cancelation' pk=book.pk %}" class="btn btn-danger"> + Cancel + </a> + </td> + {% elif book.cancellation_requested == True and book.cancelled == None %} + <td> Requested </td> + {% elif book.cancellation_requested == True and book.cancelled == True %} + <td> Approved </td> + {% else %} + <td> Denied </td> + {% endif %} + </td> </tr> diff --git a/uwe-flix/booking/views.py b/uwe-flix/booking/views.py index 1f6d84d2..63b288d9 100644 --- a/uwe-flix/booking/views.py +++ b/uwe-flix/booking/views.py @@ -195,6 +195,10 @@ def make_club_booking(request, pk): def request_cancelation(request, pk): reservation = Reservation.objects.get(id=pk) + + reservation.cancellation_requested = True + reservation.save() + cancelation = Cancelation(reservation=reservation) cancelation.save() diff --git a/uwe-flix/cinema/templates/cinema/manage_cancellations.html b/uwe-flix/cinema/templates/cinema/manage_cancellations.html index 0305206b..ac43fdb4 100644 --- a/uwe-flix/cinema/templates/cinema/manage_cancellations.html +++ b/uwe-flix/cinema/templates/cinema/manage_cancellations.html @@ -19,6 +19,7 @@ <td>{{ cancellation.reservation.booking_cost }}</td> <td>{{ cancellation.approved }}</td> <td> + {% if cancellation.approved == None %} <a href="{% url 'approve_cancellation' pk=cancellation.pk %}" class="btn btn-primary" @@ -29,6 +30,10 @@ class="btn btn-danger" >Disapprove</a > + {% else %} + None Required + {% endif %} + </td> </tr> diff --git a/uwe-flix/cinema/views.py b/uwe-flix/cinema/views.py index e655a412..6f8b4007 100644 --- a/uwe-flix/cinema/views.py +++ b/uwe-flix/cinema/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages from .forms import ScreenForm, ShowingForm, FilmForm, CinemaForm, TicketForm from .models import Screen, Cinema, Film, Showing, Ticket -from booking.models import Cancelation +from booking.models import Cancelation,Reservation from authentication.models import User from utils.custom_decorators import get_user_permissions, is_in_group from datetime import datetime @@ -345,34 +345,48 @@ def bookings_list(request): def approve_cancellation(request, pk): """ - Handle a user disabling a user account via the user management page. + Handle a cinema manager approving a user cancellation via the cancellation management page. Returns: - A redirect to the user management page. + A redirect to the cancellation management page. """ perms = get_user_permissions(request) if perms == '0' or perms == '1': return redirect('no_access') - booking = get_object_or_404(Cancelation, pk=pk) - booking.approved = True + cancellation = get_object_or_404(Cancelation, pk=pk) + cancellation.approved = True + cancellation.save() + + booking = get_object_or_404(Reservation, pk=cancellation.reservation.pk) + booking.cancelled = True booking.save() + + booking.reservee.account.balance = float(booking.reservee.account.balance) + booking.booking_cost + booking.reservee.account.save() + + return redirect('cancellation_management') def disapprove_cancellation(request, pk): """ - Handle a user disabling a user account via the user management page. + Handle a cinema manager disapproving a user cancellation via the cancellation management page. Returns: - A redirect to the user management page. + A redirect to the cancellation management page. """ perms = get_user_permissions(request) if perms == '0' or perms == '1': return redirect('no_access') - booking = get_object_or_404(Cancelation, pk=pk) - booking.approved = False + cancellation = get_object_or_404(Cancelation, pk=pk) + cancellation.approved = False + cancellation.save() + + booking = get_object_or_404(Reservation, pk=cancellation.reservation.pk) + booking.cancelled = False booking.save() + return redirect('cancellation_management') def delete_showing(request, pk): diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index 8aa119331c13e8ef08eb9bcdc8aa0cb9938fa38d..46d849321302ae210be4e2167467bf2cbc1f94f8 100644 GIT binary patch delta 2675 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 delta 2406 zcmai0du&@*8NZL?_{OpCaq6aNlBV&prcD@j?!#{=i4(U8v7I;%cS)z!as1B1cKk@( zR3XW_uK$!atJ%)>$F!AcXv-+uF!Unm9|gn&|F9w<1}Itzf@)<#f)0Vym6mhuunv@J zK04pey6619?|ct^=d51StzOfuH`Ue<1Tl!G8&49?e?R+0QBgw}1N+_yf3v0ikQUxz z53${F4*m#w*&Fa{?7Qq)_!xVS{Vp4azlL@2RrV76Rp}9KQ=?$ViDm}<I1TnH>M2?z z5jjEWie1J=^0&p~MuTEc6D=~ub4H0|imp!I?p@WPL^3iL4CE4_nMiJr5ig@l%RpDB zQ_uz`JRMBNQh{K2E|Cn(reekGot>~x1Ji_(-K3!!{sI1^#Bv+#flkGADxM6KMKBaf z<&!z=jzB7TMfXb?>=r=;i<@8JKr>lI6t!KGb@+>(WXw9nXf7X)By)kWNH$kI({;GL znXV#8M${=PcDH3k=~$1enc7}1{iUmMa$gnPBH&&4clb~E5&SdUf>$4m60g6hELFY! zo>D~^G}vOh8qlS!x7w})LQ4=xyGo8B{VK^w;Z^bstj9a*nJO%683mR#427kFxw1}z zRYqn&5A-0tmO3DDTB-!w2x7lViTCVP$*f%}nWa_%EUQ$s3Pah9UQZoBoSxb(3n01l z)XT6LQ<*ZgY;afEpqeRD8TtxG0d3`s`fi!rEt9)tayRw9h9=0H=-Y0p1E~io)gz*b z=W(>(ggmJsNvAj(Pc0^rF@0)kIugq1+eLKOOEs)m&7#GM_obn|ypJD=WFwh{U@nnL ze!7?MpjC{(38H}$4T4F}3l4#I2v(!jWEQOgrt{l$VJEuqP`Y^BCfMvaBDc5s;!b?= z;e4LAnK8YD=}%xUKWiRc7^DuaRP;q6txqm5KlvFaL_KeIm@E!6c0v#ZPCkSe+N&S? zKP{ieK<IelRBJFCj)Yqs`cpeA<7`HY)o!r~a+U%7kbqLPkNN~|7uF=zf?6giM(UiT zekd2#Ub!@Ma(Y=Bi)y*Dz%yy;`RhPYUo%axzgMqozF#w~a#ib<pH%%u@eVkL%Qpk0 z^ErAQd_k~3)ygWor$?P!su0dD@s|AJEGJkOt=4Fkx5oHr!k(Bi2W>fYZ-FkY#OG6- zW2WHoEZTawnN)vtFxTHxhz&=b^CPiAKGRoN3PwgodZ#>nqenvvi<Oj{3_Ok&?=bTY zjx+Km-fF`cKj=N}cM4WMp0&rPOzC(w5sA!+LRjFI%vS3{(862h%*Mz-;n=h{JG7W^ z4v(xv4M%gMM{GT_=}>+lG}Y_%di~RW&K(imhM_<(?OX_pN#9U(Vs0Xr8Sl$Py`uw# zfut!ko(|iF{QdTVFzk!^r!qcoh|iDrMjp?f{OX_(IW7z&%~4liET5VWhZkI9@tNL& zxj!NJhT_xC376l=x%&jqN-X5b4tkFCjax?&>BU~Z%b!e|1{OVwqcgK&JP_?!3b`G8 zIzN?lJ1jF3Ctayy7LRqj-_U=|?dC^@1Nr<s7aQ=UobDrePd?S}AD_1wVwEtN4ZKay zTO6X`-~}Tm@;0mZ)T0WV9=~&%UrO6;QsESR4(tVRj)0r+BJSQ2l-PS^+=QFBTQ9Ka z;(7YHBcGQ}78gp}=LH|lUZ7u~0X!oq*XaQ$?vO`8R@CzF^Gi>^O#cp&chHHq=u70C zD{s?)Q<Zz(`w$O_y+MBfTd|Ja1lfo|LsVm_BuMJNeGYyg4~hL7{YS{*HEp9@>8f%M zr8G5f6IIps2^eEv(cG@Sull9>1at7gz_o5sO2?GoHi_O;f@Y*-09zb>!>4xD)Dmll zolIR_LkGIdg685c-q1<+tHJk3)pzg;!E`h<b;&FH&{;L;MSoI*9&|zt{)K+Pf?CwB z!r#uQz<~6z2DFk|T;L{$8FvKEC|WF>h}t07!q>=U0^Wev;4OF=->M(OZ#@{L+U^O6 zPPTykdy>IeB%{V|g$5$gsC;)HpA`+#<rXmGQ)xcbd|6$j?oxln-n>iJ;Qxn|^@k6W zXD86rG`ItqFOjWEESi<|1_OCox|;!A3fvP&HR>vWQDn}7Jo<SS96%dc&?Fr_3A{8| zYg=nVEz96F#ajDXqY?!z^ig!P0D?77?_O(A){7!}c1U_}8GM~Y%NejAeYAqTw%BPM zdVK{nq45l8eY8Wq{nY9W0{#>(Ll@k|US(%lgXWgzRn6lXQoR97QtK+<)Z;WsvBZm2 zWq6?ir~=Pd;JFHXqXNYWT&%#e6<Dvpg$kT6gS2rDoX|0Fiv1bet$9t-z5@Qysg?^2 v{|@2VfWy2B(fSr>@5j%L|GD-XD|fzTrzb%peo^4(f=1yiKT|4l`wj9Rlptr7 -- GitLab From 6c1c1277ef33ab428b37a36470292b4d9b9dde0b Mon Sep 17 00:00:00 2001 From: l3-washbrook <luke2.washbrook@live.uwe.ac.uk> Date: Fri, 5 May 2023 12:12:31 +0100 Subject: [PATCH 2/6] fixed payment topup --- uwe-flix/accounts/views.py | 2 +- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/uwe-flix/accounts/views.py b/uwe-flix/accounts/views.py index 4f0fdddd..b239cfbc 100644 --- a/uwe-flix/accounts/views.py +++ b/uwe-flix/accounts/views.py @@ -275,7 +275,7 @@ def top_up_request(request, pk, account, amount): serializer = TopUpStripeInformationSerializer(topup_item) response = requests.post( - "http://localhost:8000/api/top_up_create_checkout_session/", + "http://localhost:8001/api/top_up_create_checkout_session/", json=serializer.data, ) response_dict = response.json() diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index 46d849321302ae210be4e2167467bf2cbc1f94f8..a28f5fa2a73cea4467e7d3c5f292f49dab50b0f7 100644 GIT binary patch delta 509 zcmZoTAlz_3c!D&e`$QRMM)!>gYxNl~Z00lA&Tq}f$YCtZnwXNCnWx9h#=yvAY{<&6 z6wHr@lF7;WrFkXErN!}ng+@uKj-kOumAOG40Zk5V4vcLMOxqloSqvoD*?%zb-Qt<R zyOleO%Y{>p{Ri7M){QJZn++9;Shn|-FlRAqG%0hi`Zk9;W|kTjm=~v)q?#G$mL?^p zCzh0@nUou(7-yH58kLrnPS2@g-sa(xX_aY^lxN{qks9b4o|xkqnw;)kT$WQ}6k%Fa zR^T7x9u}&bZIEW3?`2-%YGhz!tZQJZYiOxpXlMmQCPsP|1_lNehSTLLneTacJ6V<a z<~pVZIfo{D6`A<uS%&$VRr<Jldqt%i>be_O7&{dQ#2Z&uW%y+lIii_nU}a#gXJBb= zYHGCIrHc6gs{}jWKL&nf{yY30{FC_p@#pey2f{o2cQz{;l<`fU)W=+)NXVBQ)0O*~ zA2PG^Yiwtqz^u)0fz9z8a?Fm5xLv~zlAaz=%`COOWj^z?d>)9$%`Ht0EDW}*@w42z F002cgmYx6r delta 512 zcmZoTAlz_3c!D&e!$cWpMu&|FYxNl)Z00lA&TlQp$YCtZnwXNCnHLWwlU1477#P`& z<v<i8P}UJuIyt{IuO!6DrOBbqfw9ejX`2Hxi-80iryK*{EuIOyTe-8iTsY;}f3sa< z-N@3j*-)W~WqV%<a~89<rI~4y5<jbNbFgEQMNxr?c~(+hlCeo@p<!ZDepX&dc9L06 zWl5!xnPKwue`U;@J@U=Uovr-J0`g5=bRBc60&=T@oIT9^i<A8`JyIfqfnt$<<>oma zA%41PMgArRMg~U4x&|h?#s&(87FLGlRz?PT76!(a)8#6e?|HbGTa|>SMHYvoI)$5g z7MGYshUXiF200qX2c)|B8hVF@7grXhR>dcpn7S2MK+H1LHMCSPG_*1>vNEyMGqNx; zGcwrjQpJ3LRf3IQnSo!K{|>(g|0Mog{_S9VhyTuIMT0WF>67}H3ls_Yl7G5#Kl4Lo zHh%Z*>=T%^`7JP=Ze+<X$Lz?6+coSU>FEL0%u?H1<}**r=Ycxa+}zB}Y`Ypi%dHCl D;YE`6 -- GitLab From 939f7c0da8cff50ddd49d8440a7589436c26f6ea Mon Sep 17 00:00:00 2001 From: l3-washbrook <luke2.washbrook@live.uwe.ac.uk> Date: Fri, 5 May 2023 13:50:19 +0100 Subject: [PATCH 3/6] added film descriptions to index and booking page and removed make_booking form menu --- uwe-flix/booking/templates/make_booking.html | 33 ++++++++++++++----- uwe-flix/booking/urls.py | 1 - uwe-flix/booking/views.py | 13 +++++--- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes uwe-flix/templates/base.html | 8 ++--- uwe-flix/utils/templates/utils/index.html | 4 +-- 6 files changed, 37 insertions(+), 22 deletions(-) diff --git a/uwe-flix/booking/templates/make_booking.html b/uwe-flix/booking/templates/make_booking.html index 611af56e..7f40d4e5 100644 --- a/uwe-flix/booking/templates/make_booking.html +++ b/uwe-flix/booking/templates/make_booking.html @@ -2,15 +2,30 @@ <div class="container mt-4"> <h1>Make Booking</h1> + <h2>{{ showing }} ({{showing.film.rating}})</h2> + <p>{{ showing.film.description }}</p> </div> -<form action="" method="POST"> - {% csrf_token %} {% if error_message %} - <div class="alert alert-danger" role="alert"> - {{error_message}} - </div> - {% endif %} - {{ form.as_p }} - <input type="submit" class="btn btn-primary" /> -</form> +<form method="post" action="{% url 'make_specific_booking' showing.pk %}" class="form"> + {% csrf_token %} + + <input type = "hidden" name = "showing" value = "{{ showing.pk }}" /> + + <div class="form-group"> + <label for="length">Adult Tickets:</label> + <input type="number" class="form-control" id="adult_quantity" name="adult_quantity" required> + </div> + + <div class="form-group"> + <label for="length">Student Tickets:</label> + <input type="number" class="form-control" id="student_quantity" name="student_quantity" required> + </div> + + <div class="form-group"> + <label for="length">Student Tickets:</label> + <input type="number" class="form-control" id="child_quantity" name="child_quantity" required> + </div> + + <button type="submit" class="btn btn-primary">Make Booking</button> + </form> {% endblock %} diff --git a/uwe-flix/booking/urls.py b/uwe-flix/booking/urls.py index 8e66b564..c138b4e1 100644 --- a/uwe-flix/booking/urls.py +++ b/uwe-flix/booking/urls.py @@ -4,7 +4,6 @@ from . import views from django.contrib.staticfiles.urls import staticfiles_urlpatterns urlpatterns = [ - path('make_booking/', views.make_booking, name="make_booking"), path('make_booking/<str:pk>', views.make_booking, name="make_specific_booking"), path('view_bookings/', views.view_bookings, name="view_bookings"), path('request_cancelation/<str:pk>', views.request_cancelation, name="request_cancelation"), diff --git a/uwe-flix/booking/views.py b/uwe-flix/booking/views.py index 63b288d9..2a7a9d26 100644 --- a/uwe-flix/booking/views.py +++ b/uwe-flix/booking/views.py @@ -22,11 +22,11 @@ class StripeInformation(object): self.quantity = quantity #View to create a booking -def make_booking(request, pk=None): +def make_booking(request, pk): + showing = Showing.objects.get(id = pk) perms = get_user_permissions(request) form = ReservationForm(user=request.user) - if pk: - form.fields['showing'].initial = Showing.objects.get(id = pk) + form.fields['showing'].initial = Showing.objects.get(id = pk) # If the submit button is pressed if request.method == 'POST': @@ -34,8 +34,10 @@ def make_booking(request, pk=None): # Create a temp form to get the selected showing form = ReservationForm(request.POST, user=user) - + form.fields['showing'].initial = Showing.objects.get(id = pk) + print(form.data) if form.is_valid(): + print("here2") reservation = form.save(commit=False) print(reservation.student_quantity) @@ -183,10 +185,13 @@ def make_booking(request, pk=None): 'error_message': "The start time for that showing has elapsed. Please select a different showing." } return render(request, 'make_booking.html', context) + context = { 'form': form, 'perms': perms, + 'showing':showing, } + return render(request, 'make_booking.html', context) diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index a28f5fa2a73cea4467e7d3c5f292f49dab50b0f7..3e0b71547065685bfcaf080e5a7e2cfa90abb50b 100644 GIT binary patch delta 1386 zcmai!TWB0r7=Y)pmux3HCl?a1iT0FWOr+V)WbX@-Y_qvF*`#qd*<>julby-V?CkFB z&dlB_l8^{uk)~E<-ZX-OFIH=4r-%;$LB*ohK3KG^g$k1RP$4K31#vR5-YE3^hjaM< zIn4K8&iPlinpd`(&$gi_Uv3{jPhMD<a<w>{I`M8aCFHprGq3PcMaZX#%}-no6t%x{ z_2^UR*PA4zgI0jnxtl$>4MFYhp1loq)7G)I8-4nXKD4{P$qud~;CJvV_!;bgAHXee zU29lDCv<iNRX~#!M^TI2Ty5rR)pyp>wyjnxxPyS-z%Sq~*ammN=lilr!_#*Ctps+g z4s#OP_B_^pAFyL0{sJsukLX7iuy^(Wgb5%_0AT<mtgYeyfG>b4n~nXKfOd5qYcfyc zgucCwwKp`_h%y3F<fmlV`L+`w${O6jA{w=U)$8mA)<hg!vpXHgAuCvIT;pOYBf|tE zD+v1jhhJ&8&tp$6PsYREi3~3oyP8ZyspJ4fMH3VJc$^oarv}wzWJsKhi@lTaX*wA> zF3yUBwOMhfm>Ooeso9xYG#>U$L`La}_*B(3KSR&QX5AF!$`sP$C6R+Mu~uQSA}7O) zB;*yiB*`gGffYgJAp?(d%d7y$@<N(dj~IGNN{KaC5VDe~CL~D|I1Vy-7OE8qva%$w z3RESiFl7#^JO|TEmZ{d@k}Ty+eK1!LWbO%rAjw&_hvgJimTJZofs2f)W;v*+j4DX^ zBe22?hC0Gz6$u)jxLiTqJ7)Y`=9E;4gC}GmZ}_UfaZX_VA>?X`%E^LMQecFUjWA{y zmXlqV-o?<5+Z=}wyX_iEepi3id6CE*h}iGhuGzk^Ua-7mToKu#pHcA$*0tK<utwLW z!(uiqi#%Ois`@H^*<UQ@yuAg%8(fscfUm+7HCV+jj+W$d=;>O_H<=t%=Q4aOIUS{9 zW7V=yqE&w_Q7(?9RZol>3e2(mT)@*y^}2f~Zx0=WbZ^KL3{h?u9dP?;zkaWRccR@0 zf}oE_*J9y7-k&bA0dKif3}y=%p)C5SipZzb67MT7`aIgL=kOPnRfi>7d#J0Nn+nl| z(w?uLgfLDoWr73#p$I#COd2c9_~}umJm+Q$lgZ-f;_xsdEROdS=;#A|^?UrZZ?(f_ zrpT{HPvIX~n{R><aE|-~<Uj||4Y>(!ZXTw}q;~EM{@US(CDNgdtm9W4U0@hE$e+k7 z#&i0B)V_Qjf3f+$DRMl9hf(dsv-m;n`8V*DRx7!S7*G6F@C@i8cgaWh#USrGwfgh; zk3J7^0C5|=1*@y8yB`hZgS0zDQO0!Q|2BF<6m1xhyL#7qc;9@Z*Q`*$D3U8c1t>bG zRY}VR`L|2{;9k`_f#v%xqn%U`qf>ngJ_DD*o8UC47(p-~+-N6^-nKW8I>bU?7}nEb c+cP;F4!ddU_pKNuN01il1I^my+m?|(0ojY2rT_o{ delta 1023 zcmah|Uuaup6#xF*<lfun-qR&orR~b?3S9~|e#uRmC7``&s|njWx{Y?S2eUM-NxCI< z`Lq5JF>LyvNIN^_Lmylp9Qfj727CKvMRa3B>60*9^+lvnP!I=2LHx3H50ioC2ZxUz z=lsrhzVDpsx~IDCx!8{5Z*>ge__b3<eUG}_J+v36bA_pVDp|_T%;pN2rrK9N6=Uhr z#*<IsjhfDEXw|V|dK{_Ae6HZ5PK1f+cc3d5HV5p@0o-f3B&Z|!8}7jGQ0GP!4|7(< zE%sy;m%xn>>Qy>~?^fD{->W=s*OzendaDH62>yaU;WyZZoA*)k8*j+=2Pep&LgXgC zog^LZUH$sq3OWebt*6N6;C@0Ciu)De_Q?%xC$j4^q`l=q?XO`MwLR7<@Qo$nc6Jd> zB-q<aq@zW5h%==1>v~MPq9Jaq5YfR3(e23<;%>fV89%*3Kg3v7Wkp3Au`EmEHjFL{ z@*ZpTSMO4SeEDHy7Ap!C`6{)dJ4b(gt#eI89^WMuhxP3IyTaZR<kJr!_ltkJmoGxC zO;cD<gg)|La`hvEzi2$OEbk!wJJ&_+)8^@>VYO4<aenK#CcP=1w<y_*Wjah;fe>To z_q8}iE*y{X?-!}TZ&zrI6|>Xh(PswZ<*75H!R)a@?!fGe@sUbmq3`s`@lyV5;JJyJ ziTn#^`%9tpSTd2}+GYBfy)#RDu=jkoEab*wK^9J#nNTG&9S)nRg;XYxnv0mhiA-s> zm@iLexG_gp6Nd()=SK3esbfQ9>4U}KkwRpAq<{W!{LsOZ8Gm2goHGYYqe*jqA$ufO zj0IT0>|>!mf5h<nqka};VIPZxL!p2@yg<Knc)DQ=60ofQ19`9owqUE)#m?z`d6B-; z^?z5Ad18s)QsdwSRsTi5C5Gh_oqzK_eckh5HMx_<Fdu!1w((al)2f&?FA~%HHarhr zeeZpU%719wb(Q|CF?0tZ+-zdiBnqdWkzU*TF&#+mF%8j0Fc4)y(MY79h54K=t>~hh zU(mjAB*YFdy9cBn*2RvkA*jP`xB+Y8YE|&INlv6FA#JFbOP`)98$)L*6GkeXo~abd RZH+ZmOs%oBeC<am@h@5d5<dU{ diff --git a/uwe-flix/templates/base.html b/uwe-flix/templates/base.html index 7028db60..d909df7f 100644 --- a/uwe-flix/templates/base.html +++ b/uwe-flix/templates/base.html @@ -55,16 +55,12 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> {% if not perms == '1' %} - <a class="dropdown-item" href="{% url 'make_booking' %}" - >Book Tickets</a - > + <a class="dropdown-item" href="{% url 'view_bookings' %}" >View Tickets</a > {% endif %} {% if perms == '1' or perms == '4' %} - <a class="dropdown-item" href="{% url 'make_booking' %}" - >Book Club Tickets</a - > + <a class="dropdown-item" href="{% url 'view_bookings' %}" >View Club Tickets</a > diff --git a/uwe-flix/utils/templates/utils/index.html b/uwe-flix/utils/templates/utils/index.html index b044161f..0f0de5dd 100644 --- a/uwe-flix/utils/templates/utils/index.html +++ b/uwe-flix/utils/templates/utils/index.html @@ -33,8 +33,8 @@ /> {% endif %} <div class="card-body"> - <h5 class="card-title">{{ film.title }}</h5> - <p class="card-text">{{ film.overview }}</p> + <h5 class="card-title">{{ film.title }} ({{film.rating}})</h5> + <p class="card-text">"{{ film.description|slice:":100" }}"...</p> {% if perms >= 2 %} <a href="{% url 'update_film' pk=film.id %}" class="btn btn-primary" >Edit</a -- GitLab From 9f108256ff151ecab20e532f026d863e19bbb6d9 Mon Sep 17 00:00:00 2001 From: l3-washbrook <luke2.washbrook@live.uwe.ac.uk> Date: Fri, 5 May 2023 16:03:25 +0100 Subject: [PATCH 4/6] updated with main --- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index 74ee6c91b1fdf90897f3ffaa23bfb711985ab110..42ff28d8c57d78f25e57f6269a682bf6dfef40aa 100644 GIT binary patch delta 1280 zcmcIkTWB0r7@o`CrrDXZ+hWD0(bEmq+9d1DUb2^m#wF1<sY{cfO`3<MliAtK>}6&; zGrQ}=hlIqYAkxI9GA~l|U>~HY)X>gL!6;}UP$_-LLs=;FDT0U=A3`YNnOG$lp-*y# zf%DJ*o&Wp3`TsMsx^HH6-(o9%^`nEm_|+TdhN91f_8ul*#RXXrtNgejsSR0~q*s23 z9>Wj%n0bu3&CG)}rU~+(19UK7|GieiuNRr6`C}JxZHeib@L(7=HfQ!+G<$Hz>>(CI z`~6@Y16$yC@C(=gkH9);f;F(V!od&x&SxV;ED-dPI8M{<I}~&tjS~_0Z%`A#?t;6h z*ezh+TOfR1H=A6#{jkm1Tp*~>^Yk^$M{Qw1VD2zE8f&RjThs;Wf(@66KAT-80#0F> zI7Cg;*YMx4R&SV|JJ~C#nkMQPKG<;?<I+#J&=e~b1DcWuWyKT~LxhH@>K0UsFwg5{ z7<rl)fx{wS=!871h?AmH;8BjC%T-z7E3hG{u%WA_2qoEovsQ?5i_V6_yUN<RABm&( zPhSwD)Bhs_zGkWuvO1~rnq(n%as|l}^*Z{=NI;2~E6_M6x_SjyH`H|5P?ab=f!I%| zYPl0e-qh9Vwk`dNAs56*C#-3z;+`c)+wr1YsX{lOH$>!1gE!F86QW^u8OTymk2>}1 z#A}4xBA+;)Bf;ObQZHeC-+i2U5L~2hwv_ht`8R#{ee2#Eo)1xj=pN^iN%j#(X4@%m ze(s%|te-bCVyVnqB`IFC48hc5LXEYi8fL=e8dV#<OWy3SE2V60EG1WR@qrWE<Z+2F z@&iKyB`bY?q_2{*5@)&#LVeKWhH_?Cu^eM#@h&#m#bqED&nD8@L@F9*lj-h^v)LeD z!4Y5lWxL%XuTPtlCvQEIg&1eEoK|ybye%00{9Ccin4BC-kB;}&M@D$PcDgn?_=aYc zPo5esaEdU@4|Cd?|DqAgu;~;#+wR*|pK|h3<hNc1v@?HzDsa$hf+m`YI%8kHM1BmP zWsh@wf!rGk@03WrNak>R@ICT?{r;!q%zi%_bu^w=z*%sFdF&27)5f%|9AY2ScJNDb zYC1vh!Qwa`Cjx=MPRhw_BAI1bn%o&oWfR>fh;1c;yHRX6<PzvBdP4u8++Z>rcjE}v zvI}K<zapQ!0G?o8uz`V1bgTRden$7ohHJ&P8Q%l@;WuQP+hv|xtK@-G!N2szGU;?G L<{So|2lxI2=N*k& delta 831 zcmb7?T}YEr7{}jp&c0r^o#O`ye!nWH6<hE2?)$>Iw(_IqT4?D_rdxB<=ESXSE-1@T zh}4zEdzlw?5t3m;-<u!_Di9*Cx)34Ql@}2uK|`W?RrJEH;?Fre9QZxY|2fYywo){< zQj{(OQ}@fAU~2KQS9?TVSci@RUuft`xVI-7j3h!s{mRTcZ6hd`;|Yok<5zfstl|yg zCdcv1ePs%o0(f?!aT26wvAs`H31rlG%sv^j10iOI>HK0T$x>vS{2*V+Cdrc3J!N#v zUAge&BGfBX6h$4Qm1LVzDQF?v18bPW&<C<BvDh-<*JhwhrGZ4m>LC_yAv*)B@{7bs zri@d>hu>p|`l*^y#(8EAx_EXDss#TWtfn(f%y%Hf=ivz`xmBW62+y9wt~X^ODVOH} zURR~nOUi*fmpn&T$v#OJCHF+1BNAachFq|Lt^#%L@lHn|8T7|Z1L5A#ppLy7<N~pX zDH$+Y%$z?J)elE_CW)3><36v=WA-FR1}$fd%`Trw?{Kzvx%)cU7H7g?F?%}VEoL?v z=y1AxhSU9eR?lfzqef?CbexSd+gOv9Wm%oYBIFXN9!PH2&{Dp36wUMg8%QIj57|8D zgW={#Yg^RocDHw&H3U<wMsxSc(6H4TZR_cdk6JoIuJE-BzRpwsq}Lm?M$Tg5tb!|r zR;3vKCSf9wTJda<4e_Vrn13*h9`W^~h!L7+P+@+7=;{EYE0F{6=dPnt{?21GRxHI^ zlsMXl<PvGXTexCRnQC@R&8rqr>LyG5p(v2x0N^04Q0yDhn;D(SW-!=TRtgV2nrz%2 z<@is^pv<Fo5ye3v{^J6Y@_8@N&yt-*A)6HWMRMX=ej{JR#T0wq?fNa@Kfgv55(pr* Yyn;$Ss-007wN|T9XJv&tB3WPi3x)OR8vp<R -- GitLab From 9d5a613ec06b958882aafbcded216e5ca43059ba Mon Sep 17 00:00:00 2001 From: l3-washbrook <luke2.washbrook@live.uwe.ac.uk> Date: Fri, 5 May 2023 17:23:28 +0100 Subject: [PATCH 5/6] Removing redundant code and adding comments --- uwe-flix/booking/models.py | 3 +- uwe-flix/booking/templates/make_booking.html | 6 ++-- uwe-flix/booking/views.py | 6 ++-- .../templates/cinema/film_showings.html | 26 ------------------ uwe-flix/cinema/urls.py | 1 - uwe-flix/cinema/views.py | 12 -------- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes 7 files changed, 7 insertions(+), 47 deletions(-) delete mode 100644 uwe-flix/cinema/templates/cinema/film_showings.html diff --git a/uwe-flix/booking/models.py b/uwe-flix/booking/models.py index a696c4e8..6a6ff119 100644 --- a/uwe-flix/booking/models.py +++ b/uwe-flix/booking/models.py @@ -5,7 +5,7 @@ from django.conf import settings # Create your models here. - +#Model for reservations class Reservation(models.Model): id = models.AutoField(primary_key=True) showing = models.ForeignKey(Showing, on_delete=models.CASCADE, related_name='showings') @@ -18,6 +18,7 @@ class Reservation(models.Model): cancelled = models.BooleanField(default=None, blank=True, null=True) reservee_email = models.EmailField(blank=True, null=True) +#Model for cancelations class Cancelation(models.Model): id = models.AutoField(primary_key=True) reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE,related_name='reservation') diff --git a/uwe-flix/booking/templates/make_booking.html b/uwe-flix/booking/templates/make_booking.html index 503d2718..41e19c80 100644 --- a/uwe-flix/booking/templates/make_booking.html +++ b/uwe-flix/booking/templates/make_booking.html @@ -14,7 +14,7 @@ {% if not user.is_rep %} <div class="form-group"> <label for="length">Adult Tickets:</label> - <input type="number" class="form-control" id="adult_quantity" name="adult_quantity" required> + <input type="number" class="form-control" id="adult_quantity" name="adult_quantity" min="0" required> </div> {% else %} <input type = "hidden" class="form-control" id="adult_quantity" name="adult_quantity" value = "0"/> @@ -23,7 +23,7 @@ {% if not user.is_rep %} <div class="form-group"> <label for="length">Student Tickets:</label> - <input type="number" class="form-control" id="student_quantity" name="student_quantity" required> + <input type="number" class="form-control" id="student_quantity" name="student_quantity" min="0" required> </div> {% else %} @@ -36,7 +36,7 @@ {% if not user.is_rep %} <div class="form-group"> <label for="length">Child Tickets:</label> - <input type="number" class="form-control" id="child_quantity" name="child_quantity" required> + <input type="number" class="form-control" id="child_quantity" name="child_quantity" min="0" required> </div> {% else %} diff --git a/uwe-flix/booking/views.py b/uwe-flix/booking/views.py index 567e1c98..032d7df7 100644 --- a/uwe-flix/booking/views.py +++ b/uwe-flix/booking/views.py @@ -202,11 +202,9 @@ def make_booking(request, pk): return render(request, 'make_booking.html', context) - -def make_club_booking(request, pk): - return render(request, 'make_club_booking.html') - +#View to request a cancellation def request_cancelation(request, pk): + #Upon request, get relevent reservation and make a cancellation object assigned to the reservation reservation = Reservation.objects.get(id=pk) reservation.cancellation_requested = True diff --git a/uwe-flix/cinema/templates/cinema/film_showings.html b/uwe-flix/cinema/templates/cinema/film_showings.html deleted file mode 100644 index 5af1a9df..00000000 --- a/uwe-flix/cinema/templates/cinema/film_showings.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'base.html' %} {% block content %} - -<div class="container mt-4"> - <h1>{{ film.title }}</h1> - <div class="row"> - {% for showing in showings %} - <div class="col-md-4 mb-3"> - <div class="card"> - <div class="card-body"> - <h5 class="card-title">{{ showing.start_time|date:'F d, Y' }}</h5> - <p class="card-text">{{ showing.start_time|date:'H:i' }}</p> - <p class="card-text">{{ showing.screen.cinema.name }}</p> - <p class="card-text">Screen {{ showing.screen.screen_number }}</p> - <p class="card-text">{{ showing.film.description }}</p> - <p class="card-text">Length: {{ showing.film.length }} min</p> - <p class="card-text">Remaining Seats: {{ showing.avalible_seats }}</p> - <a href="{% url 'make_specific_booking' showing.id %}" class="btn btn-primary" - >Book Now</a> - - </div> - </div> - </div> - {% endfor %} - </div> -</div> -{% endblock %} diff --git a/uwe-flix/cinema/urls.py b/uwe-flix/cinema/urls.py index 1f884c0f..04755031 100644 --- a/uwe-flix/cinema/urls.py +++ b/uwe-flix/cinema/urls.py @@ -19,7 +19,6 @@ urlpatterns = [ path('film_management/delete_film/<int:pk>/', views.film_delete, name='delete_film'), path('film_management/update_film/<int:pk>/', views.update_film, name='update_film'), - path('showings/<int:pk>', views.film_showings, name='film_showings'), path('showings_management/', views.showings_list, name='showings_management'), path('showings_management/delete_showing/<int:pk>/', views.delete_showing, name='delete_showing'), path('showings_management/update_showing/<int:pk>/', views.update_showing, name='update_showing'), diff --git a/uwe-flix/cinema/views.py b/uwe-flix/cinema/views.py index e46c686b..fbf9fd92 100644 --- a/uwe-flix/cinema/views.py +++ b/uwe-flix/cinema/views.py @@ -309,18 +309,6 @@ def film_delete(request, pk): film.delete() return redirect("film_management") - -def film_showings(request, pk): - film = get_object_or_404(Film, id=pk) - showings = Showing.objects.filter( - film=film, start_time__gte=datetime.now() - ).order_by("start_time") - perms = get_user_permissions(request) - - context = {"film": film, "showings": showings, "perms": perms} - return render(request, "cinema/film_showings.html", context) - - def users_list(request): """ Handle a user management page request. diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index 42ff28d8c57d78f25e57f6269a682bf6dfef40aa..5e55edfdc9bc1cf615411f368c828203e9bbb7b5 100644 GIT binary patch delta 2438 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 delta 1724 zcmai!YfKbZ6vyxEo!yyP*n4;gwmjVBS(E}ZyUVg{YGHjusuDq45t1q^%X0-+T)?F@ zqBb^Z8ntfIn|`s6*v2nlbgLT^TImOy6suKJurUaxrj1%t6{{g?YR`iB!I(HF`OoCe zId^_@&ON7ZD6wxSaes<VfAEvEMW{#X51DBKiw{Yb933-;Gt@DY#MY5?xuY=@U-+G1 z3jI{*)k|~JsV!7pG)FLomK1dw=v<B31pd`_F;QTl^F`KqvBbdk5H`s6z%UzwO2~(N zc5K$d@#Re{-cAifkZhX1d}%p}UZHQwazcY|Rww$2S&(gsdbhW|wPVAyhAd@kgt}0m z%#t7r#oCI+op#YcWT{vyUo;dNDa#HIm$~ZGWEdgv81BMl7=Z`yH~a|`FgRmj&GMHN zHXQz0GW<^TG9lrSBSq&e4EhN?g8OhAZooCT0+-+v^uq->1E=96gn4<Nkj<<5ggH@> zBi=s23=7}_QI!<9MiwZqqGl^|;RczfB%{8fB%vlK3^i7fBK`Y>nxSL~MhQHGf8igv z4u8NXjKMGrBhyDx<WP++SB^yogE1EKpek{Ebc3#N!Beyw2!tRA6@|R;6f%m(W{sEE z>kzVDmk{yR>yYm?+~@sVl%5=v&TN$SER>c^l!gqH^%j&`Gl}$X*44y4&o_pIXW=YX z>IB5tbaCjbr-DF3gA?hIseL--YN}!;lHsDjF30XS9gk@<E|I1T7Y(EOqvFT-Tb*KL zZ-B1USz0@{1WFs*e4b!ii>)cRwISfQHgu`M-kyLxp!KwK%Qkwvvb&?r)m2y0y2))@ zUZFKFYw<LBmRB!t3p%&dEZO7^+G`!&hVH6>R_zWHH2JKm)mESu7igsx&E~Q@UG|bf zn_BF2l<vxs^^wOtG*g(5%tB7(?ltaSzrCl!(c&p7b~KmRRbP+CXKiwn`Zo5qc5n7| zZ01+C(+_t96tObsei?3~O?7Ght|;%@4O`#xthAQawHDVo*KJtbT~p)f>{{Eku4<`2 z=v%RBwO8wCSnXM@`D<UqYb{lsCF-s$gT8Y2JMNN5WiS0+p8yqb0J7MB&<+u_F&M)d zbTfWnFZF-6jaqW#Y+5P2jFK<gM}JZBU>PXvCOd;$9Ao_4LE2{3T$<*xTMM14sya1! z9(4;Zf}2UE5`E39-lHk}gD+@bvV={I$M#cL4|!}d+TJXkrQ?{GH1XI0%64E)FzMH9 zf?(4rvOK%970cvs+3hY>RdmlSmbf%4d4f^>vr+1FaqR_G`?Dy$?zu&W%Vswj$#jVP z>_hzX0WADOJ~%*&=|g)A|6zb8bK?<uKXuXskBJ_x6PUs#yaTte4X;PjJDuRuz$Z@8 zbP<n?cw&f(mP87-qWyXg9WPDWQQ#SVJldA>cv!ef!M_uX=)QFN38x7mE=3R&L8PK0 zN<_hh`9#RWTjtCyl?bVNil5+jZ_~s$3U{KT>H)HhM-6Lq7FcGU0VC4#^r*?H{Pq)? zlqM?`1e)2Grb*?A@m%csm>-o2Id{ge(;QM{tt93Np?42=F+wC0*}2dy&reFqm-(+T zVk+MuiLXa06!8&FSxDs6)Fe$-+!?YU`#1W$J5!AD7(jTHB6|5bMYKllnZz7{&9;@b z)afj-@>~$dalCQ@S78Vz<=4P*ApM33`gX>UzZQ7VEGFO#>uzZ6Xl(Zsw0k1lEN<B! zmaC@B2dYHM*cC3F7t_)EBr`D<LojEUN+J_}b6k9bH;;=ZZkrH;I$Rl;5R>DHC>eo9 N9no*vab!Zw{~r}a+aUk| -- GitLab From b36a3457f20197addedfaf99c6e08807641a97e2 Mon Sep 17 00:00:00 2001 From: ryaningham2001 <ryaningham2001@gmail.com> Date: Fri, 5 May 2023 18:40:50 +0100 Subject: [PATCH 6/6] db premerge --- uwe-flix/db.sqlite3 | Bin 319488 -> 319488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/uwe-flix/db.sqlite3 b/uwe-flix/db.sqlite3 index 5e55edfdc9bc1cf615411f368c828203e9bbb7b5..cdae9dd997efe7fff7ebf98b34b1b68dd433cfbd 100644 GIT binary patch delta 3863 zcma)93v3+48Q$5)-R}8z$Iti`+iS=1gK(F9+{;I)&#{x3B!0vWAqgVR*>`^1XWyM; zJJhuuK#?k%gdAl6sUnDmhO~i#RjyKzpj1%WibACnC`}0!B}xRXS|}9_De1qveniL= zcJ99a?w|SQ@$WzXKQs42&fE(*$BVMLe2Su4;kzBa2)_Tl??#R0@}E9%s;pL`Gx24q zS_<J2{BztQy^Fssy(}HU8>G*rXQY074(H*=q(>!sp<Fp9a_bakJ0icBV9RWDKF#Qe zpuKcXs@`3M-b(FrySO#QjLxU-b+6BJW>+z_sApg_Iuh<m^v5O#M*AG8m)#N0o?pV~ zsht~h5ua+>*q)m$EVfDx^bAFlYuwNUd31)&$;;sw7ati6kM_m7!jX}I(XQcGU+VRZ z8_Tzfc#N`3=Nat8f59)}<I;KD0<(T*sVroL?w3@w9q}8v!C3!jmkHsXp4h}_66~NM zyUK;W9|wC-RM^egD1^K!PQCxl>f90p|9CxzYcR(&F(ub`R>_F>=5U?KiAZ!b*|jU0 zNOmpuxNB3Bi?vZa^sznlc70WY+O(~NS?tD|`XX90fc7Qy|E+!|#2#2{!xt!g75@|e z8-IY`#~1K(D`i2IFWMJur+;nFe2e0EScXdksByB)!iA^Szs^#b6h%UFsFJkLq1<K2 zOh@KW8J@+zrxc+Gzen956arQX`S>zbDy#u45b^-C1qsk8*a2+<%P|P?H^2y6`C7mR zz6S6nz8cWWR{?J1O8{&6wSepRV!#r<05G4o0cP<WU<OYEa=b{T>Eno=<Bdt;9e4+k zGwI5-l1VS%^%Pa=utT!~he6DC7(}Oo1++OB2MBXzvP@SJMW%BNVAD-9{RoB$l=3Fk z95dS-)5)7uo_SWG*-XnUa>yWu406aIhv+v&hC&y~kGIpc#Mw$a%5{&bf}{Kht4Kts zLGQGDSdMiMMthQSjZUt%(1o*pukQ0hyD?m6wo^NziD>*_I5`j-U2dz^G7er-G~K1> zF3lsWT2NDin&0jBcy+%9baj!gtwz_rl&<d!Xn{Jg$VZEOeKo%R<$P5Qc!9nE^xI*T z*AGvQwbE6yR)5iG#T_#<cU-p!T~@t8k1yzjMQFOF7?Wthb;5=(^s;ONt@idiE5eaT zG*S_i?_9kzCE)h?>wE#tc*`ulMB%I}_+R+%_!9ojQUSmJjy?T@+vqC36u$v3;e@t| z0Dc6XoPn=UPF^s4)$Smdy6Ckxm>wqKuTe<o0C+|F0XjP!IY7e}F?{=5hHFoPPg3zp zfRS|o{S^Q`<pBF-fW2h^yGjAtj2*De*Z`Z0078WTHyQKuWdNwgs%{hjs*UYhVK{1u z;o=2`hvyhxDlq_pu}4@3Y>_dV&Rk>KVaW`y;>7|1?pa)*)5f}8GzP4uCBSmphyv+L z$LPY$EcnI2U)&@8N@@^Ki4>7f(oIA;NlWR-NxEEE2+4n-XPMIo34)y$D3K0@LclT} z<^(7$ZOAugsz5ojnzA49JOaMJgo2;${NSF_pFzvcMJ3OLwoE?+&%>bn<|@i+NE8+y znuh+Q!{dRbkRQxWmz58krBAW*g&BPMiL>;c7mWzRIhrWxZRc_Erx}BeCPB7;W_yEs zn!OjCB+jOfCYdJMsd*LUa78B9a#v>q`SVdmCV!k@7L<7Z;O^k&O<R-E;dW1d$LK&{ za%^kMMDron(7xS?k#TKLcdUD)ciflo_T1Xl+(*Pmn4+4)71->kI}ji9_y@a3yLC@= zTn%@}21k=a-M-=J<h15fd(1IrW4_78VC%v5n77H*FmkAU<WNUrv#%}D(>Bl?+0zNS zy{(h};pSbfuHJZ?N3lYL$E7Q>8VIWXpr*J3ie9JH9j=hfah2FqBymXfO-v3ent#&o z?@g%wKDBqCZlK#64kX>tZBx4kn-Xo4gAF^$#R=x|+5YjE5*(V^v12l@Ng0YY_qHaR zH%;~J>}?qD=xbHuTc-|%qa7WM-8;5+Zs|EVxikqCwzwMfszF6@s~*)KIK0jVbGWr( zJm!h?_6{8yO7x8nN5)6A-e`ZcKRFbb9*+h3qY-Nko6R}2Y$EO{=7+Z=#`=TJ(b$l0 zJQC|{Y|+B8#)*l@Hl=A`eDk<38t)72>WOqr*G<Kv&0DtLYR$pxQtM<@3F?8M?sr3^ z@_78|!8@6U*#ZtXQ}{eS0q2%xoR&TZnTG%8VOt!O$cdxO*x*;aB3#L|ps%v0WHkD! z1(V@p%!3Svd(-yg%m&=C+6%;`OauB-(`wR6^=hjocR#|+K_sZ5APnA*_v0F=WU0W> z>?4slpJb$2mjb~Yy{99j(*nPkal9@Ktmq4RJn$w3ddaklN`Fw*sB6GFyTnq=JmoR- z)FO+czo7I5b;V>&F0qVmjqzQYe|a!&WiU&*Ol!EF_O)1_z!WodB<M81v@nlLQ4RNi zkD@qW0%Yy;bS9~Jit(Z=WdBplqs3Q@U}!TE$yNL*WRid24<VO;pO~KV5+)a(XG#%D zfBrmUlXJ{e@g`m=Ph(O(2GK+gW#I#D0+<vTF?_T6%ZTArP=L^hScVl?J7t9SS_&Bl zqY6tDQ^*KYxfC+;foQg{Q;1$V#o%{V3b^j8xW1ys$Ovm|jFhmZ*vJW)MMhF^m<K0X z%=if$#;#GgPdX`nBwTa+&bgnjS}73teD?HiJ6nTNcbuMpj9?e3`I{T~+Pu6CJb5jH zEhe*e_7-C2St+&iiFRjGMwZziFR!qcw2AE6)GJTql4}Axk>xcvpBmJ?Zm;6gG&OyX zgLNavlR%*O+QQ;`lR%C**+%kLC%cL4ce3x>p{}?%Pqpf598d?eZRBH-O=dw%QGy;V zsCe8;U7b(ylPQTkDJ}1D#pCe=NEK$^fy3`v3crhAz?bn^xQKj=A73e8tG$>^m$BK9 ziVs@%2iHh=G~5@B8~L_pTeP>=$hrH5byxaq89UVO5HE?}aHi<1^xwcpFQW|jU2V_5 z`DS!vFL`c^y@L6hP=y_!#GdbRp}W#o<7_<#ZvZ(-{S@0tya{%Kypmum$(aOOoZd3c zwlM7c`uSo~Hp8Cc=4<AQ>?G`CwvdZcY&hfY-1$O#zOJJqZRyu$*zY1T6K6}w2eWJz z@zpUo<n%1Oj6HF-VqLA_rcUP>3jY$%;3k|cJtqxIF7dMXn0T9roM-Stx?+x1oO>7q zS^goLDIT;0vBU$G_?{*1w?xVkCoFNFC5~I-m?e&yB7Npwc7G0!yQP<;ka#Mcd6NAP zX3pVrVCmmt?~MqR^N7QfQF$^vnv@5UhG(u>)ZVtNwJkgLC-^g<euxV)SkrTD#uAMU z29I&BDumiOJXU1fns~3+7&k9}a^vtsx4d|%DzYw6BDcx~s>r%MtzKu{-^A<hZ%Y@o F{{b4Oe)<3a delta 5776 zcmcIo3ve6Pb=@DZSbX+@q!@{!J}XL=<Vu8gvG@_LB7y`c{y<Xvf}F(A5?BHtJ_}+O z1i{9lC?&0HyYh!kw@o^=oYqa88O3(g6piZ{J4xd-ZYPpGY2tch%ahn0D@~fjO+B{j zvHSM%Bid4{=}Ze?-^1R$_r81YJNxc^@AR_`r=M+jV0*pUf??PIy!zmU!yo<NVK-s6 zJbCib-3J}NaDr>>0k$3F**XwqUjwJu=fIzVL+l6a*V#1qA!uYD0X0W$Pm%f_ezBc< z*Jf&QlYNZ-tunQ{d5ei`#gnsAA*IBnWIj`f=aiIbD?y65j!zN|E5}^h@!wmSa<!V+ zm#}Tj%6+ce8lCm~$=mTnrXc5~xSCcfnL-MzJm*T9EL(Sy;>w95TX5S-_{h+2JD4>t zZEG`BIjtyJ$Qw^cg@l}ww2V@)ZxuE@D9Nf^nnw>BS1unpvZvbt92m`>!`Y|77s2!F z6%d84orA8eeJ}3eXQ1;%%!kvWaM)tTa9j|Y_Vy}ryaW1@QsYu0p_B_+qO8UT=KRvs zOn)b@xrf@Ky9k3@Y%nGD7p_tb_R)^8%Vdzef@$TAPafC;px#}$MQCWcu5N`pHsU_C zDi%T!TW!}yfjZzU1wACxLyN6Ohl|462ra8NxTodN*oeEDAMPIVP-e_Rdxdu2X()$b zD}Qoq|JU28lRFr22?OtgUxSyyKY_Qwzk)ZwRd5MBZG0~Z+`rHl&0qOG?KF`%Zn04$ zhFgt>xp?*Q+b+8r!C4IaC-@KWOK=VR6ubg{44wfOz?Z=zFp8fC_k-UDFMxjl-v!?U z7r|NGc^Y@ulBe<AV9C&DYcyI4Vgt4fsI5nB9cs~-6hQx3qcu5DYey6t`fo)ogIWus z)2KD0)`VILwIpf@io_Ypfz^lyaN;y;0zchkzwUGr?poMMJPeK)+-4+iM)GDPZ$|QF zD-7VrML9#1gQ7bPQ7aO)B2g<6wIWgLU-JazWKC={1|9~VWM5%F!#3;Ac0;(G__1SW z+{9o&z$bA$B!*T2#VOOXazf({ih5y?*l|aPlrwPM^69(o`n1{V=G|f|?}a~35Q4lr zDEeJK-sABJacV=Adrg&|93=MNQi0ngcmwW$FHUYK5Y`nubDY>8xrGI8pUV?y^Rx+Z zVnc!d<IebzGyk(HJ}3rU{(vXo=i~UTRCWCKR`EfvFX;BVe4c=>&11|S1D?mgd*C<V z-@s+?CU_qF1pEkGfq1`%uKmRXvEQ=Gm_<7RpBaJAfxzcP;B(mYH{-;Pb@*R{pf>=1 z0fOFu{8{uuys-8{81Oe<h|lZ%NjS~Plf)YQX#{^7!JkI(cOdxF2>x~i|5XcUWC4vV zppgYMg1-&H--h6CMew&F_}dWtZ3u((4H%@Y5dKAiaDHM_6yAgpxB_Ev89aZnuKfvs zY#@>UBpRJudHU+k+B^3XjB~5wQOwM|hk*q9JvQXPZ1c=}%;%WT>D+lDtn=pyOD%bx z*uyM29>sr+HJj=jXZt$SO0g)HFns9HLzoa)yX7=Fms2?{EpwTICKpthQ#GYj<&+sN zDwVQa%Nk<~H!MrZ!<@wB<dj@UN{}Z}%D_Y-<+w^(;VLCXleu(8<<3-{j4|k$y1E;N z)k8lZeoMc0fru^rKUyG_HDx-Zq)JjTU4_<Va?mZ9Z(vG-4$MlK9H%bHhQA5JZ?0I% zs7k@bbwlfo)ODC^=_)CC6qcTXnn}tnhq-c5DHysEX+)pN<no-sFR3z&OGQ$l>S<Zk zT2&ZQx#T)aI~Z)Y37n}rE01VWiJOp0DuzGt)Fo^zt!et}Un6c?8XOII2WHb5*lSZ0 zQGTkE=c5w?>Hg7lCb}5Wrovs>!O^UHaCA(V3ioDX*+?~(?V3v*Ps%4^<JIVB$TJY` z5e7z2EV$z1LVP49^1N%dnCdTQWo{%}tw_17T;gVxOhM&llu|-gxk^S$Lu-5GrDTTd zD`Zk>&6wGQlE_xMVkW1c+X*9y%Q7bwlAKmixMWGmBq3H5PL<|m6oeF92^Xr|%zCgQ z`C_IdAAln$rChQ#3ByrRsz%tSB~3GCK|?to#tThKx0F*A4nC6eMa^J?%3*1cD9hYX zDFbImRk?mSBV8XMUsW}^lu^nm7nVxUjd3XngZ)Prh({^7to&*1F^H{iH`DK6wE0Dh zecAqi;~TbFYuNlEv&;M=)05PFaE&QZwR0L7CYH|ZWlYhtW1+dl1wqL!@Rbzr(Q<iB zTg+zXrsoA1k;S~SFyoSY7sh8Jk-<tPbYfVJce;zA!O`AAhA)Uie5eu~(Z)k#+T3_R z_DjXkd@?>iBhUEqz1rgV&;&o<KhUH4`YIhlYnl%)@QJxWZ^WMymgdLRsVN~pIV5+* z#1lm|G3SeAy<&fBc(GH6OP-;TkT=pj)ggt4dnSG9&W^!!Bs#;#CX=lh?L;bbyl*%h z4W+tcgR<J+(=!qi;;C>xIxCL^g<`oHm<syE2|1h`twg${adBbT+ufO;>F6yKJ=yqT zd`KKyOsNxX;qKC8e@I!+WI`J!_<}+p==QtXM0XqShqdT_BTkvJQ1q)QP4<cT^0bta zwD}oNg-?oE&Fe1Dm-XBt`Hdy5KNHOG(}h6Sf_x$}A?13;5~)6QKBu{3-qL(=aQOK6 zSZkJ_@hiQ4EwXu7AqaD*$L$L6JRcCw?6sol@fI~Dr|^E!@6G4=oG2#e3kzya%;)5E zA|ubOO^-TQnGHod^u<N;%S+WzXHcD-_J>=Q6JDv5?D6({#?w>oTx4o&zCRYpO$}GQ zd0#+`O^g+lj~D?{6(8gSu7Fqcw)xNOH6tVZe%W0v=Zbt<oAb4)m1M4xkptRvwcr)B zTp@iEBYHG36I_@qz_CPk-&m!$XHe?z>xst2-oX>q6Y=S6YgiNJbA6%7No8^}x;YXs zWr{)G=koalPn)+k`#a<psBJX+0S2zHAAoM~5XghQpa#EJVBXxr&$IeN=g8vhtzu=} zM@I2m;hiy<Zso9^yPy1Hk_HEB^aJD}Fzjtz1<vN+S$B~ke6w30#TE1M#~<}t|Lnu$ z=}$21b_^B>e+cdb2idpSr`g|ShuH1V<+mKV{c9w<<N;Ppgw;1;u~=5e^0o3lPVmF{ z1$o|1ZX&wHpvNF$?|ImdOTiirNeOWFdGngoI?*FSR6r@m4N^<UZ*S1!g<_5kF(VlM zwZY!?*l!R+gL$9`{5dzI3=6zL(V$~*du%tCg1|7O*2Z!g#U~QuVg1QtKi3aFPI~d* z=yyI&KGOU%2V54-;7ts?1FNlHfuF-_>wN<=5H)q}-v#>BXGpm9seSMaY36p=!3Co% z`*+Cp26z?jCN6{TgKvYs1%CxDK=wa?`vyCOF}TTOGdicqYIMNF7+t-|Vss5A+UV*` zW}_obCZl6bl+nSe$>=B(L17l0pm2D{81<kXJZ0>H-iCwz3OogV23`lxfoH)>;2*(@ z@bSjy;?DMSV8*BoO{flYqB;zqI;<YmVGXDbt3!1diRv&G)nT?x+Yo{vNrrLQp1>H( zDGa38^NzQe53N72-)Z|6(``9r*>8Mdrts0Vahf`aJC={z>agXbAxm>Z(;@v5L+x0~ zDSgLFvzo81YiNFQwlFa*w0Y8=eFLhn=snUIl@|+2|5Pla%qpRQa;F*{@z2am4#7$z zmhb7B9vE|HkFLKN#@+$G8EruiTy@+5uh2H4m6NbSf!op5&8@n6-(IfBu7r|@g8as= z!)q*>MxpNW@jk%~m(EsRfIrK!$BK+*njDU1Mu!`(<|VbWoR9THLw$U@Z6Y-|*PEIh zjz#vx(%E7<J+m0;k<;Dj(Lv8hY<xU2r36N&$K+CaaMGuaj+Pa1up0P?)o91V!v$OL zyLk^fS@25j(wdDMCc^g`TIqKAfL9O$-s^trA2L+A&SSVQx(yCq2n4)s`eP2NSHEPX zUf*GOfLU&DYCdLRLVK3CGl;O+rBqH6tI~9_taRlIV`Ec%#M_--+!yMKB}x^!!(9$# zLWyjus?PK3%+#bO(lHn9>m8Rm^1b8!!eX_UJ&Ft$Z*Dkz7vYZ1?S;AEy4}m4vaI6a z_9i`Jr(U+VB79)~xA?d<3N|8q0|+eZDA3<>zz{=(iEwKgbbDN0QS^BPeSxLUvm3e2 z1EcQO_XFxxcp`Bx23`aA!uRhQ_!7|JzUqf?N%%|S3m1V&pjUTO^({8C8DBHdW+j{O z)ycPR{1utnh22zk$V$BL_&duN9nIL2D*|`#7Rw#PAiVnMtw)dIckj`p>71-POVl=_ zc}0Kq6!j(jCjqik|K<|4uX*(dY4r>#UXtg^u%?ugEk>QLKe$BgqQ?6BZ?C;yqK=s; z`wDhaKej-PILynO8Lb)12bcHg?RQaMsU5FU{iF#J@1}LTpN#0Qe1-}#%eO7>hF8mV zTHN;8z%oZ~6-E5+t@=}b@=$HpDQX)3U)Z$Yu*q0=9rj@id<WbG!k``|t{mIyxaRnC z$Akm7f7L!*YdKBv_WJQ|6V{v$t(}?iydbQ+R=>rK3gzn_$6*;B&nqSQItDqIsJ!kV z?{#^6{y@M}`|5qvoejnz;sJOy)tu+4cLDwqoU#|dk%KrMvEZhr4mlx};Wn@50IcDs zWw`(g|CFL6VL+=e-N26%gGVw@=$GKZA(O{sGaPAT`!EQGe+GXK{swNP?*SEX67&E! zXa*Gf3wVn19riKy3+z3t%6^LNgSokhT>_0ZcqV4C;5cT%Y%~EHw-^M5VQ5I8==GDZ z#)b_t!(1n`^@t4RVTzy}R!7~cI*Y})r?)wcTlk@kTRZjPhwXQqHq6Ji0rX_)CXZNl zvrgLD=vdW>EHcsUyO08`(SCEX4M`jJZ#J~ix|!Ryu4Ji^xhcKTvZ2L-nXKzksG|+C z@iBs9BM73k(Y%S1vaNGAnl{MLj14kNA@W+hXlnqF1_8w%@>vPM64yB_l-1gZuQIIr Iv*!JO0aw7L;s5{u -- GitLab