fixing problems and credit card template and views
This commit is contained in:
		
					parent
					
						
							
								888cdc51e2
							
						
					
				
			
			
				commit
				
					
						089454e8ac
					
				
			
		
					 9 changed files with 176 additions and 33 deletions
				
			
		|  | @ -71,7 +71,7 @@ | ||||||
|     padding-right: 15px; |     padding-right: 15px; | ||||||
| 	padding-top: 15px;  | 	padding-top: 15px;  | ||||||
|     padding-bottom: 30px; |     padding-bottom: 30px; | ||||||
|     margin-top: 80px; |     margin-top: 10px; | ||||||
|     margin-bottom: 30px; |     margin-bottom: 30px; | ||||||
| 	margin-left: 10px; | 	margin-left: 10px; | ||||||
| 	margin-right: 10px; | 	margin-right: 10px; | ||||||
|  | @ -174,7 +174,7 @@ | ||||||
|     padding-right: 15px; |     padding-right: 15px; | ||||||
| 	padding-top: 15px;  | 	padding-top: 15px;  | ||||||
|     padding-bottom: 15px; |     padding-bottom: 15px; | ||||||
|     margin-top: 80px; |     margin-top: 0px; | ||||||
|     margin-bottom: 30px; |     margin-bottom: 30px; | ||||||
| 	margin-left: 10px; | 	margin-left: 10px; | ||||||
| 	margin-right: 10px; | 	margin-right: 10px; | ||||||
|  |  | ||||||
|  | @ -72,7 +72,7 @@ | ||||||
|                     </div> |                     </div> | ||||||
|                     {% if credit_card_data %} |                     {% if credit_card_data %} | ||||||
|                       <form role="form" id="billing-form" method="post" action="{% url 'digitalglarus:booking_payment' %}" novalidate> |                       <form role="form" id="billing-form" method="post" action="{% url 'digitalglarus:booking_payment' %}" novalidate> | ||||||
|                         <h2 class="billing-head">Credit Card</h2> |                         <h2 class="billing-head">Credit Card<a class="btn btn-primary btn-grey btn-edit" href="{% url 'digitalglarus:user_billing_address' %}">Edit</a></h2> | ||||||
|                         <h2 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h2> |                         <h2 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h2> | ||||||
|                         <h2 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h2> |                         <h2 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h2> | ||||||
|                         <input type="hidden" name="credit_card_needed" value="false"/> |                         <input type="hidden" name="credit_card_needed" value="false"/> | ||||||
|  |  | ||||||
|  | @ -24,8 +24,7 @@ | ||||||
|                 </form> |                 </form> | ||||||
|                 <br> |                 <br> | ||||||
|                 <div class="notice-box"> |                 <div class="notice-box"> | ||||||
|                     <p class="order-bottom-text">Still have trouble? Contact us for technical support.</p> |                     <p class="signup-text">Still have trouble?<a href="mailto:info@ungleich.ch" > Contact us </a>.</p> | ||||||
| 					<a href="mailto:info@ungleich.ch" class="btn btn-primary btn-blue">Still have trouble? Contact us for technical support</a> |  | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -50,11 +50,6 @@ | ||||||
| 	 | 	 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| </style> | </style> | ||||||
|   <section id="price"> |   <section id="price"> | ||||||
|     <div class="signup-container"> |     <div class="signup-container"> | ||||||
|  | @ -135,17 +130,22 @@ | ||||||
|   </section> |   </section> | ||||||
|    |    | ||||||
| 
 | 
 | ||||||
|   <div class="modal fade bs-example-modal-sm" id="cancel-subscription-modal" tabindex="-1" role="dialog" aria-hidden ="true"> | <div class="modal fade bs-example-modal-sm" id="cancel-subscription-modal" tabindex="-1" role="dialog" aria-hidden ="true"> | ||||||
|  | 
 | ||||||
|     <div class="modal-dialog" role="document"> |     <div class="modal-dialog" role="document"> | ||||||
|  | 	 | ||||||
|         <div class="modal-content"> |         <div class="modal-content"> | ||||||
|  | 		 | ||||||
|             <div class="modal-body"> |             <div class="modal-body"> | ||||||
| 		 | 		 | ||||||
|                 <section id="price2"> |                 <section id="price2"> | ||||||
| 					<div class="container"> | 					<div class="container"> | ||||||
| 	<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | 						 | ||||||
| 								<!--<div class="row col-md-2 text-center wow fadeInDown"></div> --> | 								<!--<div class="row col-md-2 text-center wow fadeInDown"></div> --> | ||||||
| 						<div class="row col-xs-12 col-sm-7 col-lg-6 text-center wow fadeInDown"> | 						<div class="row col-xs-12 col-sm-7 col-lg-6 text-center wow fadeInDown"> | ||||||
|  |        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||||||
| 	   <div class="price-box"> | 	   <div class="price-box"> | ||||||
|  | 	   | ||||||
|        <span class="glyphicon glyphicon-flag"></span> |        <span class="glyphicon glyphicon-flag"></span> | ||||||
|         <h2 class="section-heading">General Terms & Conditions of Digital Glarus Membership</h2> |         <h2 class="section-heading">General Terms & Conditions of Digital Glarus Membership</h2> | ||||||
|          <h2 class="price">Valid from 31 October 2016, v1.0 dated 31 October 2016</h2> |          <h2 class="price">Valid from 31 October 2016, v1.0 dated 31 October 2016</h2> | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ | ||||||
| 
 | 
 | ||||||
|                           <form method="POST" action=""> |                           <form method="POST" action=""> | ||||||
|                             {% csrf_token %}  |                             {% csrf_token %}  | ||||||
| 							<a class="btn btn-primary btn-blue space-above" href="{{request.META.HTTP_REFERER}}">Go back</a> | 							  <a class="btn btn-primary btn-grey space-above" href="{{request.META.HTTP_REFERER}}">Go back</a> | ||||||
|                             <button type="button" class="btn btn-primary btn-blue space-above" data-toggle="modal" data-target="#cancel-subscription-modal">Cancel my Membership</button> |                             <button type="button" class="btn btn-primary btn-blue space-above" data-toggle="modal" data-target="#cancel-subscription-modal">Cancel my Membership</button> | ||||||
|                            |                            | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -213,6 +213,8 @@ | ||||||
|    |    | ||||||
|    |    | ||||||
|     <div class="modal fade bs-example-modal-sm" id="cancel-subscription-modal" tabindex="-1" role="dialog" aria-hidden ="true"> |     <div class="modal fade bs-example-modal-sm" id="cancel-subscription-modal" tabindex="-1" role="dialog" aria-hidden ="true"> | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|         <div class="modal-dialog" role="document"> |         <div class="modal-dialog" role="document"> | ||||||
|             <div class="modal-content"> |             <div class="modal-content"> | ||||||
|                 <div class="modal-body"> |                 <div class="modal-body"> | ||||||
|  | @ -220,7 +222,7 @@ | ||||||
| 					   <section id="price2"> | 					   <section id="price2"> | ||||||
| 							<div class="container"> | 							<div class="container"> | ||||||
| 								<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | 								<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||||||
|      <!--<div class="row col-md-2 text-center wow fadeInDown"></div> --> |       | ||||||
|     <div class="row col-xs-12 col-sm-12	col-lg-10 text-center wow fadeInDown"> |     <div class="row col-xs-12 col-sm-12	col-lg-10 text-center wow fadeInDown"> | ||||||
|        <div class="price-box"> |        <div class="price-box"> | ||||||
|        <span class="glyphicon glyphicon-flag"></span> |        <span class="glyphicon glyphicon-flag"></span> | ||||||
|  |  | ||||||
|  | @ -26,7 +26,7 @@ | ||||||
|                 </form> |                 </form> | ||||||
|                 <br> |                 <br> | ||||||
|                 <div class="notice-box"> |                 <div class="notice-box"> | ||||||
| 					<p class="signup-text">Still have trouble?<a href="mailto:info@ungleich.ch" > Contact us for technical support</a>.</p> | 					<p class="signup-text">Still have trouble?<a href="mailto:info@ungleich.ch" > Contact us </a>.</p> | ||||||
| 					 | 					 | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|  | @ -241,7 +241,7 @@ | ||||||
|       </div> |       </div> | ||||||
|       <div class="col-md-4"> |       <div class="col-md-4"> | ||||||
|         <ul class="list-inline quicklinks"> |         <ul class="list-inline quicklinks"> | ||||||
|           <li><a href="http://www.ungleich.ch/">ungleich Home</a> |           <li><a class="btn btn-primary-text" href="http://www.ungleich.ch/">ungleich Home</a> | ||||||
|           </li> |           </li> | ||||||
|         </ul> |         </ul> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
|  | @ -41,11 +41,153 @@ from .models import MembershipType, Membership, MembershipOrder, Booking, Bookin | ||||||
| 
 | 
 | ||||||
| from .mixins import MembershipRequiredMixin, IsNotMemberMixin | from .mixins import MembershipRequiredMixin, IsNotMemberMixin | ||||||
| 
 | 
 | ||||||
| class Probar(LoginRequiredMixin, UpdateView): | ''' | ||||||
| 	template_name='digitalglarus/membership_deactivated.html' | class Probar(TemplateView): | ||||||
|  | 	template_name='digitalglarus/pinchecha.html' | ||||||
| 	model = Membership | 	model = Membership | ||||||
| 	success_url = reverse_lazy('digitalglarus:probar') | 	success_url = reverse_lazy('digitalglarus:probar') | ||||||
|  | '''	 | ||||||
|  | class Probar(TemplateView): | ||||||
|  |     template_name = "digitalglarus/pinchecha.html" | ||||||
|  |     success_url = reverse_lazy('digitalglarus:probar') | ||||||
|  |     # success_url = reverse_lazy('digitalglarus:booking_payment') | ||||||
|  | ''' | ||||||
|  |     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_success_url(self, order_id): | ||||||
|  |         return reverse('digitalglarus:booking_orders_detail', kwargs={'pk': order_id}) | ||||||
|  | 
 | ||||||
|  |     def get_form_kwargs(self): | ||||||
|  |         current_billing_address = self.request.user.billing_addresses.first() | ||||||
|  |         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('final_price'), | ||||||
|  |                 'street_address': current_billing_address.street_address, | ||||||
|  |                 'city': current_billing_address.city, | ||||||
|  |                 'postal_code': current_billing_address.postal_code, | ||||||
|  |                 'country': current_billing_address.country, | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         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} | ||||||
|  |         user = self.request.user | ||||||
|  |         last_booking_order = BookingOrder.objects.filter(customer__user=user).last() | ||||||
|  |         last_membership_order = MembershipOrder.objects.filter(customer__user=user).last() | ||||||
|  |         credit_card_data = last_booking_order.get_booking_cc_data() if last_booking_order \ | ||||||
|  |             and last_booking_order.get_booking_cc_data() \ | ||||||
|  |             else last_membership_order.get_membership_order_cc_data() | ||||||
|  | 
 | ||||||
|  |         booking_data.update({ | ||||||
|  |             'credit_card_data': credit_card_data if credit_card_data else None, | ||||||
|  |             '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') | ||||||
|  |         is_free = context.get('is_free') | ||||||
|  |         normal_price, final_price, free_days = Booking.\ | ||||||
|  |             booking_price(self.request.user, start_date, end_date) | ||||||
|  |         charge = None | ||||||
|  | 
 | ||||||
|  |         # if not credit_card_needed: | ||||||
|  |         # 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)) | ||||||
|  | 
 | ||||||
|  |         # If booking is not free, make the stripe charge | ||||||
|  |         if not is_free: | ||||||
|  |             # Make stripe charge to a customer | ||||||
|  |             stripe_utils = StripeUtils() | ||||||
|  |             charge_response = stripe_utils.make_charge(amount=final_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 for Membership Order | ||||||
|  |         billing_address = form.save() | ||||||
|  | 
 | ||||||
|  |         # Create Billing Address for User if he does not have one | ||||||
|  |         if not customer.user.billing_addresses.count(): | ||||||
|  |             data.update({ | ||||||
|  |                 'user': customer.user.id | ||||||
|  |             }) | ||||||
|  |             billing_address_user_form = UserBillingAddressForm(data) | ||||||
|  |             billing_address_user_form.is_valid() | ||||||
|  |             billing_address_user_form.save() | ||||||
|  | 
 | ||||||
|  |         # Create Booking | ||||||
|  |         booking_data = { | ||||||
|  |             'start_date': start_date, | ||||||
|  |             'end_date': end_date, | ||||||
|  |             'start_date': start_date, | ||||||
|  |             'free_days': free_days, | ||||||
|  |             'price': normal_price, | ||||||
|  |             'final_price': final_price, | ||||||
|  |         } | ||||||
|  |         booking = Booking.create(booking_data) | ||||||
|  | 
 | ||||||
|  |         # Create Booking order | ||||||
|  |         order_data = { | ||||||
|  |             'booking': booking, | ||||||
|  |             'customer': customer, | ||||||
|  |             'billing_address': billing_address, | ||||||
|  |             'stripe_charge': charge, | ||||||
|  |             'amount': final_price, | ||||||
|  |             'original_price': normal_price, | ||||||
|  |             'special_month_price': BookingPrice.objects.last().special_month_price, | ||||||
|  |         } | ||||||
|  |         order = BookingOrder.create(order_data) | ||||||
|  | 
 | ||||||
|  |         context = { | ||||||
|  |             'booking': booking, | ||||||
|  |             'order': order, | ||||||
|  |             'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host()) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         email_data = { | ||||||
|  |             'subject': 'Your booking order has been placed', | ||||||
|  |             'to': self.request.user.email, | ||||||
|  |             'context': context, | ||||||
|  |             'template_name': 'booking_order_email', | ||||||
|  |             'template_path': 'digitalglarus/emails/' | ||||||
|  |         } | ||||||
|  |         email = BaseEmail(**email_data) | ||||||
|  |         email.send() | ||||||
|  | 
 | ||||||
|  |         return HttpResponseRedirect(self.get_success_url(order.id)) | ||||||
|  | ''' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ValidateUser(TemplateView): | class ValidateUser(TemplateView): | ||||||
|  | @ -81,7 +223,7 @@ class ValidateView(SignupViewMixin): | ||||||
|     #return HttpResponse(json.dumps(resp), content_type ='application/json') |     #return HttpResponse(json.dumps(resp), content_type ='application/json') | ||||||
| 
 | 
 | ||||||
| class TermsAndConditions(TemplateView): | class TermsAndConditions(TemplateView): | ||||||
|     template_name ="digitalglarus/terms.html" |     template_name ="digitalglarus/pinchecha.html" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class IndexView(TemplateView): | class IndexView(TemplateView): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue