Skip to content

Commit

Permalink
Merge pull request #571 from xzzy/master
Browse files Browse the repository at this point in the history
Mooring Hire Bug Fixes
  • Loading branch information
dbca-asi committed Apr 3, 2019
2 parents 695a646 + a0addc8 commit 856846a
Show file tree
Hide file tree
Showing 33 changed files with 558 additions and 111 deletions.
79 changes: 66 additions & 13 deletions mooring/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2018,12 +2018,13 @@ def retrieve(self, request, pk=None, ratis_id=None, format=None, show_all=False)
for bp in v[2][date_rotate]['booking_period']:
bp['status'] = 'open'
bp['date'] = str(date_rotate)

if avbp_map:
if bp['id'] in avbp_map:
bp['status'] = avbp_map[bp['id']]
bp['booking_row_id'] = avbp_map2[bp['id']]
bp['past_booking'] = False

#if date_rotate <= datetime.now().date():
# bp['past_booking'] = True
bp_dt = datetime.strptime(str(bp['date'])+' '+str(bp['start_time']), '%Y-%m-%d %H:%M:%S')
Expand Down Expand Up @@ -2180,6 +2181,7 @@ def create_admissions_booking(request, *args, **kwargs):

admissionsBooking.customer = customer
admissionsBooking.totalCost = total
admissionsBooking.created_by = request.user
admissionsBooking.save()
admissionsLine.cost = total
admissionsLine.save()
Expand Down Expand Up @@ -2612,9 +2614,12 @@ def list(self, request, *args, **kwargs):
recordsTotal = None
recordsFiltered = None
res = None

canceled = request.GET.get('canceled','False')
bt = [0,1]
if canceled == str('True'):
bt = [0,1,4]
try:
data = AdmissionsBooking.objects.filter(booking_type__in=(0, 1)).order_by('-pk')
data = AdmissionsBooking.objects.filter(booking_type__in=bt).order_by('-pk')
groups = MooringAreaGroup.objects.filter(members__in=[request.user,])
# If groups then we need to filter data by groups.
if groups.count() > 0:
Expand Down Expand Up @@ -2716,6 +2721,15 @@ class BookingViewSet(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs):
from django.db import connection, transaction
try:

user_groups = MooringAreaGroup.objects.filter(members__in=[request.user])
sql_group = ""
for ug in user_groups:
if sql_group == "":
sql_group = "mooring_mooringareagroup_moorings.mooringareagroup_id ="+str(ug.id)
else:
sql_group = sql_group+" OR mooring_mooringareagroup_moorings.mooringareagroup_id ="+str(ug.id)

search = request.GET.get('search[value]')
draw = request.GET.get('draw') if request.GET.get('draw') else 1
start = request.GET.get('start') if request.GET.get('draw') else 1
Expand Down Expand Up @@ -2786,8 +2800,10 @@ def list(self, request, *args, **kwargs):
sql += ' and mooring_booking.booking_type = 4 '
sqlCount += ' and mooring_booking.booking_type = 4 '
else:
sql += ' and (mooring_booking.booking_type != 3 and mooring_booking.booking_type != 4 )'
sqlCount += ' and (mooring_booking.booking_type != 3 and mooring_booking.booking_type != 4) '
# sql += ' and (mooring_booking.booking_type != 3 and mooring_booking.booking_type != 4 )'
# sqlCount += ' and (mooring_booking.booking_type != 3 and mooring_booking.booking_type != 4) '
sql += ' and (mooring_booking.booking_type != 3)'
sqlCount += ' and (mooring_booking.booking_type != 3) '

# sql += ' and mooring_booking.is_canceled = %(canceled)s'
# sqlCount += ' and mooring_booking.is_canceled = %(canceled)s'
Expand Down Expand Up @@ -2823,7 +2839,8 @@ def list(self, request, *args, **kwargs):
#print(sql)

cursor = connection.cursor()
cursor.execute("Select count(*) from mooring_booking ")
#cursor.execute("Select count(*) from mooring_booking ")
cursor.execute("select count(*) from mooring_booking left join mooring_mooringsitebooking on mooring_booking.id = mooring_mooringsitebooking.booking_id left join mooring_mooringsite on mooring_mooringsitebooking.campsite_id = mooring_mooringsite.id left join mooring_mooringareagroup_moorings on mooring_mooringsite.mooringarea_id = mooring_mooringareagroup_moorings.mooringarea_id where ("+sql_group+")")
recordsTotal = cursor.fetchone()[0]
cursor.execute(sqlCount, sqlParams)
recordsFiltered = cursor.fetchone()[0]
Expand All @@ -2837,11 +2854,13 @@ def list(self, request, *args, **kwargs):


bookings_qs = Booking.objects.filter(id__in=[b['id'] for b in data]).prefetch_related('mooringarea', 'campsites', 'campsites__campsite', 'customer', 'regos', 'history', 'invoices', 'canceled_by')

booking_map = {b.id: b for b in bookings_qs}
clean_data = []
for bk in data:
cg = None
booking = booking_map[bk['id']]
booking = booking_map[bk['id']]

cg = booking.mooringarea
bk['editable'] = booking.editable
if booking.booking_type == 4:
Expand All @@ -2861,18 +2880,24 @@ def list(self, request, *args, **kwargs):
bk['canceled_by'] = booking.canceled_by.get_full_name() if booking.canceled_by else ''
bk['cancelation_time'] = booking.cancelation_time if booking.cancelation_time else ''
bk['paid'] = booking.paid
bk['invoices'] = [ i.invoice_reference for i in booking.invoices.all()]
bk['invoices'] = [i.invoice_reference for i in booking.invoices.all()]
bk['active_invoices'] = [ i.invoice_reference for i in booking.invoices.all() if i.active]
bk['guests'] = booking.guests
bk['campsite_names'] = booking.campsite_name_list
bk['regos'] = [{r.type: r.rego} for r in booking.regos.all()]
bk['firstname'] = booking.details.get('first_name','')
bk['lastname'] = booking.details.get('last_name','')
bk['admissions'] = { 'id' :booking.admission_payment.id, 'amount': booking.admission_payment.totalCost } if booking.admission_payment else None

msb = MooringsiteBooking.objects.filter(booking=booking.id)
msb_list = []
in_mg = False
for book in msb:
mooring_area_groups = MooringAreaGroup.objects.filter(moorings__in=[book.campsite.mooringarea])
for ug in user_groups:
for mag in mooring_area_groups:
if ug.id == mag.id:
in_mg = True
msb_list.append([book.campsite.name, book.campsite.mooringarea.park.district.region.name, book.from_dt, book.to_dt])
msb_list.sort(key=lambda item: item[2])
bk['mooringsite_bookings'] = msb_list
Expand All @@ -2899,12 +2924,15 @@ def list(self, request, *args, **kwargs):
refund_statuses = ['All','Partially Refunded','Not Refunded','Refunded']
if refund_status in refund_statuses:
if refund_status == 'All':
clean_data.append(bk)
if in_mg is True:
clean_data.append(bk)
else:
if refund_status == booking.refund_status:
clean_data.append(bk)
if in_mg is True:
clean_data.append(bk)
else:
clean_data.append(bk)
if in_mg is True:
clean_data.append(bk)

return Response(OrderedDict([
('recordsTotal', recordsTotal),
Expand Down Expand Up @@ -3041,7 +3069,7 @@ def update(self, request, *args, **kwargs):
'num_infant' : guests['infants'],
'num_mooring' : guests['mooring'],
}

data = utils.update_booking(request,instance,booking_details)
serializer = BookingSerializer(data)

Expand Down Expand Up @@ -3074,6 +3102,7 @@ def partial_update(self, request, pk):
value = itm[1]
detail[key] = value
request.POST['details'] = detail

serializer = self.get_serializer(booking, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
Expand Down Expand Up @@ -3868,6 +3897,30 @@ def get(self, request, format=None):
return JsonResponse(data)


class GetProfileAdmin(views.APIView):
renderer_classes = [JSONRenderer,]
permission_classes = [IsAuthenticated]

def get(self, request, format=None):
# Check if the user has any address and set to residential address
if request.user.is_staff:
user = EmailUser.objects.get(email=request.GET.get('email_address'))
serializer = UserSerializer(user)
data = serializer.data
groups = MooringAreaGroup.objects.filter(members__in=[user,])
groups_text = []
for group in groups:
groups_text.append(group.name)
data['is_inventory'] = is_inventory(user)
data['is_admin'] = is_admin(user)
data['is_payment_officer'] = is_payment_officer(user)
data['groups'] = groups_text
return JsonResponse(data)
else:
data['status'] = 'permission denied'
return JsonResponse(data)


class UpdateProfilePersonal(views.APIView):
renderer_classes = [JSONRenderer,]
permission_classes = [IsAuthenticated]
Expand Down
2 changes: 1 addition & 1 deletion mooring/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class BookingPeriodOptionForm(forms.ModelForm):
#mooring_group = ChoiceField(choices=[],)
class Meta:
model = models.BookingPeriodOption
fields = ['period_name','option_description','small_price','medium_price','large_price','start_time','finish_time','change_group','cancel_group']
fields = ['period_name','option_description','small_price','medium_price','large_price','start_time','finish_time','change_group','cancel_group','caption']

def __init__(self, *args, **kwargs):
# User must be passed in as a kwarg.
Expand Down
13 changes: 12 additions & 1 deletion mooring/frontend/admissions/src/costs.vue
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,17 @@ export default {
return "";
}
}
}, {
data: 'mooring_group',
orderable: false,
mRender: function(data, type, full){
if(data){
var column = "<td > " + full.mooring_group + "</td>"
return column;
} else {
return "";
}
}
}, {
data: 'editable',
orderable: false,
Expand All @@ -174,7 +185,7 @@ export default {
},
},
priceHistoryDtHeaders:[
"ID", "Period Start", "Period End", "Adult", "Child", "Infant" ,"Family", "Action"
"ID", "Period Start", "Period End", "Adult", "Child", "Infant" ,"Family", "Collecting Agency","Action"
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
<div class="row" id="div_mooring_groups">
<div class="form-group">
<div class="col-md-2">
<label>Mooring Group: </label>
<label>Mooring Group (Collecting Agency): </label>
</div>
<div class="col-md-4">
<select class="form-control" name="mooring_group" v-model="priceHistory.mooring_group">
Expand Down
48 changes: 45 additions & 3 deletions mooring/frontend/availability2/src/availability.vue
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
<h1>Book mooring: {{ name }}</h1>
</div>
</div>

<div v-if="ongoing_booking" class="row" style='display:none'>
<div class="columns small-12 medium-12 large-12">
<div class="clearfix">
Expand Down Expand Up @@ -270,10 +271,12 @@
<td class="date" v-for="day in site.availability" v-bind:class="{available: day[0]}" align='center'>
<div v-for="bp in day[1].booking_period" style='width:160px; '>

<div v-if="bp.status == 'open'" >
<div v-if="bp.status == 'open'" class='tooltip2' align='left'>
<button class="button" style='width: 160px; margin-bottom: 2px;' @click="addBooking(site.id,site.mooring_id,bp.id,bp.date)" >
<small>Book {{ bp.period_name }} <span v-if="site.mooring_class == 'small'">${{ bp.small_price }}</span> <span v-if="site.mooring_class == 'medium'">${{ bp.medium_price }}</span> <span v-if="site.mooring_class == 'large'">${{ bp.large_price }}</span></small>
</button>
</button><br>

<span v-show="bp.caption.length > 1" class="tooltiptext">{{ bp.caption }}</span>
</div>
<div v-else-if="bp.status == 'selected'" >
<div style="position: relative; text-align: right; margin-right: 25px;"><a v-show="bp.past_booking == false" type="button" class="close" style="color: red; opacity: 1; position: absolute; padding-left: 5px;" @click="deleteBooking(bp.booking_row_id, bp.past_booking)" >x</a></div>
Expand Down Expand Up @@ -356,7 +359,7 @@
width: 100%;
}
// table font colour override
/* table font colour override */
table thead tr {
background: unset;
color: unset;
Expand Down Expand Up @@ -409,6 +412,45 @@
.continueBooking {
text-decoration: none;
}
/* Tooltip */
.tooltip2 {
position: relative;
display: inline-block;
}
/* Tooltip text */
.tooltip2 .tooltiptext {
visibility: hidden;
width: 165px;
background-color: black;
color: #fff;
text-align: center;
padding: 8px;
border-radius: 6px;
text-align: left;
/* Position the tooltip text - see examples below! */
position: absolute;
z-index: 1;
}
/* Show the tooltip text when you mouse over the tooltip container */
.tooltip2:hover .tooltiptext {
visibility: visible;
}
.tooltip2 .tooltiptext::after {
content: " ";
position: absolute;
bottom: 100%; /* At the top of the tooltip */
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent black transparent;
}
}
</style>
Expand Down
2 changes: 1 addition & 1 deletion mooring/frontend/exploreparks/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module.exports = {
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../../../static/'),
assetsSubDirectory: 'exploreparks',
assetsPublicPath: '/',
assetsPublicPath: '/static/',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 856846a

Please sign in to comment.