Skip to content

Commit

Permalink
Merge 078e41c into b6db5a1
Browse files Browse the repository at this point in the history
  • Loading branch information
FatemehMoghadam committed Jan 23, 2018
2 parents b6db5a1 + 078e41c commit b0c3830
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 35 deletions.
26 changes: 16 additions & 10 deletions parkstay/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -932,12 +932,11 @@ def available_campsite_classes(self, request, format='json', pk=None):
raise serializers.ValidationError(str(e))


class AvailabilityViewSet(viewsets.ReadOnlyModelViewSet):
class BaseAvailabilityViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Campground.objects.all()
serializer_class = CampgroundSerializer
permission_classes = []

def retrieve(self, request, pk=None, ratis_id=None , format=None):
def retrieve(self, request, pk=None, ratis_id=None, format=None, show_all=False):
"""Fetch full campsite availability for a campground."""
# convert GET parameters to objects
ground = self.get_object()
Expand Down Expand Up @@ -993,7 +992,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):

# fetch availability map
availability = utils.get_campsite_availability(sites_qs, start_date, end_date)

# create our result object, which will be returned as JSON
result = {
'id': ground.id,
Expand All @@ -1009,7 +1008,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):
'maxAdults': 30,
'maxChildren': 30,
'sites': [],
'classes': {}
'classes': {},
}

# group results by campsite class
Expand Down Expand Up @@ -1041,7 +1040,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):
'name': c[2],
'id': None,
'type': c[1],
'price': '${}'.format(sum(rate.values())),
'price': '${}'.format(sum(rate.values())) if not show_all else False,
'availability': [[True, '${}'.format(rate[start_date+timedelta(days=i)]), rate[start_date+timedelta(days=i)], [0, 0]] for i in range(length)],
'breakdown': OrderedDict(),
'gearType': {
Expand All @@ -1066,7 +1065,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):
# get campsite class key
key = s.campsite_class.pk
# if there's not a free run of slots
if not all([v[0] == 'open' for k, v in availability[s.pk].items()]):
if (not all([v[0] == 'open' for k, v in availability[s.pk].items()])) or show_all:
# clear the campsite from the campsite class map
if s.pk in class_sites_map[key]:
class_sites_map[key].remove(s.pk)
Expand Down Expand Up @@ -1134,7 +1133,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):
'id': v[0],
'type': ground.campground_type,
'class': v[1].pk,
'price': '${}'.format(sum(v[2].values())),
'price': '${}'.format(sum(v[2].values())) if not show_all else False,
'availability': [[True, '${}'.format(v[2][start_date+timedelta(days=i)]), v[2][start_date+timedelta(days=i)]] for i in range(length)],
'gearType': {
'tent': v[3],
Expand All @@ -1151,7 +1150,7 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):
# update results based on availability map
for s in sites_qs:
# if there's not a free run of slots
if not all([v[0] == 'open' for k, v in availability[s.pk].items()]):
if (not all([v[0] == 'open' for k, v in availability[s.pk].items()])) or show_all:
# update the days that are non-open
for offset, stat in [((k-start_date).days, v[0]) for k, v in availability[s.pk].items() if v[0] != 'open']:
bookings_map[s.name]['availability'][offset][0] = False
Expand All @@ -1166,9 +1165,16 @@ def retrieve(self, request, pk=None, ratis_id=None , format=None):

return Response(result)

class AvailabilityRatisViewSet(AvailabilityViewSet):
class AvailabilityViewSet(BaseAvailabilityViewSet):
permission_classes = []

class AvailabilityRatisViewSet(BaseAvailabilityViewSet):
lookup_field = 'ratis_id'

class AvailabilityAdminViewSet(BaseAvailabilityViewSet):
def retrieve(self, request, *args, **kwargs):
return super(AvailabilityAdminViewSet, self).retrieve(request, *args, show_all=True, **kwargs)

@csrf_exempt
@require_http_methods(['POST'])
def create_booking(request, *args, **kwargs):
Expand Down
31 changes: 14 additions & 17 deletions parkstay/frontend/availability/src/availability.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
<h1>Book a campsite at {{ name }}</h1>
</div>
</div>
<div v-if="ongoing_booking"class="row">
<div v-if="ongoing_booking" class="row">
<div class="columns small-12 medium-12 large-12">
<div class="clearfix">
<a type="button" :href="parkstayUrl+'/booking'" class="button float-right warning continueBooking">
Expand Down Expand Up @@ -84,7 +84,7 @@
<input id="date-departure" type="text" placeholder="dd/mm/yyyy" v-on:change="update"/>
</label>
</div>
<div class="small-6 medium-6 large-3 columns">
<div v-if="!useAdminApi" class="small-6 medium-6 large-3 columns">
<label>
Guests
<input type="button" class="button formButton" v-bind:value="numPeople" data-toggle="guests-dropdown"/>
Expand Down Expand Up @@ -124,15 +124,15 @@
</div>
</div>
</div>
<div class="columns small-6 medium-6 large-3">
<div v-if="!useAdminApi" class="columns small-6 medium-6 large-3">
<label>Equipment
<select name="gear_type" v-model="gearType" @change="update()">
<option value="tent" v-if="gearTotals.tent">Tent</option>
<option value="campervan" v-if="gearTotals.campervan">Campervan</option>
<option value="caravan" v-if="gearTotals.caravan">Caravan / Camper trailer</option>
</select>
</label>
</div>
</div>
</div>
<div class="row" v-show="status == 'online'"><div class="columns table-scroll">
<table class="hover">
Expand Down Expand Up @@ -303,6 +303,7 @@ export default {
arrivalDate: moment.utc(getQueryParam('arrival', moment.utc(now).format('YYYY/MM/DD')), 'YYYY/MM/DD'),
departureDate: moment.utc(getQueryParam('departure', moment.utc(now).add(5, 'days').format('YYYY/MM/DD')), 'YYYY/MM/DD'),
parkstayUrl: global.parkstayUrl || process.env.PARKSTAY_URL,
useAdminApi: global.useAdminApi || false,
// order of preference:
// - GET parameter 'site_id'
// - global JS var 'parkstayGroundId'
Expand Down Expand Up @@ -436,26 +437,22 @@ export default {
var vm = this;
debounce(function() {
if (parseInt(vm.parkstayGroundRatisId) > 0){
var url = vm.parkstayUrl + '/api/availability_ratis/'+ vm.parkstayGroundRatisId +'/?'+$.param({
var params = {
arrival: moment(vm.arrivalDate).format('YYYY/MM/DD'),
departure: moment(vm.departureDate).format('YYYY/MM/DD'),
num_adult: vm.numAdults,
num_child: vm.numChildren,
num_concession: vm.numConcessions,
num_infant: vm.numInfants
});
}
else{
};
if (parseInt(vm.parkstayGroundRatisId) > 0){
var url = vm.parkstayUrl + '/api/availability_ratis/'+ vm.parkstayGroundRatisId +'/?'+$.param(params);
} else if (vm.useAdminApi) {
var url = vm.parkstayUrl + '/api/availability_admin/'+ vm.parkstayGroundId +'/?'+$.param(params);
} else{
vm.updateURL();
var url = vm.parkstayUrl + '/api/availability/'+ vm.parkstayGroundId +'.json/?'+$.param({
arrival: moment(vm.arrivalDate).format('YYYY/MM/DD'),
departure: moment(vm.departureDate).format('YYYY/MM/DD'),
num_adult: vm.numAdults,
num_child: vm.numChildren,
num_concession: vm.numConcessions,
num_infant: vm.numInfants
});
var url = vm.parkstayUrl + '/api/availability/'+ vm.parkstayGroundId +'.json/?'+$.param(params);
}
console.log('AJAX '+url);
$.ajax({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ module.exports = {
"mRender": function(data, type, full) {
var id = full.id;
var addBooking = "<br/><a href='#' class='addBooking' data-campground=\"__ID__\" >Add Booking</a>";
var availability_admin = "<br/><a target='_blank' href='/availability_admin/?site_id=__ID__' >Availability</a>";
var column = "";
if (full.active) {
Expand All @@ -145,6 +146,7 @@ module.exports = {
}
column += full.campground_type == '0' ? addBooking : "";
column += full.campground_type == '0' ? availability_admin:"";
column += "</td>";
column = column.replace(/__Current_Closure__/,full.current_closure);
return column.replace(/__ID__/g, id);
Expand Down Expand Up @@ -295,7 +297,7 @@ module.exports = {
"cg": id
}
});
});
});
bus.$on('refreshCGTable', function(){
vm.$refs.dtGrounds.vmDataTable.ajax.reload();
});
Expand Down
1 change: 1 addition & 0 deletions parkstay/serialisers.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ def __init__(self, *args, **kwargs):
super(CampsiteStayHistorySerializer, self).__init__(*args, **kwargs)
if method == 'get':
self.fields['reason'] = serializers.CharField(source='reason.text')

class CampgroundStayHistorySerializer(serializers.ModelSerializer):
details = serializers.CharField(required=False)
range_start = serializers.DateField(format='%d/%m/%Y',input_formats=['%d/%m/%Y'])
Expand Down
2 changes: 1 addition & 1 deletion parkstay/static/availability/js/app.js

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions parkstay/static/availability/js/vendor.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion parkstay/static/parkstay/js/parkstay.js

Large diffs are not rendered by default.

25 changes: 25 additions & 0 deletions parkstay/templates/ps/availability_admin.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{% extends 'ps/base.html' %}
{% load static %}

{% block title %}
Availability view - Department of Parks and Wildlife
{% endblock %}

{% block content %}
<noscript><div class="container"><div class="row">
<div class="col-sm-12"><div class="well">
<h3>Sorry, the campsite booking selector requires JavaScript support!</h3>
<p>Please ensure that JavaScript is enabled in your browser.</p>
</div></div>
</div></div></noscript>
<div id="availability"></div>
<script type="text/javascript">
{% if ground_id %} var parkstayGroundId = '{{ ground_id|escapejs }}';
{% endif %}
var useAdminApi = true;
</script>
<script src="{% static 'availability/js/manifest.js' %}"></script>
<script src="{% static 'availability/js/vendor.js' %}"></script>
<script src="{% static 'availability/js/app.js' %}"></script>
{% endblock %}

2 changes: 2 additions & 0 deletions parkstay/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
router.register(r'campground_map', api.CampgroundMapViewSet)
router.register(r'campground_map_filter', api.CampgroundMapFilterViewSet)
router.register(r'availability', api.AvailabilityViewSet, 'availability')
router.register(r'availability_admin', api.AvailabilityAdminViewSet)
router.register(r'availability_ratis', api.AvailabilityRatisViewSet, 'availability_ratis')
router.register(r'campgrounds', api.CampgroundViewSet)
router.register(r'campsites', api.CampsiteViewSet)
Expand Down Expand Up @@ -62,6 +63,7 @@
url(r'^$', views.ParkstayRoutingView.as_view(), name='ps_home'),
url(r'^campsites/(?P<ground_id>[0-9]+)/$', views.CampsiteBookingSelector.as_view(), name='campsite_booking_selector'),
url(r'^availability/$', views.CampsiteAvailabilitySelector.as_view(), name='campsite_availaiblity_selector'),
url(r'^availability_admin/$', views.AvailabilityAdmin.as_view(), name='availability_admin'),
#url(r'^ical/campground/(?P<ground_id>[0-9]+)/$', views.CampgroundFeed(), name='campground_calendar'),
url(r'^dashboard/campgrounds$', views.DashboardView.as_view(), name='dash-campgrounds'),
url(r'^dashboard/campsite-types$', views.DashboardView.as_view(), name='dash-campsite-types'),
Expand Down
2 changes: 2 additions & 0 deletions parkstay/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ def get(self, request, *args, **kwargs):
context['ground_id'] = cg.first().id
return render(request, self.template_name, context)

class AvailabilityAdmin(TemplateView):
template_name = 'ps/availability_admin.html'

class CampgroundFeed(ICalFeed):
timezone = 'UTC+8'
Expand Down

0 comments on commit b0c3830

Please sign in to comment.