parent
b588dcf741
commit
16522cae1b
10 changed files with 384 additions and 17 deletions
|
@ -1,15 +1,29 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Supporter, DGGallery, DGPicture, Booking, BookingPrice,\
|
from .models import Supporter, DGGallery, DGPicture, Booking, BookingPrice,\
|
||||||
MembershipOrder, Membership, MembershipType, BookingOrder
|
MembershipOrder, Membership, MembershipType, BookingOrder, BookingCancellation
|
||||||
|
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from utils.models import ContactMessage
|
from utils.models import ContactMessage
|
||||||
#
|
from django.utils.html import format_html
|
||||||
|
|
||||||
|
|
||||||
class DGPictureInline(admin.StackedInline):
|
class DGPictureInline(admin.StackedInline):
|
||||||
model = DGPicture
|
model = DGPicture
|
||||||
|
|
||||||
|
|
||||||
class DGGalleryAdmin(admin.ModelAdmin):
|
class DGGalleryAdmin(admin.ModelAdmin):
|
||||||
inlines = [DGPictureInline]
|
inlines = [DGPictureInline]
|
||||||
|
|
||||||
|
|
||||||
|
class BookingCancellationAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('id', 'get_order', 'created_at', 'required_refund', 'refund')
|
||||||
|
|
||||||
|
def get_order(self, obj):
|
||||||
|
order = obj.order
|
||||||
|
order_url = reverse("admin:digitalglarus_bookingorder_change", args=[order.id])
|
||||||
|
return format_html("<a href='{url}'>{order_id}</a>", url=order_url, order_id=order.id)
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(DGGallery, DGGalleryAdmin)
|
admin.site.register(DGGallery, DGGalleryAdmin)
|
||||||
admin.site.register(ContactMessage)
|
admin.site.register(ContactMessage)
|
||||||
admin.site.register(Booking)
|
admin.site.register(Booking)
|
||||||
|
@ -18,3 +32,4 @@ admin.site.register(MembershipOrder)
|
||||||
admin.site.register(Membership)
|
admin.site.register(Membership)
|
||||||
admin.site.register(MembershipType)
|
admin.site.register(MembershipType)
|
||||||
admin.site.register(BookingOrder)
|
admin.site.register(BookingOrder)
|
||||||
|
admin.site.register(BookingCancellation, BookingCancellationAdmin)
|
||||||
|
|
|
@ -81,12 +81,12 @@ class CancelBookingForm(forms.ModelForm):
|
||||||
model = BookingOrder
|
model = BookingOrder
|
||||||
fields = ['status']
|
fields = ['status']
|
||||||
|
|
||||||
def clean(self):
|
# def clean(self):
|
||||||
booking = self.instance.booking
|
# booking = self.instance.booking
|
||||||
days_to_start = (booking.start_date - datetime.today().date()).days
|
# days_to_start = (booking.start_date - datetime.today().date()).days
|
||||||
if days_to_start < 7:
|
# if days_to_start < 7:
|
||||||
raise forms.ValidationError("You can't cancel your booking")
|
# raise forms.ValidationError("You can't cancel your booking")
|
||||||
return self.cleaned_data
|
# return self.cleaned_data
|
||||||
|
|
||||||
|
|
||||||
class BookingDateForm(forms.Form):
|
class BookingDateForm(forms.Form):
|
||||||
|
|
26
digitalglarus/migrations/0024_bookingcancellation.py
Normal file
26
digitalglarus/migrations/0024_bookingcancellation.py
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2016-12-02 02:22
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('digitalglarus', '0023_bookingorder_status'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='BookingCancellation',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_at', models.DateTimeField(auto_now=True)),
|
||||||
|
('required_refund', models.BooleanField(default=True)),
|
||||||
|
('refund', models.BooleanField(default=False)),
|
||||||
|
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='digitalglarus.BookingOrder')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -264,16 +264,31 @@ class BookingOrder(Ordereable, models.Model):
|
||||||
def booking_days(self):
|
def booking_days(self):
|
||||||
return (self.booking.end_date - self.booking.start_date).days + 1
|
return (self.booking.end_date - self.booking.start_date).days + 1
|
||||||
|
|
||||||
def cancellation_available(self):
|
def refund_required(self):
|
||||||
days_to_start = (booking.start_date - datetime.today()).days
|
days_to_start = (self.booking.start_date - datetime.today().date()).days
|
||||||
return False if days_to_start < 7 else True
|
return True if days_to_start < 7 else False
|
||||||
|
|
||||||
|
|
||||||
def cancel(self):
|
def cancel(self):
|
||||||
self.status = self.CANCELLED
|
self.status = self.CANCELLED
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
|
||||||
|
class BookingCancellation(models.Model):
|
||||||
|
|
||||||
|
order = models.ForeignKey(BookingOrder)
|
||||||
|
created_at = models.DateTimeField(auto_now=True)
|
||||||
|
required_refund = models.BooleanField(default=True)
|
||||||
|
refund = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Order: {} - Required Refund: {}".format(self.order.id, self.refund)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, booking_order):
|
||||||
|
required_refund = booking_order.refund_required()
|
||||||
|
cls.objects.create(order=booking_order, required_refund=required_refund)
|
||||||
|
|
||||||
|
|
||||||
class Supporter(models.Model):
|
class Supporter(models.Model):
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
description = models.TextField(null=True, blank=True)
|
description = models.TextField(null=True, blank=True)
|
||||||
|
|
|
@ -87,6 +87,9 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>Do you want to cancel your booking?</p>
|
<p>Do you want to cancel your booking?</p>
|
||||||
|
<p>
|
||||||
|
Your booking is within 7 days. You may cancel your booking but the fees will not be refunded. Your booking can be only cancelled freely until 7 days before the booked date.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer text-center">
|
<div class="modal-footer text-center">
|
||||||
<button type="button" class="btn btn-primary btn-grey" data-dismiss="modal">No</button>
|
<button type="button" class="btn btn-primary btn-grey" data-dismiss="modal">No</button>
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
{% load static from staticfiles %}
|
||||||
|
<!-- Inliner Build Version 4380b7741bb759d6cb997545f3add21ad48f010b -->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Oxygen Invoice</title>
|
||||||
|
</head>
|
||||||
|
<body bgcolor="#f7f7f7" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; color: white; margin: 0;">
|
||||||
|
<style type="text/css">
|
||||||
|
@media only screen and (max-width: 480px) {
|
||||||
|
table[class*="container-for-gmail-android"] {
|
||||||
|
min-width: 290px !important; width: 100% !important;
|
||||||
|
}
|
||||||
|
img[class="force-width-gmail"] {
|
||||||
|
display: none !important; width: 0 !important; height: 0 !important;
|
||||||
|
}
|
||||||
|
table[class="w320"] {
|
||||||
|
width: 320px !important;
|
||||||
|
}
|
||||||
|
td[class*="mobile-header-padding-left"] {
|
||||||
|
width: 160px !important; padding-left: 0 !important;
|
||||||
|
}
|
||||||
|
td[class*="mobile-header-padding-right"] {
|
||||||
|
width: 160px !important; padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
td[class="header-lg"] {
|
||||||
|
font-size: 24px !important; padding-bottom: 5px !important;
|
||||||
|
}
|
||||||
|
td[class="content-padding"] {
|
||||||
|
padding: 5px 0 5px !important;
|
||||||
|
}
|
||||||
|
td[class="button"] {
|
||||||
|
padding: 5px 5px 30px !important;
|
||||||
|
}
|
||||||
|
td[class*="free-text"] {
|
||||||
|
padding: 10px 18px 30px !important;
|
||||||
|
}
|
||||||
|
td[class~="mobile-hide-img"] {
|
||||||
|
display: none !important; height: 0 !important; width: 0 !important; line-height: 0 !important;
|
||||||
|
}
|
||||||
|
td[class~="item"] {
|
||||||
|
width: 140px !important; vertical-align: top !important;
|
||||||
|
}
|
||||||
|
td[class~="quantity"] {
|
||||||
|
width: 50px !important;
|
||||||
|
}
|
||||||
|
td[class~="price"] {
|
||||||
|
width: 90px !important;
|
||||||
|
}
|
||||||
|
td[class="item-table"] {
|
||||||
|
padding: 30px 20px !important;
|
||||||
|
}
|
||||||
|
td[class="mini-container-left"] {
|
||||||
|
padding: 0 15px 15px !important; display: block !important; width: 290px !important;
|
||||||
|
}
|
||||||
|
td[class="mini-container-right"] {
|
||||||
|
padding: 0 15px 15px !important; display: block !important; width: 290px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<table align="center" cellpadding="0" cellspacing="0" class="container-for-gmail-android" width="100%" style="border-collapse: collapse !important; min-width: 600px; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" background="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td width="100%" height="80" valign="top" style="text-align: center; vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px; background-color: #0f1221" align="center">
|
||||||
|
<!--[if gte mso 9]>
|
||||||
|
<v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="mso-width-percent:1000;height:80px; v-text-anchor:middle;">
|
||||||
|
<v:fill type="tile" src="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" color="#ffffff" />
|
||||||
|
<v:textbox inset="0,0,0,0">
|
||||||
|
<![endif]-->
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 290px; padding-left: 10px;" align="left" valign="middle">
|
||||||
|
<a href="{{base_url}}" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" src="{{base_url}}{% static 'digitalglarus/img/logo_white.svg' %}" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; border: none;"></a>
|
||||||
|
</td>
|
||||||
|
<td class="pull-right mobile-header-padding-right" style="color: #4d4d4d; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; text-align: right; line-height: 21px; width: 290px; padding-left: 10px;" align="right">
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
<!--[if gte mso 9]>
|
||||||
|
</v:textbox>
|
||||||
|
</v:rect>
|
||||||
|
<![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="header-lg" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: center; line-height: normal; font-weight: 700; padding: 35px 0 0;" align="center">
|
||||||
|
User {{user.name}}/{{user.email}} requested a booking cancellation
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="free-text" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; width: 100% !important; padding: 40px 60px 20px;" align="center">
|
||||||
|
{{user.name}} requested a booking cancellation from following dates. <br/> {{booking.start_date|date}} to {{booking.end_date|date}} <br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="button" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center">
|
||||||
|
<div style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<!--[if mso]>
|
||||||
|
<v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://" style="height:45px;v-text-anchor:middle;width:155px;" arcsize="15%" strokecolor="#ffffff" fillcolor="#ff6f6f">
|
||||||
|
<w:anchorlock/>
|
||||||
|
<center style="color:#ffffff;font-family:Helvetica, Arial, sans-serif;font-size:14px;font-weight:regular;">My Account</center>
|
||||||
|
</v:roundrect>
|
||||||
|
<![endif]-->
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7;" bgcolor="#f7f7f7">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 15px; color: #777777; text-align: center; line-height: 21px;;" align="center">
|
||||||
|
<strong style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">Your Digital Glarus Team</strong><br style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
{% load static from staticfiles %}
|
||||||
|
<!-- Inliner Build Version 4380b7741bb759d6cb997545f3add21ad48f010b -->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Oxygen Invoice</title>
|
||||||
|
</head>
|
||||||
|
<body bgcolor="#f7f7f7" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; color: white; margin: 0;">
|
||||||
|
<style type="text/css">
|
||||||
|
@media only screen and (max-width: 480px) {
|
||||||
|
table[class*="container-for-gmail-android"] {
|
||||||
|
min-width: 290px !important; width: 100% !important;
|
||||||
|
}
|
||||||
|
img[class="force-width-gmail"] {
|
||||||
|
display: none !important; width: 0 !important; height: 0 !important;
|
||||||
|
}
|
||||||
|
table[class="w320"] {
|
||||||
|
width: 320px !important;
|
||||||
|
}
|
||||||
|
td[class*="mobile-header-padding-left"] {
|
||||||
|
width: 160px !important; padding-left: 0 !important;
|
||||||
|
}
|
||||||
|
td[class*="mobile-header-padding-right"] {
|
||||||
|
width: 160px !important; padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
td[class="header-lg"] {
|
||||||
|
font-size: 24px !important; padding-bottom: 5px !important;
|
||||||
|
}
|
||||||
|
td[class="content-padding"] {
|
||||||
|
padding: 5px 0 5px !important;
|
||||||
|
}
|
||||||
|
td[class="button"] {
|
||||||
|
padding: 5px 5px 30px !important;
|
||||||
|
}
|
||||||
|
td[class*="free-text"] {
|
||||||
|
padding: 10px 18px 30px !important;
|
||||||
|
}
|
||||||
|
td[class~="mobile-hide-img"] {
|
||||||
|
display: none !important; height: 0 !important; width: 0 !important; line-height: 0 !important;
|
||||||
|
}
|
||||||
|
td[class~="item"] {
|
||||||
|
width: 140px !important; vertical-align: top !important;
|
||||||
|
}
|
||||||
|
td[class~="quantity"] {
|
||||||
|
width: 50px !important;
|
||||||
|
}
|
||||||
|
td[class~="price"] {
|
||||||
|
width: 90px !important;
|
||||||
|
}
|
||||||
|
td[class="item-table"] {
|
||||||
|
padding: 30px 20px !important;
|
||||||
|
}
|
||||||
|
td[class="mini-container-left"] {
|
||||||
|
padding: 0 15px 15px !important; display: block !important; width: 290px !important;
|
||||||
|
}
|
||||||
|
td[class="mini-container-right"] {
|
||||||
|
padding: 0 15px 15px !important; display: block !important; width: 290px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<table align="center" cellpadding="0" cellspacing="0" class="container-for-gmail-android" width="100%" style="border-collapse: collapse !important; min-width: 600px; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" background="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td width="100%" height="80" valign="top" style="text-align: center; vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px; background-color: #0f1221" align="center">
|
||||||
|
<!--[if gte mso 9]>
|
||||||
|
<v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="mso-width-percent:1000;height:80px; v-text-anchor:middle;">
|
||||||
|
<v:fill type="tile" src="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" color="#ffffff" />
|
||||||
|
<v:textbox inset="0,0,0,0">
|
||||||
|
<![endif]-->
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 290px; padding-left: 10px;" align="left" valign="middle">
|
||||||
|
<a href="{{base_url}}" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" src="{{base_url}}{% static 'digitalglarus/img/logo_white.svg' %}" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; border: none;"></a>
|
||||||
|
</td>
|
||||||
|
<td class="pull-right mobile-header-padding-right" style="color: #4d4d4d; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; text-align: right; line-height: 21px; width: 290px; padding-left: 10px;" align="right">
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
<!--[if gte mso 9]>
|
||||||
|
</v:textbox>
|
||||||
|
</v:rect>
|
||||||
|
<![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="header-lg" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: center; line-height: normal; font-weight: 700; padding: 35px 0 0;" align="center">
|
||||||
|
User {{user.name}}/{{user.email}} requested a booking cancellation
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="free-text" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; width: 100% !important; padding: 40px 60px 20px;" align="center">
|
||||||
|
{{user.name}} requested a booking cancellation from following dates. <br/> {{booking.start_date|date}} to {{booking.end_date|date}} <br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td class="button" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center">
|
||||||
|
<div style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<!--[if mso]>
|
||||||
|
<v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://" style="height:45px;v-text-anchor:middle;width:155px;" arcsize="15%" strokecolor="#ffffff" fillcolor="#ff6f6f">
|
||||||
|
<w:anchorlock/>
|
||||||
|
<center style="color:#ffffff;font-family:Helvetica, Arial, sans-serif;font-size:14px;font-weight:regular;">My Account</center>
|
||||||
|
</v:roundrect>
|
||||||
|
<![endif]-->
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7;" bgcolor="#f7f7f7">
|
||||||
|
<center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
<td style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 15px; color: #777777; text-align: center; line-height: 21px;;" align="center">
|
||||||
|
<strong style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">Your Digital Glarus Team</strong><br style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||||
|
</td>
|
||||||
|
</tr></table>
|
||||||
|
</center>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -136,7 +136,7 @@
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<button type="submit" class="btn btn-primary btn-blue">Still have a question?</button>
|
<a href="mailto:info@ungleich.ch" class="btn btn-primary btn-blue">Still have a question?</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="row col-md-2 text-center wow fadeInDown">
|
<div class="row col-md-2 text-center wow fadeInDown">
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
<hr class="greyline-long">
|
<hr class="greyline-long">
|
||||||
<h2 class="billing-head">Billing Adress</h2>
|
<h2 class="billing-head">Billing Adress</h2>
|
||||||
<div class="signup-form form-group row">
|
<div class="signup-form form-group row">
|
||||||
|
{% if current_billing_address %}
|
||||||
<form role="form" id="billing-address-form" method="post" action="{% url 'digitalglarus:user_billing_address' %}" novalidate>
|
<form role="form" id="billing-address-form" method="post" action="{% url 'digitalglarus:user_billing_address' %}" novalidate>
|
||||||
{% for field in form %}
|
{% for field in form %}
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
@ -49,6 +50,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
{% else %}
|
||||||
|
<div class="text-center">
|
||||||
|
<h2 class="billing-head text-center">You don't have any order yet</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -37,7 +37,7 @@ from .forms import LoginForm, SignupForm, MembershipBillingForm, BookingDateForm
|
||||||
BookingBillingForm, CancelBookingForm
|
BookingBillingForm, CancelBookingForm
|
||||||
|
|
||||||
from .models import MembershipType, Membership, MembershipOrder, Booking, BookingPrice,\
|
from .models import MembershipType, Membership, MembershipOrder, Booking, BookingPrice,\
|
||||||
BookingOrder
|
BookingOrder, BookingCancellation
|
||||||
|
|
||||||
from .mixins import MembershipRequiredMixin, IsNotMemberMixin
|
from .mixins import MembershipRequiredMixin, IsNotMemberMixin
|
||||||
|
|
||||||
|
@ -519,6 +519,14 @@ class UserBillingAddressView(LoginRequiredMixin, UpdateView):
|
||||||
|
|
||||||
return next_url
|
return next_url
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(UserBillingAddressView, self).get_context_data(**kwargs)
|
||||||
|
current_billing_address = self.request.user.billing_addresses.first()
|
||||||
|
context.update({
|
||||||
|
'current_billing_address': current_billing_address
|
||||||
|
})
|
||||||
|
return current_billing_address
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
"""
|
"""
|
||||||
If the form is valid, save the associated model.
|
If the form is valid, save the associated model.
|
||||||
|
@ -546,8 +554,8 @@ class UserBillingAddressView(LoginRequiredMixin, UpdateView):
|
||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
current_billing_address = self.request.user.billing_addresses.filter(current=True).last()
|
current_billing_address = self.request.user.billing_addresses.filter(current=True).last()
|
||||||
if not current_billing_address:
|
# if not current_billing_address:
|
||||||
raise AttributeError("Billing Address does not exists")
|
# raise AttributeError("Billing Address does not exists")
|
||||||
return current_billing_address
|
return current_billing_address
|
||||||
|
|
||||||
|
|
||||||
|
@ -639,6 +647,27 @@ class OrdersBookingDetailView(LoginRequiredMixin, UpdateView):
|
||||||
booking_order.cancel()
|
booking_order.cancel()
|
||||||
request = self.request
|
request = self.request
|
||||||
|
|
||||||
|
BookingCancellation.create(booking_order)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'order': booking_order,
|
||||||
|
'booking': booking_order.booking,
|
||||||
|
'base_url': "{0}://{1}".format(request.scheme, request.get_host()),
|
||||||
|
'user': request.user
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
email_data = {
|
||||||
|
'subject': 'A cancellation has been requested',
|
||||||
|
'to': 'info@ungleich.ch',
|
||||||
|
'context': context,
|
||||||
|
'template_name': 'booking_cancellation_notification',
|
||||||
|
'template_path': 'digitalglarus/emails/'
|
||||||
|
}
|
||||||
|
|
||||||
|
email = BaseEmail(**email_data)
|
||||||
|
email.send()
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'order': booking_order,
|
'order': booking_order,
|
||||||
'booking': booking_order.booking,
|
'booking': booking_order.booking,
|
||||||
|
@ -646,7 +675,7 @@ class OrdersBookingDetailView(LoginRequiredMixin, UpdateView):
|
||||||
|
|
||||||
}
|
}
|
||||||
email_data = {
|
email_data = {
|
||||||
'subject': 'Your membership has been charged',
|
'subject': 'Your booking has been cancelled',
|
||||||
'to': request.user.email,
|
'to': request.user.email,
|
||||||
'context': context,
|
'context': context,
|
||||||
'template_name': 'booking_cancellation',
|
'template_name': 'booking_cancellation',
|
||||||
|
|
Loading…
Reference in a new issue