Added membership pricing view. Added membership pricing html. Added membership pricing url. Started booking view. Started integrating booking.js. Added calendar date range js lib. Fixing date picker. Added function to calculate remaining free days. Updated function to calculate booking price. Added BookingDatesForm. Added backend validation for booking dates. fixed booking form. adding pricing to booking payment view. Added free days to booking payment view. Started booking payment stripe flow. Redefined dispatch method to booking view. Now login is required for payment selecting dates and booking. Added date range to booking payment. Fixed booking select dates view. Added form validations to booking form. Created a order after a confirm a booking. Added free_days to booking model in order to facilitate free_days Availability for the next booking. Creating a Stripe charge. Creating Booking model instance. Refactor booking payment views. Associated an order to a stripe charge. Associated booking order instance with a booking instance.
This commit is contained in:
parent
1152e41b6e
commit
2eb2c90b1f
16 changed files with 783 additions and 25 deletions
|
|
@ -28,8 +28,11 @@ from utils.forms import PasswordResetRequestForm
|
|||
from utils.stripe_utils import StripeUtils
|
||||
|
||||
|
||||
from .forms import LoginForm, SignupForm, MembershipBillingForm
|
||||
from .models import MembershipType, Membership, MembershipOrder
|
||||
from .forms import LoginForm, SignupForm, MembershipBillingForm, BookingDateForm,\
|
||||
BookingBillingForm
|
||||
|
||||
from .models import MembershipType, Membership, MembershipOrder, Booking, BookingPrice,\
|
||||
BookingOrder
|
||||
|
||||
|
||||
class IndexView(TemplateView):
|
||||
|
|
@ -63,7 +66,7 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
|||
class HistoryView(TemplateView):
|
||||
template_name = "digitalglarus/history.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
context = super(HistoryView, self).get_context_data(**kwargs)
|
||||
supporters = Supporter.objects.all()
|
||||
context.update({
|
||||
|
|
@ -72,9 +75,149 @@ class HistoryView(TemplateView):
|
|||
return context
|
||||
|
||||
|
||||
class BookingSelectDatesView(LoginRequiredMixin, FormView):
|
||||
template_name = "digitalglarus/booking.html"
|
||||
form_class = BookingDateForm
|
||||
login_url = reverse_lazy('digitalglarus:login')
|
||||
success_url = reverse_lazy('digitalglarus:booking_payment')
|
||||
|
||||
def form_valid(self, form):
|
||||
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
|
||||
original_price, discount_price, free_days = Booking.\
|
||||
booking_price(user, start_date, end_date)
|
||||
self.request.session.update({
|
||||
'original_price': original_price,
|
||||
'discount_price': discount_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 super(BookingSelectDatesView, self).form_valid(form)
|
||||
|
||||
|
||||
class BookingPaymentView(LoginRequiredMixin, FormView):
|
||||
template_name = "digitalglarus/booking_payment.html"
|
||||
form_class = BookingBillingForm
|
||||
success_url = reverse_lazy('digitalglarus:booking_payment')
|
||||
booking_needed_fields = ['original_price', 'discount_price', 'booking_days', 'free_days',
|
||||
'start_date', 'end_date']
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
from_booking = all(field in request.session.keys()
|
||||
for field in self.booking_needed_fields)
|
||||
if not from_booking:
|
||||
return HttpResponseRedirect(reverse('digitalglarus:booking'))
|
||||
|
||||
return super(BookingPaymentView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
form_kwargs = super(BookingPaymentView, self).get_form_kwargs()
|
||||
form_kwargs.update({
|
||||
'initial': {
|
||||
'start_date': self.request.session.get('start_date'),
|
||||
'end_date': self.request.session.get('end_date'),
|
||||
'price': self.request.session.get('discount_price'),
|
||||
}
|
||||
})
|
||||
return form_kwargs
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
context = super(BookingPaymentView, self).get_context_data(*args, **kwargs)
|
||||
|
||||
booking_data = {key: self.request.session.get(key)
|
||||
for key in self.booking_needed_fields}
|
||||
booking_price_per_day = BookingPrice.objects.get().price_per_day
|
||||
total_discount = booking_price_per_day * booking_data.get('free_days')
|
||||
booking_data.update({
|
||||
'booking_price_per_day': booking_price_per_day,
|
||||
'total_discount': total_discount,
|
||||
'stripe_key': settings.STRIPE_API_PUBLIC_KEY
|
||||
})
|
||||
context.update(booking_data)
|
||||
return context
|
||||
|
||||
def form_valid(self, form):
|
||||
data = form.cleaned_data
|
||||
context = self.get_context_data()
|
||||
token = data.get('token')
|
||||
start_date = data.get('start_date')
|
||||
end_date = data.get('end_date')
|
||||
|
||||
original_price, discount_price, free_days = Booking.\
|
||||
booking_price(self.request.user, start_date, end_date)
|
||||
|
||||
# Get or create stripe customer
|
||||
customer = StripeCustomer.get_or_create(email=self.request.user.email,
|
||||
token=token)
|
||||
if not customer:
|
||||
form.add_error("__all__", "Invalid credit card")
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
|
||||
# Make stripe charge to a customer
|
||||
stripe_utils = StripeUtils()
|
||||
charge_response = stripe_utils.make_charge(amount=original_price,
|
||||
customer=customer.stripe_id)
|
||||
charge = charge_response.get('response_object')
|
||||
|
||||
# Check if the payment was approved
|
||||
if not charge:
|
||||
context.update({
|
||||
'paymentError': charge_response.get('error'),
|
||||
'form': form
|
||||
})
|
||||
return render(self.request, self.template_name, context)
|
||||
|
||||
charge = charge_response.get('response_object')
|
||||
|
||||
# Create Billing Address
|
||||
billing_address = form.save()
|
||||
|
||||
# Create membership plan
|
||||
booking_data = {
|
||||
'start_date': start_date,
|
||||
'end_date': end_date,
|
||||
'start_date': start_date,
|
||||
'free_days': free_days,
|
||||
'price': discount_price,
|
||||
}
|
||||
booking = Booking.create(booking_data)
|
||||
|
||||
# Create membership order
|
||||
order_data = {
|
||||
'booking': booking,
|
||||
'customer': customer,
|
||||
'billing_address': billing_address,
|
||||
'stripe_charge': charge
|
||||
}
|
||||
BookingOrder.create(order_data)
|
||||
|
||||
# request.session.update({
|
||||
# 'membership_price': membership.type.first_month_price,
|
||||
# 'membership_dates': membership.type.first_month_formated_range
|
||||
# })
|
||||
return super(BookingPaymentView, self).form_valid(form)
|
||||
# return HttpResponseRedirect(reverse('digitalglarus:membership_activated'))
|
||||
|
||||
|
||||
class MembershipPricingView(TemplateView):
|
||||
template_name = "digitalglarus/membership_pricing.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(MembershipPricingView, self).get_context_data(**kwargs)
|
||||
membership_type = MembershipType.objects.last()
|
||||
context.update({
|
||||
'membership_type': membership_type
|
||||
})
|
||||
return context
|
||||
|
||||
|
||||
class MembershipPaymentView(LoginRequiredMixin, FormView):
|
||||
template_name = "digitalglarus/membership_payment.html"
|
||||
login_url = reverse_lazy('digitalglarus:login')
|
||||
login_url = reverse_lazy('digitalglarus:signup')
|
||||
form_class = MembershipBillingForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue