diff --git a/digitalglarus/migrations/0017_membership_active.py b/digitalglarus/migrations/0017_membership_active.py
new file mode 100644
index 00000000..167fc18d
--- /dev/null
+++ b/digitalglarus/migrations/0017_membership_active.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.4 on 2016-09-13 01:51
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('digitalglarus', '0016_auto_20160909_0110'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='membership',
+ name='active',
+ field=models.BooleanField(default=True),
+ ),
+ ]
diff --git a/digitalglarus/mixins.py b/digitalglarus/mixins.py
index d224d0f3..40777bf3 100644
--- a/digitalglarus/mixins.py
+++ b/digitalglarus/mixins.py
@@ -23,7 +23,7 @@ class IsNotMemberMixin(object):
if Membership.is_digitalglarus_member(request.user):
return HttpResponseRedirect(self.already_member_redirect_url)
- return super(MembershipRequiredMixin, self).dispatch(request, *args, **kwargs)
+ return super(IsNotMemberMixin, self).dispatch(request, *args, **kwargs)
class Ordereable(models.Model):
diff --git a/digitalglarus/models.py b/digitalglarus/models.py
index 1da796a2..5fdf6607 100644
--- a/digitalglarus/models.py
+++ b/digitalglarus/models.py
@@ -60,6 +60,7 @@ class MembershipType(models.Model):
class Membership(models.Model):
type = models.ForeignKey(MembershipType)
+ active = models.BooleanField(default=True)
@classmethod
def is_digitalglarus_member(cls, user):
@@ -68,17 +69,32 @@ class Membership(models.Model):
membershiporder__created_at__month=datetime.today().month)
has_booking_past_month = Q(membershiporder__customer__user=user,
membershiporder__created_at__month=past_month)
- return cls.objects.filter(has_booking_past_month | has_booking_current_month).exists()
+ active_membership = Q(active=True)
+ return cls.objects.filter(has_booking_past_month | has_booking_current_month).\
+ filter(active_membership).exists()
@classmethod
def create(cls, data):
instance = cls.objects.create(**data)
return instance
+ def deactivate(self):
+ self.active = False
+ self.save()
+
class MembershipOrder(Ordereable, models.Model):
membership = models.ForeignKey(Membership)
+ def first_membership_range_date(self):
+ start_date = self.created_at
+ _, days_in_month = calendar.monthrange(start_date.year,
+ start_date.month)
+ pass_days = start_date.day
+ days_left = days_in_month - pass_days
+ end_date = start_date + timedelta(days=days_left)
+ return start_date, end_date
+
@classmethod
def current_membership(cls, user):
last_payment = cls.objects.\
diff --git a/digitalglarus/static/digitalglarus/js/cbpAnimatedHeader.js b/digitalglarus/static/digitalglarus/js/cbpAnimatedHeader.js
index 4554e2e5..dc750576 100755
--- a/digitalglarus/static/digitalglarus/js/cbpAnimatedHeader.js
+++ b/digitalglarus/static/digitalglarus/js/cbpAnimatedHeader.js
@@ -13,7 +13,7 @@ var cbpAnimatedHeader = (function() {
var docElem = document.documentElement,
header = document.querySelector( '.navbar-default' ),
didScroll = false,
- changeHeaderOn = 300;
+ changeHeaderOn = 20;
function init() {
window.addEventListener( 'scroll', function( event ) {
diff --git a/digitalglarus/templates/digitalglarus/booking_orders_list.html b/digitalglarus/templates/digitalglarus/booking_orders_list.html
index 58a5e4bd..bff0e231 100644
--- a/digitalglarus/templates/digitalglarus/booking_orders_list.html
+++ b/digitalglarus/templates/digitalglarus/booking_orders_list.html
@@ -64,5 +64,6 @@
+
{% endblock %}
\ No newline at end of file
diff --git a/digitalglarus/templates/digitalglarus/emails/membership_charge.html b/digitalglarus/templates/digitalglarus/emails/membership_charge.html
new file mode 100644
index 00000000..d2d3971f
--- /dev/null
+++ b/digitalglarus/templates/digitalglarus/emails/membership_charge.html
@@ -0,0 +1,136 @@
+{% load static from staticfiles %}
+
+
+
+
+
+
+Oxygen Invoice
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+ Your monthly membership for period {{membership_start_date|date}} - {{membership_start_date|date}} has been charged. You can view your invoice clicking on the button below.
+ |
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
diff --git a/digitalglarus/templates/digitalglarus/emails/membership_charge.txt b/digitalglarus/templates/digitalglarus/emails/membership_charge.txt
new file mode 100644
index 00000000..d2d3971f
--- /dev/null
+++ b/digitalglarus/templates/digitalglarus/emails/membership_charge.txt
@@ -0,0 +1,136 @@
+{% load static from staticfiles %}
+
+
+
+
+
+
+Oxygen Invoice
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+ Your monthly membership for period {{membership_start_date|date}} - {{membership_start_date|date}} has been charged. You can view your invoice clicking on the button below.
+ |
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+ |
+
+
+
+
+
diff --git a/digitalglarus/templates/digitalglarus/membership_deactivated.html b/digitalglarus/templates/digitalglarus/membership_deactivated.html
new file mode 100644
index 00000000..3bfe3809
--- /dev/null
+++ b/digitalglarus/templates/digitalglarus/membership_deactivated.html
@@ -0,0 +1,62 @@
+{% extends "new_base_glarus.html" %}
+{% load staticfiles cms_tags bootstrap3%}
+{% block title %}crowdfunding{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+
Membership Deactivation
+
+
Are you sure do you want to cancel your membership with us ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/digitalglarus/templates/digitalglarus/membership_orders_detail.html b/digitalglarus/templates/digitalglarus/membership_orders_detail.html
index a63342f9..ff31eb64 100644
--- a/digitalglarus/templates/digitalglarus/membership_orders_detail.html
+++ b/digitalglarus/templates/digitalglarus/membership_orders_detail.html
@@ -67,7 +67,7 @@
-
+
{% if stripe_key %}
diff --git a/digitalglarus/templates/digitalglarus/membership_orders_list.html b/digitalglarus/templates/digitalglarus/membership_orders_list.html
index eebf0f7b..159e1379 100644
--- a/digitalglarus/templates/digitalglarus/membership_orders_list.html
+++ b/digitalglarus/templates/digitalglarus/membership_orders_list.html
@@ -9,7 +9,7 @@
-
Your Order History
+
Your Membership History
Member Name
{{request.user.name}}
@@ -17,7 +17,7 @@
Active Membership
{{membership_start_date|date}}-{{membership_end_date|date}}
-
Booking history
+
Orders history
@@ -44,6 +44,22 @@
In der Au 7 8762 Schwanden
Switzerland
+
+
+ Your Next Membership
+
+ Dates: {{membership_start_date|date}} - {{membership_end_date|date}}
+
+
+
+
+ You will be charged on the first of the month until you
+ cancel your subscription. Previous charges won't be refunded.
+
+
@@ -64,5 +80,6 @@
+
{% endblock %}
\ No newline at end of file
diff --git a/digitalglarus/urls.py b/digitalglarus/urls.py
index 2fbad407..89abd240 100644
--- a/digitalglarus/urls.py
+++ b/digitalglarus/urls.py
@@ -5,7 +5,7 @@ from . import views
from .views import ContactView, IndexView, AboutView, HistoryView, LoginView, SignupView,\
PasswordResetView, PasswordResetConfirmView, MembershipPaymentView, MembershipActivatedView,\
MembershipPricingView, BookingSelectDatesView, BookingPaymentView, OrdersBookingDetailView,\
- BookingOrdersListView, MembershipOrdersListView, OrdersMembershipDetailView
+ BookingOrdersListView, MembershipOrdersListView, OrdersMembershipDetailView, MembershipDeactivateView
# from membership.views import LoginRegistrationView
urlpatterns = [
@@ -28,6 +28,8 @@ urlpatterns = [
url(_(r'membership/payment/?$'), MembershipPaymentView.as_view(), name='membership_payment'),
url(_(r'membership/activated/?$'), MembershipActivatedView.as_view(),
name='membership_activated'),
+ url(_(r'membership/deactivate/?$'), MembershipDeactivateView.as_view(),
+ name='membership_deactivate'),
url(_(r'membership/pricing/?$'), MembershipPricingView.as_view(),
name='membership_pricing'),
url(_(r'membership/orders/(?P\d+)/?$'), OrdersMembershipDetailView.as_view(),
diff --git a/digitalglarus/views.py b/digitalglarus/views.py
index f37dd6eb..5bb7b40b 100644
--- a/digitalglarus/views.py
+++ b/digitalglarus/views.py
@@ -7,7 +7,7 @@ from django.forms import ModelForm
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _
-from django.views.generic import TemplateView
+from django.views.generic import TemplateView, UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.translation import get_language
from djangocms_blog.models import Post
@@ -15,8 +15,11 @@ from django.contrib import messages
from django.http import JsonResponse
from django.views.generic import View, DetailView, ListView
+
from .models import Supporter
from utils.forms import ContactUsForm
+from utils.mailer import BaseEmail
+
from django.views.generic.edit import FormView
from membership.calendar.calendar import BookCalendar
from membership.models import Calendar as CalendarModel, StripeCustomer
@@ -296,12 +299,35 @@ class MembershipPaymentView(LoginRequiredMixin, IsNotMemberMixin, FormView):
'stripe_charge': charge,
'amount': membership_type.first_month_price
}
- MembershipOrder.create(order_data)
+ membership_order = MembershipOrder.create(order_data)
request.session.update({
'membership_price': membership.type.first_month_price,
'membership_dates': membership.type.first_month_formated_range
})
+
+ start_m_date, end_m_date = membership_order.first_membership_range_date()
+
+ context = {
+ 'membership': membership,
+ 'order': membership_order,
+ 'membership_start_date': start_m_date,
+ 'membership_end_date': end_m_date,
+ 'base_url': "{0}://{1}".format(request.scheme, request.get_host())
+
+ }
+ email_data = {
+ 'subject': 'Your membership has been charged',
+ 'to': request.user.email,
+ 'context': context,
+ 'template_name': 'membership_charge',
+ 'template_path': 'digitalglarus/emails/'
+ }
+ email = BaseEmail(**email_data)
+ email.send()
+ import pdb
+ pdb.set_trace()
+
return HttpResponseRedirect(reverse('digitalglarus:membership_activated'))
else:
@@ -322,6 +348,27 @@ class MembershipActivatedView(TemplateView):
return context
+class MembershipDeactivateView(LoginRequiredMixin, UpdateView):
+ template_name = "digitalglarus/membership_deactivated.html"
+ model = Membership
+ success_url = reverse_lazy('digitalglarus:membership_orders_list')
+ login_url = reverse_lazy('digitalglarus:login')
+ fields = '__all__'
+
+ def get_object(self):
+ membership_order = MembershipOrder.objects.\
+ filter(customer__user=self.request.user).last()
+ if not membership_order:
+ raise AttributeError("Membership does not exists")
+ membership = membership_order.membership
+ return membership
+
+ def post(self, *args, **kwargs):
+ membership = self.get_object()
+ membership.deactivate()
+ return HttpResponseRedirect(self.success_url)
+
+
class MembershipOrdersListView(LoginRequiredMixin, ListView):
template_name = "digitalglarus/membership_orders_list.html"
context_object_name = "orders"