Now booking is only for users with memberships. Added method to know if a membership is active or not. Added new formula for booking pricing. handling border cases when an user want to book. Added booking order detail view. Added booking order detail html.

This commit is contained in:
Levi 2016-09-05 19:45:45 -05:00
commit e3d1761d45
14 changed files with 345 additions and 45 deletions

View file

@ -13,13 +13,13 @@ from django.utils.translation import get_language
from djangocms_blog.models import Post
from django.contrib import messages
from django.http import JsonResponse
from django.views.generic import View, DetailView
from django.views.generic import View, DetailView, ListView
from .models import Supporter
from utils.forms import ContactUsForm
from django.views.generic.edit import FormView
from membership.calendar.calendar import BookCalendar
from membership.models import Calendar as CalendarModel, CustomUser, StripeCustomer
from membership.models import Calendar as CalendarModel, StripeCustomer
from utils.views import LoginViewMixin, SignupViewMixin, \
@ -34,6 +34,8 @@ from .forms import LoginForm, SignupForm, MembershipBillingForm, BookingDateForm
from .models import MembershipType, Membership, MembershipOrder, Booking, BookingPrice,\
BookingOrder
from .mixins import MembershipRequired
class IndexView(TemplateView):
template_name = "digitalglarus/old_index.html"
@ -75,9 +77,10 @@ class HistoryView(TemplateView):
return context
class BookingSelectDatesView(LoginRequiredMixin, FormView):
class BookingSelectDatesView(LoginRequiredMixin, MembershipRequired, FormView):
template_name = "digitalglarus/booking.html"
form_class = BookingDateForm
membership_redirect_url = reverse_lazy('digitalglarus:membership_pricing')
login_url = reverse_lazy('digitalglarus:login')
success_url = reverse_lazy('digitalglarus:booking_payment')
@ -85,7 +88,7 @@ class BookingSelectDatesView(LoginRequiredMixin, FormView):
user = self.request.user
start_date = form.cleaned_data.get('start_date')
end_date = form.cleaned_data.get('end_date')
booking_days = (end_date - start_date).days
booking_days = (end_date - start_date).days + 1
original_price, discount_price, free_days = Booking.\
booking_price(user, start_date, end_date)
self.request.session.update({
@ -99,10 +102,11 @@ class BookingSelectDatesView(LoginRequiredMixin, FormView):
return super(BookingSelectDatesView, self).form_valid(form)
class BookingPaymentView(LoginRequiredMixin, FormView):
class BookingPaymentView(LoginRequiredMixin, MembershipRequired, FormView):
template_name = "digitalglarus/booking_payment.html"
form_class = BookingBillingForm
success_url = reverse_lazy('digitalglarus:booking_payment')
membership_redirect_url = reverse_lazy('digitalglarus:membership_pricing')
# success_url = reverse_lazy('digitalglarus:booking_payment')
booking_needed_fields = ['original_price', 'discount_price', 'booking_days', 'free_days',
'start_date', 'end_date']
@ -114,6 +118,9 @@ class BookingPaymentView(LoginRequiredMixin, FormView):
return super(BookingPaymentView, self).dispatch(request, *args, **kwargs)
def get_success_url(self, order_id):
return reverse('digitalglarus:booking_orders_datail', kwargs={'pk': order_id})
def get_form_kwargs(self):
form_kwargs = super(BookingPaymentView, self).get_form_kwargs()
form_kwargs.update({
@ -147,7 +154,7 @@ class BookingPaymentView(LoginRequiredMixin, FormView):
start_date = data.get('start_date')
end_date = data.get('end_date')
original_price, discount_price, free_days = Booking.\
normal_price, final_price, free_days = Booking.\
booking_price(self.request.user, start_date, end_date)
# Get or create stripe customer
@ -159,7 +166,7 @@ class BookingPaymentView(LoginRequiredMixin, FormView):
# Make stripe charge to a customer
stripe_utils = StripeUtils()
charge_response = stripe_utils.make_charge(amount=original_price,
charge_response = stripe_utils.make_charge(amount=final_price,
customer=customer.stripe_id)
charge = charge_response.get('response_object')
@ -182,7 +189,8 @@ class BookingPaymentView(LoginRequiredMixin, FormView):
'end_date': end_date,
'start_date': start_date,
'free_days': free_days,
'price': discount_price,
'price': normal_price,
'final_price': final_price,
}
booking = Booking.create(booking_data)
@ -193,12 +201,13 @@ class BookingPaymentView(LoginRequiredMixin, FormView):
'billing_address': billing_address,
'stripe_charge': charge
}
BookingOrder.create(order_data)
order = BookingOrder.create(order_data)
# request.session.update({
# 'membership_price': membership.type.first_month_price,
# 'membership_dates': membership.type.first_month_formated_range
# })
return HttpResponseRedirect(self.get_success_url(order.id))
return super(BookingPaymentView, self).form_valid(form)
# return HttpResponseRedirect(reverse('digitalglarus:membership_activated'))
@ -310,6 +319,53 @@ class MembershipActivatedView(TemplateView):
return context
class OrdersBookingDetailView(LoginRequiredMixin, DetailView):
template_name = "digitalglarus/booking_orders_detail.html"
context_object_name = "order"
login_url = reverse_lazy('digitalglarus:login')
# permission_required = ['view_hostingorder']
model = BookingOrder
def get_context_data(self, *args, **kwargs):
context = super(OrdersBookingDetailView, self).get_context_data(**kwargs)
bookig_order = self.object
booking = bookig_order.booking
start_date = booking.start_date
end_date = booking.end_date
free_days = booking.free_days
booking_days = (end_date - start_date).days + 1
original_price = booking.price
final_price = booking.final_price
context.update({
'original_price': original_price,
'total_discount': original_price - final_price,
'final_price': final_price,
'booking_days': booking_days,
'free_days': free_days,
'start_date': start_date.strftime('%m/%d/%Y'),
'end_date': end_date.strftime('%m/%d/%Y'),
})
return context
class BookingOrdersListView(LoginRequiredMixin, ListView):
template_name = "digitalglarus/booking_orders_list.html"
context_object_name = "orders"
login_url = reverse_lazy('digitalglarus:login')
model = BookingOrder
paginate_by = 10
def get_queryset(self):
queryset = super(BookingOrdersListView, self).get_queryset()
queryset = queryset.filter(customer__user=self.request.user)
return queryset
############## OLD VIEWS
class CalendarApi(View):
def get(self,request,month,year):