Fixed blling form goes out of background image, Fixed billing address page "amount" field seems broken, Changed authentication page fonts
Added new DG login.html, Fixed DG login contact footer, Added new DG login form, Added DG login, Added DG signup, Added DG reset password, Added DG confirm reset password, Added DG membership payment view Please enter the commit message for your changes. Lines starting
This commit is contained in:
parent
1470caee89
commit
f56f294205
23 changed files with 1512 additions and 140 deletions
36
digitalglarus/forms.py
Normal file
36
digitalglarus/forms.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
from django import forms
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
|
from utils.models import BillingAddress
|
||||||
|
from utils.forms import LoginFormMixin, SignupFormMixin, BillingAddressForm
|
||||||
|
|
||||||
|
from .models import MembershipType
|
||||||
|
|
||||||
|
|
||||||
|
class LoginForm(LoginFormMixin):
|
||||||
|
email = forms.CharField(widget=forms.EmailInput())
|
||||||
|
password = forms.CharField(widget=forms.PasswordInput())
|
||||||
|
|
||||||
|
|
||||||
|
class SignupForm(SignupFormMixin):
|
||||||
|
confirm_password = forms.CharField(widget=forms.PasswordInput())
|
||||||
|
password = forms.CharField(widget=forms.PasswordInput())
|
||||||
|
name = forms.CharField(label='name',
|
||||||
|
widget=forms.TextInput(attrs={'placeholder': 'Full name'}))
|
||||||
|
|
||||||
|
|
||||||
|
class MembershipBillingForm(BillingAddressForm):
|
||||||
|
token = forms.CharField(widget=forms.HiddenInput())
|
||||||
|
membership_type = forms.ModelChoiceField(queryset=MembershipType.objects.all(),
|
||||||
|
widget=forms.HiddenInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = BillingAddress
|
||||||
|
fields = ['membership_type', 'street_address', 'city', 'postal_code', 'country']
|
||||||
|
labels = {
|
||||||
|
'street_address': _('Street Address'),
|
||||||
|
'city': _('City'),
|
||||||
|
'postal_code': _('Postal Code'),
|
||||||
|
'country': _('Country'),
|
||||||
|
}
|
47
digitalglarus/migrations/0007_auto_20160820_0408.py
Normal file
47
digitalglarus/migrations/0007_auto_20160820_0408.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2016-08-20 04:08
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('digitalglarus', '0006_delete_message'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Membership',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MembershipOrder',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('approved', models.BooleanField(default=False)),
|
||||||
|
('last4', models.CharField(max_length=4)),
|
||||||
|
('cc_brand', models.CharField(max_length=10)),
|
||||||
|
('stripe_charge_id', models.CharField(max_length=100, null=True)),
|
||||||
|
('membership', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='digitalglarus.Membership')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MembershipType',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(choices=[('standard', 'Standard')], max_length=20)),
|
||||||
|
('price', models.FloatField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='membership',
|
||||||
|
name='type',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='digitalglarus.MembershipType'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -4,6 +4,35 @@ from filer.fields.image import FilerImageField
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
|
|
||||||
|
class MembershipType(models.Model):
|
||||||
|
|
||||||
|
MEMBERSHIP_TYPES = (
|
||||||
|
('standard', 'Standard'),
|
||||||
|
|
||||||
|
)
|
||||||
|
name = models.CharField(choices=MEMBERSHIP_TYPES, max_length=20)
|
||||||
|
price = models.FloatField()
|
||||||
|
|
||||||
|
|
||||||
|
class Membership(models.Model):
|
||||||
|
type = models.ForeignKey(MembershipType)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, data, user):
|
||||||
|
instance = cls.objects.create(**data)
|
||||||
|
instance.assign_permissions(user)
|
||||||
|
return instance
|
||||||
|
|
||||||
|
|
||||||
|
class MembershipOrder(models.Model):
|
||||||
|
membership = models.ForeignKey(Membership)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
approved = models.BooleanField(default=False)
|
||||||
|
last4 = models.CharField(max_length=4)
|
||||||
|
cc_brand = models.CharField(max_length=10)
|
||||||
|
stripe_charge_id = models.CharField(max_length=100, null=True)
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
|
@ -16,6 +45,8 @@ class Supporter(models.Model):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DGGallery(models.Model):
|
class DGGallery(models.Model):
|
||||||
parent = models.ForeignKey('self', blank=True, null=True)
|
parent = models.ForeignKey('self', blank=True, null=True)
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
|
|
622
digitalglarus/static/digitalglarus/css/price.css
Normal file
622
digitalglarus/static/digitalglarus/css/price.css
Normal file
|
@ -0,0 +1,622 @@
|
||||||
|
@charset "UTF-8";
|
||||||
|
/* CSS Document */
|
||||||
|
#membership-includes {
|
||||||
|
text-align: center;
|
||||||
|
color: #fff;
|
||||||
|
background-attachment: scroll;
|
||||||
|
background-image: url(../img/header_bg_5.png);
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: none;
|
||||||
|
-webkit-background-size: cover;
|
||||||
|
-moz-background-size: cover;
|
||||||
|
background-size: cover;
|
||||||
|
-o-background-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-headline-small{
|
||||||
|
font-family: 'Raleway' , "Open Sans Bold", Helvetica, Arial, "Arial Bold", sans-serif;
|
||||||
|
font-size: 46px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
text-transform: none;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.intro-smaller {
|
||||||
|
font-family: 'Raleway' ,'Montserrat' ,"Open Sans Bold", Helvetica, Arial, "Arial Bold", sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
text-transform: none;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.intro-price {
|
||||||
|
padding-top: 70px;
|
||||||
|
padding-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ul{
|
||||||
|
columns: 2;
|
||||||
|
padding: 15px 0;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 300;
|
||||||
|
color: #fff;
|
||||||
|
margin: 40px 0;
|
||||||
|
}
|
||||||
|
.price-list{
|
||||||
|
background-color: transparent;
|
||||||
|
font-size: 18px;
|
||||||
|
border: 0;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price{
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#price {
|
||||||
|
background-image: url(../img/bg-price.png);
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: none;
|
||||||
|
-webkit-background-size: cover;
|
||||||
|
-moz-background-size: cover;
|
||||||
|
background-size: cover;
|
||||||
|
-o-background-size: cover;
|
||||||
|
}
|
||||||
|
.price-box{
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
margin-top: 80px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph{
|
||||||
|
padding-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glyphicon-ok{
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glyphicon-plus{
|
||||||
|
font-size: 42px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
margin: 40px auto 20px;
|
||||||
|
color: #88c7d7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-container {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.greyline{
|
||||||
|
border-color: #ddd;
|
||||||
|
border-width: 1px;
|
||||||
|
max-width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.greyline-long{
|
||||||
|
border-color: #ddd;
|
||||||
|
border-width: 1px;
|
||||||
|
max-width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-form {
|
||||||
|
padding: 2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
padding-bottom: 0.1em;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-lead {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.4em;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
border-image-source: initial;
|
||||||
|
border-image-slice: initial;
|
||||||
|
border-image-width: initial;
|
||||||
|
border-image-outset: initial;
|
||||||
|
border-image-repeat: initial;
|
||||||
|
min-height: 20px;
|
||||||
|
background: rgb(255, 255, 255);
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: rgba(37, 39, 41, 0.498039);
|
||||||
|
padding: 10.5px 10px;
|
||||||
|
transition: all 0.15s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notice-box {
|
||||||
|
padding-top: 1.5em;
|
||||||
|
padding-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-text {
|
||||||
|
color: #777;
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 13px;
|
||||||
|
text-transform: none;
|
||||||
|
font-family: "Helvetica Neue" ,"Helvetica Neue" ,"Open Sans" ,"Arial" , sans-serif;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-text a {
|
||||||
|
font-weight : 400;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
color: #31708f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-notice a {
|
||||||
|
font-weight : 400;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
color: #31708f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-box {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
margin-top: 80px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.signup-notice {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glyphicon-user{
|
||||||
|
font-size: 42px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
margin: 40px auto 20px;
|
||||||
|
color: #88c7d7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.glyphicon-ok {
|
||||||
|
font-size: 42px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
color: #88c7d7;
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.membership-amount{
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: right;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.payment-box{
|
||||||
|
padding-top: 3em;
|
||||||
|
padding-left: 30px;
|
||||||
|
padding-right: 30px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
margin-top: 80px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-head{
|
||||||
|
font-weight: 600;
|
||||||
|
padding-left: 15px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.membership-lead {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.4em;
|
||||||
|
text-transform: none;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
font-family: helvetica neue, helvitica, open-sans, sans-serif;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-name{
|
||||||
|
font-size: 18px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 700;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-person{
|
||||||
|
text-align: right;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #494949;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-item{
|
||||||
|
font-size: 18px;
|
||||||
|
text-transform: none;
|
||||||
|
font-weight: 400;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-duration {
|
||||||
|
padding-bottom: 1em;
|
||||||
|
color: #999;
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
font-weight: 200;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header{
|
||||||
|
padding: 12px 15px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-bottom: 2px solid #f7f7f7;
|
||||||
|
background-color: #a1cfd7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.payment-total{
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 200;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-sum {
|
||||||
|
text-align: right;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #494949;
|
||||||
|
}
|
||||||
|
.order-result {
|
||||||
|
font-family: open-sans, montserrat, Helvetica Neue, Helvetica, sans-serif;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
font-size: 28px;
|
||||||
|
color: #494949;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-bottom-text {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
color: #777;
|
||||||
|
padding-left: 15px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-bottom-text a {
|
||||||
|
font-weight : 400;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
color: #31708f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-summary {
|
||||||
|
background-color:#fff;
|
||||||
|
margin-top: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-box{
|
||||||
|
padding-top: 0;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.billing-head {
|
||||||
|
padding-left: 15px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 21px;
|
||||||
|
text-align: left;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-head {
|
||||||
|
padding-left: 15px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 24px;
|
||||||
|
text-align: left;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
color: #999;
|
||||||
|
border-radius: 0px;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-control-description {
|
||||||
|
color: #999;
|
||||||
|
font-weight: 300;
|
||||||
|
font-family: "helvetica neue", "helvetica", "sans-serif" ;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-control-description a {
|
||||||
|
color: #31708f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-control {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-box {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-box {
|
||||||
|
padding-top: 1.5em;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-oneline {
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-grey {
|
||||||
|
background-color: #b2b7b9;;
|
||||||
|
border-color: #b2b7b9;;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-grey:hover,
|
||||||
|
.btn-grey:focus,
|
||||||
|
.btn-grey:active,
|
||||||
|
.btn-grey.active,
|
||||||
|
.open .dropdown-toggle.btn-grey {
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 400;
|
||||||
|
border-color: #ddd;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-blue:hover,
|
||||||
|
.btn-blue:focus,
|
||||||
|
.btn-blue:active,
|
||||||
|
.btn-blue.active,
|
||||||
|
.open .dropdown-toggle.btn-grey {
|
||||||
|
background-color: #5699b9;
|
||||||
|
border-color: #5699b9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loggedin-head {
|
||||||
|
padding-left: 15px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 21px;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: none;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loggedin-lead {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.4em;
|
||||||
|
text-transform: none;
|
||||||
|
text-align: center;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
font-family: helvetica neue, helvitica, open-sans, sans-serif;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.activation-lead {
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.4em;
|
||||||
|
text-transform: none;
|
||||||
|
text-align: center;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-bottom: 0;
|
||||||
|
font-family: helvetica neue, helvitica, open-sans, sans-serif;
|
||||||
|
font-weight: 200;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-booking-box {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.member-name{
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
font-weight: 400;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
line-height: 0.35em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.history-name{
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
font-weight: 400;
|
||||||
|
text-align: left;
|
||||||
|
width: 100%;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
line-height: 1.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-center-box {
|
||||||
|
margin-top: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table td, .table th {
|
||||||
|
padding: .75rem;
|
||||||
|
vertical-align: top;
|
||||||
|
border-top: 1px solid #eceeef;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {
|
||||||
|
padding: .75rem;
|
||||||
|
vertical-align: top;
|
||||||
|
border-top: 1px solid #eceeef;
|
||||||
|
border-bottom: 1px solid #eceeef;
|
||||||
|
color: #777;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.table{
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-head {
|
||||||
|
font-size: 18px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 900;
|
||||||
|
padding-top: 15px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
color: #88c7d7;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table td {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-edit {
|
||||||
|
font-size: 10px;
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-right: 8px;
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
background-color: #b2b7b9;
|
||||||
|
border-color: #b2b7b9;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 200;
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-button {
|
||||||
|
text-align:left;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-deactivate {
|
||||||
|
font-size: 11px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
padding-top: 4px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-darkgrey {
|
||||||
|
display: inline;
|
||||||
|
padding: .2em .6em .3em;
|
||||||
|
font-size: 75%;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: baseline;
|
||||||
|
border-radius: .25em;
|
||||||
|
background-color: #777;
|
||||||
|
border-color: #777;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-darkgrey:hover,
|
||||||
|
.btn-darkgrey:focus,
|
||||||
|
.btn-darkgrey:active,
|
||||||
|
.btn-darkgrey.active,
|
||||||
|
.open .dropdown-toggle.btn-darkgrey {
|
||||||
|
text-transform: none;
|
||||||
|
font-weight: 400;
|
||||||
|
border-color: #88c7d7;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #88c7d7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thankyou {
|
||||||
|
|
||||||
|
font-size: 30px;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 45px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-up{
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-exp-box {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: inherit;
|
||||||
|
background-color: #fff;
|
||||||
|
text-align: left;
|
||||||
|
}
|
BIN
digitalglarus/static/digitalglarus/img/bg-price.png
Normal file
BIN
digitalglarus/static/digitalglarus/img/bg-price.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
BIN
digitalglarus/static/digitalglarus/img/graph.png
Normal file
BIN
digitalglarus/static/digitalglarus/img/graph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 81 KiB |
BIN
digitalglarus/static/digitalglarus/img/header_bg_5.png
Normal file
BIN
digitalglarus/static/digitalglarus/img/header_bg_5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
124
digitalglarus/static/digitalglarus/js/payment.js
Normal file
124
digitalglarus/static/digitalglarus/js/payment.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
$( document ).ready(function() {
|
||||||
|
|
||||||
|
$.ajaxSetup({
|
||||||
|
beforeSend: function(xhr, settings) {
|
||||||
|
function getCookie(name) {
|
||||||
|
var cookieValue = null;
|
||||||
|
if (document.cookie && document.cookie != '') {
|
||||||
|
var cookies = document.cookie.split(';');
|
||||||
|
for (var i = 0; i < cookies.length; i++) {
|
||||||
|
var cookie = jQuery.trim(cookies[i]);
|
||||||
|
// Does this cookie string begin with the name we want?
|
||||||
|
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cookieValue;
|
||||||
|
}
|
||||||
|
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
|
||||||
|
// Only send the token to relative URLs i.e. locally.
|
||||||
|
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var $form = $('#payment-form');
|
||||||
|
$form.submit(payWithStripe);
|
||||||
|
|
||||||
|
/* If you're using Stripe for payments */
|
||||||
|
function payWithStripe(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
/* Visual feedback */
|
||||||
|
$form.find('[type=submit]').html('Validating <i class="fa fa-spinner fa-pulse"></i>');
|
||||||
|
|
||||||
|
var PublishableKey = window.stripeKey;
|
||||||
|
Stripe.setPublishableKey(PublishableKey);
|
||||||
|
Stripe.card.createToken($form, function stripeResponseHandler(status, response) {
|
||||||
|
if (response.error) {
|
||||||
|
/* Visual feedback */
|
||||||
|
$form.find('[type=submit]').html('Try again');
|
||||||
|
/* Show Stripe errors on the form */
|
||||||
|
$form.find('.payment-errors').text(response.error.message);
|
||||||
|
$form.find('.payment-errors').closest('.row').show();
|
||||||
|
} else {
|
||||||
|
/* Visual feedback */
|
||||||
|
$form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>');
|
||||||
|
/* Hide Stripe errors on the form */
|
||||||
|
$form.find('.payment-errors').closest('.row').hide();
|
||||||
|
$form.find('.payment-errors').text("");
|
||||||
|
// response contains id and card, which contains additional card details
|
||||||
|
var token = response.id;
|
||||||
|
// AJAX
|
||||||
|
|
||||||
|
//set token on a hidden input
|
||||||
|
$('#id_token').val(token);
|
||||||
|
$('#billing-form').submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Form validation */
|
||||||
|
$.validator.addMethod("month", function(value, element) {
|
||||||
|
return this.optional(element) || /^(01|02|03|04|05|06|07|08|09|10|11|12)$/.test(value);
|
||||||
|
}, "Please specify a valid 2-digit month.");
|
||||||
|
|
||||||
|
$.validator.addMethod("year", function(value, element) {
|
||||||
|
return this.optional(element) || /^[0-9]{2}$/.test(value);
|
||||||
|
}, "Please specify a valid 2-digit year.");
|
||||||
|
|
||||||
|
validator = $form.validate({
|
||||||
|
rules: {
|
||||||
|
cardNumber: {
|
||||||
|
required: true,
|
||||||
|
creditcard: true,
|
||||||
|
digits: true
|
||||||
|
},
|
||||||
|
expMonth: {
|
||||||
|
required: true,
|
||||||
|
month: true
|
||||||
|
},
|
||||||
|
expYear: {
|
||||||
|
required: true,
|
||||||
|
year: true
|
||||||
|
},
|
||||||
|
cvCode: {
|
||||||
|
required: true,
|
||||||
|
digits: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
highlight: function(element) {
|
||||||
|
$(element).closest('.form-control').removeClass('success').addClass('error');
|
||||||
|
},
|
||||||
|
unhighlight: function(element) {
|
||||||
|
$(element).closest('.form-control').removeClass('error').addClass('success');
|
||||||
|
},
|
||||||
|
errorPlacement: function(error, element) {
|
||||||
|
$(element).closest('.form-group').append(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
paymentFormReady = function() {
|
||||||
|
if ($form.find('[name=cardNumber]').hasClass("success") &&
|
||||||
|
$form.find('[name=expMonth]').hasClass("success") &&
|
||||||
|
$form.find('[name=expYear]').hasClass("success") &&
|
||||||
|
$form.find('[name=cvCode]').val().length > 1) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$form.find('[type=submit]').prop('disabled', true);
|
||||||
|
var readyInterval = setInterval(function() {
|
||||||
|
if (paymentFormReady()) {
|
||||||
|
$form.find('[type=submit]').prop('disabled', false);
|
||||||
|
clearInterval(readyInterval);
|
||||||
|
}
|
||||||
|
}, 250);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
{% extends "new_base_glarus.html" %}
|
||||||
|
{% load staticfiles cms_tags bootstrap3%}
|
||||||
|
{% block title %}crowdfunding{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<section id="price">
|
||||||
|
<div class="signup-container">
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"> </div>
|
||||||
|
<div class="col-xs-12 col-sm-6 col-lg-4 text-center wow fadeInDown">
|
||||||
|
<div class="payment-box">
|
||||||
|
<h2 class="billing-head">Set your new password</h2>
|
||||||
|
<hr class="greyline-long">
|
||||||
|
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form action="" method="post" class="form" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% for field in form %}
|
||||||
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
|
{% endfor %}
|
||||||
|
<p>{{form.non_field_errors|striptags}}</p>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-primary btn-blue">Reset</button>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<div class="notice-box">
|
||||||
|
<p class="order-bottom-text">Still have trouble? Contact us for technical support.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact">
|
||||||
|
<div class="fill">
|
||||||
|
<div class="row" class="wow fadeInDown">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown">
|
||||||
|
<div class="col-md-4 map-title">
|
||||||
|
Digital Glarus<br>
|
||||||
|
<span class="map-caption">In der Au 7 Schwanden 8762 Switzerland
|
||||||
|
<br>info@digitalglarus.ch
|
||||||
|
<br>
|
||||||
|
(044) 534-66-22
|
||||||
|
<p> </p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p> </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{% load i18n %}{% autoescape off %}
|
||||||
|
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
|
||||||
|
|
||||||
|
{% trans "Please go to the following page and choose a new password:" %}
|
||||||
|
{% block reset_link %}
|
||||||
|
{{ base_url }}{% url 'digitalglarus:reset_password_confirm' uidb64=uid token=token %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% trans "Thanks for using our site!" %}
|
||||||
|
|
||||||
|
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
|
||||||
|
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{% load i18n %}{% autoescape off %}
|
||||||
|
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
|
||||||
|
|
||||||
|
{% trans "Please go to the following page and choose a new password:" %}
|
||||||
|
{% block reset_link %}
|
||||||
|
{{ base_url }}{% url 'digitalglarus:reset_password_confirm' uidb64=uid token=token %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% trans "Thanks for using our site!" %}
|
||||||
|
|
||||||
|
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
|
||||||
|
|
||||||
|
{% endautoescape %}
|
78
digitalglarus/templates/digitalglarus/login.html
Normal file
78
digitalglarus/templates/digitalglarus/login.html
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
{% extends "new_base_glarus.html" %}
|
||||||
|
{% load staticfiles bootstrap3 i18n %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
|
||||||
|
<section id="price">
|
||||||
|
<div class="signup-container">
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"> </div>
|
||||||
|
<div class="col-xs-12 col-sm-6 col-lg-4 text-center wow fadeInDown">
|
||||||
|
<div class="signup-box">
|
||||||
|
<span class="glyphicon glyphicon-user"></span>
|
||||||
|
<h2 class="section-heading">Log In</h2>
|
||||||
|
<h2 class="signup-lead">Welcome!<br></h2>
|
||||||
|
|
||||||
|
|
||||||
|
{% if messages %}
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
{% for message in messages %}
|
||||||
|
<li>{{ message }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<hr class="primary">
|
||||||
|
|
||||||
|
{% block messages %}
|
||||||
|
{% if request.GET.logged_out %}
|
||||||
|
<div class="alert"> <!-- singular -->
|
||||||
|
<a class="close" data-dismiss="alert">×</a>
|
||||||
|
{% trans "You haven been logged out"%}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form action="{% url 'digitalglarus:login' %}" method="post" class="form" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="" value="{{ request.GET.next }}">
|
||||||
|
{% for field in form %}
|
||||||
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
|
{% endfor %}
|
||||||
|
<p>{{form.non_field_errors|striptags}}</p>
|
||||||
|
|
||||||
|
<p class="signup-notice">By logging in you agree to our<a href=#terms>Terms of Service</a>.</p>
|
||||||
|
<button type="submit" class="btn btn-primary btn-blue">Login</button>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<div class="notice-box">
|
||||||
|
<p class="signup-text">Forgot password?<a href="{% url 'digitalglarus:reset_password' %}">Find ID/Password</a></p>
|
||||||
|
<p class="signup-text">Not a member yet?<a href="{% url 'digitalglarus:signup' %}">Sign up </a>now.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact">
|
||||||
|
<div class="fill">
|
||||||
|
<div class="row" class="wow fadeInDown">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown">
|
||||||
|
<div class="col-md-4 map-title">
|
||||||
|
Digital Glarus<br>
|
||||||
|
<span class="map-caption">In der Au 7 Schwanden 8762 Switzerland
|
||||||
|
<br>info@digitalglarus.ch
|
||||||
|
<br>
|
||||||
|
(044) 534-66-22
|
||||||
|
<p> </p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p> </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
177
digitalglarus/templates/digitalglarus/membership_payment.html
Normal file
177
digitalglarus/templates/digitalglarus/membership_payment.html
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
{% extends "new_base_glarus.html" %}
|
||||||
|
{% load staticfiles bootstrap3 i18n %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
.nopadding {
|
||||||
|
padding: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<section id="price">
|
||||||
|
<div class="signup-container">
|
||||||
|
<div class="col-xs-12 col-sm-6 col-lg-8 text-center wow fadeInDown">
|
||||||
|
<div class="payment-box">
|
||||||
|
<h2 class="section-heading payment-head">Membership</h2>
|
||||||
|
<!-- <h2 class="membership-amount">35CHF</h2> -->
|
||||||
|
<h2 class="membership-lead">Your Digital Glarus Membership enables
|
||||||
|
you to use our coworking space and it includes
|
||||||
|
2 working days for the month you signed up.
|
||||||
|
The membership fee is a monthly subscription.
|
||||||
|
Additional day costs
|
||||||
|
15CHF per day. More than 17 days a month it
|
||||||
|
will charge only 290CHF/month.</h2>
|
||||||
|
<hr class="greyline-long">
|
||||||
|
<h2 class="billing-head">Member Name</h2>
|
||||||
|
<h2 class="member-name">Nico Schottelius</h2>
|
||||||
|
<hr class="greyline-long">
|
||||||
|
<h2 class="billing-head">Billing Adress</h2>
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form role="form" id="billing-form" method="post" action="{% url 'digitalglarus:membership_payment' %}" novalidate>
|
||||||
|
{% for field in form %}
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
|
{% endfor %}
|
||||||
|
{% bootstrap_form_errors form type='non_fields'%}
|
||||||
|
<br>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<h2 class="billing-head">Credit Card</h2>
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form role="form" id="payment-form" novalidate>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-9 col-md-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" name="cardName" placeholder="Name on card" required autofocus data-stripe="name" />
|
||||||
|
<span class="input-group-addon"><i class="fa fa-user" aria-hidden="true"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-9 col-md-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" name="cardNumber" placeholder="Valid Card Number" required data-stripe="number" />
|
||||||
|
<span class="input-group-addon"><i class="fa fa-credit-card"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-6 col-md-6 nopadding">
|
||||||
|
<label for="expMonth">EXPIRATION DATE</label><br/>
|
||||||
|
<div class="col-xs-6 col-lg-6 col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" class="form-control" name="expMonth" placeholder="MM" required data-stripe="exp_month" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6 col-lg-6 col-md-6 pl-ziro">
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" class="form-control" name="expYear" placeholder="YY" required data-stripe="exp_year" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-4 col-md-6 pull-right nopadding">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="cvCode">CV CODE</label>
|
||||||
|
<input type="password" class="form-control" name="cvCode" placeholder="CV" required data-stripe="cvc" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<button class="btn btn-success btn-lg btn-block" type="submit">Purchase membership</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row" style="display:none;">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<p class="payment-errors"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if paymentError %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<p>
|
||||||
|
{% bootstrap_alert paymentError alert_type='danger' %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-4 col-lg-4 wow fadeInDown">
|
||||||
|
<div class="order-summary">
|
||||||
|
<div class="header text-center">
|
||||||
|
<h2 class="order-name">Order Summary</h2>
|
||||||
|
</div>
|
||||||
|
<div class="order-box">
|
||||||
|
<h2 class="col-xs-6 order-item">Digital Glarus Membership</h2>
|
||||||
|
<br>
|
||||||
|
<h2 class="col-xs-6 order-duration">valid 2016.09.08 - 2016.10.08</h2>
|
||||||
|
<h2 class="order-person">1 person</h2>
|
||||||
|
<h2 class="col-xs-6 payment-total">Today's Total</h2>
|
||||||
|
<h2 class="order-sum">0.00CHF</h2>
|
||||||
|
<hr class="greyline">
|
||||||
|
<h2 class="col-xs-6 payment-total">Total</h2>
|
||||||
|
<h2 class="order-result">35CHF</h2>
|
||||||
|
<div class="text-center">
|
||||||
|
<label class="custom-control custom-checkbox">
|
||||||
|
<input type="checkbox" class="custom-control-input">
|
||||||
|
<span class="custom-control-indicator"></span>
|
||||||
|
<span class="custom-control-description">I accept the Digital Glarus <a href=#>Terms and Conditions</a>, <a href=#>Community Guidelines</a> and <a href=#>Privacy Policy</a></span>
|
||||||
|
</label>
|
||||||
|
<div class="button-box">
|
||||||
|
<button type="submit" class="btn btn-primary">Continue to Review</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="button-box">
|
||||||
|
<p class="order-bottom-text">You can checkout on the next page</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<section id="contact">
|
||||||
|
<div class="fill">
|
||||||
|
<div class="row" class="wow fadeInDown">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown">
|
||||||
|
<div class="col-md-4 map-title">
|
||||||
|
Digital Glarus<br>
|
||||||
|
<span class="map-caption">In der Au 7 Schwanden 8762 Switzerland
|
||||||
|
<br>info@digitalglarus.ch
|
||||||
|
<br>
|
||||||
|
(044) 534-66-22
|
||||||
|
<p> </p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p> </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- stripe key data -->
|
||||||
|
{% if stripe_key %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
(function () {window.stripeKey = "{{stripe_key}}";})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{%endif%}
|
||||||
|
|
||||||
|
{% endblock %}
|
57
digitalglarus/templates/digitalglarus/reset_password.html
Normal file
57
digitalglarus/templates/digitalglarus/reset_password.html
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{% extends "new_base_glarus.html" %}
|
||||||
|
{% load staticfiles cms_tags bootstrap3%}
|
||||||
|
{% block title %}crowdfunding{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<section id="price">
|
||||||
|
<div class="signup-container">
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"> </div>
|
||||||
|
<div class="col-xs-12 col-sm-6 col-lg-4 text-center wow fadeInDown">
|
||||||
|
<div class="payment-box">
|
||||||
|
<h2 class="billing-head">Reset Password</h2>
|
||||||
|
<hr class="greyline-long">
|
||||||
|
<h2 class="membership-lead">To have your password reset, enter your email address below.
|
||||||
|
We will then send an email containing a link to reset your password.</h2>
|
||||||
|
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form action="{% url 'digitalglarus:reset_password' %}" method="post" class="form" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% for field in form %}
|
||||||
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
|
{% endfor %}
|
||||||
|
<p>{{form.non_field_errors|striptags}}</p>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-primary btn-blue">Send Email</button>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<div class="notice-box">
|
||||||
|
<p class="order-bottom-text">Still have trouble? Contact us for technical support.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact">
|
||||||
|
<div class="fill">
|
||||||
|
<div class="row" class="wow fadeInDown">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown">
|
||||||
|
<div class="col-md-4 map-title">
|
||||||
|
Digital Glarus<br>
|
||||||
|
<span class="map-caption">In der Au 7 Schwanden 8762 Switzerland
|
||||||
|
<br>info@digitalglarus.ch
|
||||||
|
<br>
|
||||||
|
(044) 534-66-22
|
||||||
|
<p> </p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p> </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
59
digitalglarus/templates/digitalglarus/signup.html
Normal file
59
digitalglarus/templates/digitalglarus/signup.html
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{% extends "new_base_glarus.html" %}
|
||||||
|
{% load staticfiles cms_tags bootstrap3%}
|
||||||
|
{% block title %}crowdfunding{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<section id="price">
|
||||||
|
<div class="signup-container">
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"> </div>
|
||||||
|
<div class="col-xs-12 col-sm-6 col-lg-4 text-center wow fadeInDown">
|
||||||
|
<div class="signup-box">
|
||||||
|
<span class="glyphicon glyphicon-plus"></span>
|
||||||
|
<h2 class="section-heading">Sign up</h2>
|
||||||
|
<h2 class="signup-lead">Start coworking at Digital Glarus! <br> Membership costs only
|
||||||
|
<strong>35CHF</strong> per month.<br> 2 free working days included!</h2>
|
||||||
|
<hr class="primary">
|
||||||
|
|
||||||
|
<div class="signup-form form-group row">
|
||||||
|
<form action="{% url 'digitalglarus:signup' %}" method="post" class="form" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="" value="{{ request.GET.next }}">
|
||||||
|
{% for field in form %}
|
||||||
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
|
{% endfor %}
|
||||||
|
<p>{{form.non_field_errors|striptags}}</p>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-primary btn-blue">Signup</button>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<div class="notice-box">
|
||||||
|
<p class="signup-text">Already a member?<a href=#login>Log in</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-3 col-lg-4 text-center wow fadeInDown"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact">
|
||||||
|
<div class="fill">
|
||||||
|
<div class="row" class="wow fadeInDown">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown">
|
||||||
|
<div class="col-md-4 map-title">
|
||||||
|
Digital Glarus<br>
|
||||||
|
<span class="map-caption">In der Au 7 Schwanden 8762 Switzerland
|
||||||
|
<br>info@digitalglarus.ch
|
||||||
|
<br>
|
||||||
|
(044) 534-66-22
|
||||||
|
<p> </p>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p> </p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
|
@ -1,6 +1,5 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load bootstrap3 %}
|
{% load staticfiles cms_tags menu_tags sekizai_tags menu_tags bootstrap3 %}
|
||||||
{% load staticfiles cms_tags menu_tags sekizai_tags menu_tags %}
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
@ -25,6 +24,7 @@
|
||||||
<link href="{% static 'digitalglarus/css/agency.css' %}" rel="stylesheet">
|
<link href="{% static 'digitalglarus/css/agency.css' %}" rel="stylesheet">
|
||||||
<link href="{% static 'digitalglarus/css/ungleich.css' %}" rel="stylesheet">
|
<link href="{% static 'digitalglarus/css/ungleich.css' %}" rel="stylesheet">
|
||||||
<link href="{% static 'digitalglarus/css/history.css' %}" rel="stylesheet">
|
<link href="{% static 'digitalglarus/css/history.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'digitalglarus/css/price.css' %}" rel="stylesheet">
|
||||||
<!-- <link href="css/bootstrap.min.css" rel="stylesheet"> -->
|
<!-- <link href="css/bootstrap.min.css" rel="stylesheet"> -->
|
||||||
<link href="{% static 'digitalglarus/css/lib/animate.min.css' %}" rel="stylesheet">
|
<link href="{% static 'digitalglarus/css/lib/animate.min.css' %}" rel="stylesheet">
|
||||||
<!-- <link href="{% static 'css/membership.css' %}" rel="stylesheet"> -->
|
<!-- <link href="{% static 'css/membership.css' %}" rel="stylesheet"> -->
|
||||||
|
@ -135,16 +135,25 @@
|
||||||
<script type="text/javascript" src="{% static 'digitalglarus/bower_components/jquery/dist/jquery.min.js' %}"></script>
|
<script type="text/javascript" src="{% static 'digitalglarus/bower_components/jquery/dist/jquery.min.js' %}"></script>
|
||||||
|
|
||||||
<!-- jQuery -->
|
<!-- jQuery -->
|
||||||
<script src="{% static 'digitalglarus/js/jquery.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/jquery.js' %}"></script>
|
||||||
|
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.validation/1.13.1/jquery.validate.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<!-- Bootstrap Core JavaScript -->
|
<!-- Bootstrap Core JavaScript -->
|
||||||
<script src="{% static 'digitalglarus/js/bootstrap.min.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/bootstrap.min.js' %}"></script>
|
||||||
|
|
||||||
|
|
||||||
<!-- Plugin JavaScript -->
|
<!-- Plugin JavaScript -->
|
||||||
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
|
||||||
<script src="{% static 'digitalglarus/js/classie.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/classie.js' %}"></script>
|
||||||
<script src="{% static 'digitalglarus/js/cbpAnimatedHeader.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/cbpAnimatedHeader.js' %}"></script>
|
||||||
|
|
||||||
|
<!-- Stripe Lib -->
|
||||||
|
<script type="text/javascript" src="//js.stripe.com/v2/"></script>
|
||||||
|
|
||||||
|
<!-- Proccess payment lib -->
|
||||||
|
<script src="{% static 'digitalglarus/js/payment.js' %}"></script>
|
||||||
|
|
||||||
<!-- Contact Form JavaScript -->
|
<!-- Contact Form JavaScript -->
|
||||||
<script src="{% static 'digitalglarus/js/jqBootstrapValidation.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/jqBootstrapValidation.js' %}"></script>
|
||||||
|
|
||||||
|
@ -156,6 +165,8 @@
|
||||||
|
|
||||||
<script src="{% static 'digitalglarus/js/ungleich.js' %}"></script>
|
<script src="{% static 'digitalglarus/js/ungleich.js' %}"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Custom Fonts -->
|
<!-- Custom Fonts -->
|
||||||
<link href="//fonts.googleapis.com/css?family=Raleway" rel="stylesheet" type="text/css">
|
<link href="//fonts.googleapis.com/css?family=Raleway" rel="stylesheet" type="text/css">
|
||||||
<link href="{% static 'digitalglarus/font-awesome-4.1.0/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
<link href="{% static 'digitalglarus/font-awesome-4.1.0/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||||
|
|
|
@ -2,14 +2,20 @@ from django.conf.urls import url
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
from .views import ContactView, IndexView, AboutView, HistoryView
|
from .views import ContactView, IndexView, AboutView, HistoryView, LoginView, SignupView,\
|
||||||
from membership.views import LoginRegistrationView
|
PasswordResetView, PasswordResetConfirmView, MembershipPaymentView
|
||||||
|
# from membership.views import LoginRegistrationView
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(_(r'^$'), IndexView.as_view(), name='landing'),
|
url(_(r'^$'), IndexView.as_view(), name='landing'),
|
||||||
url(_(r'contact/?$'), ContactView.as_view(), name='contact'),
|
url(_(r'contact/?$'), ContactView.as_view(), name='contact'),
|
||||||
url(_(r'login/?$'), LoginRegistrationView.as_view(), name='login'),
|
url(_(r'login/?$'), LoginView.as_view(), name='login'),
|
||||||
|
url(_(r'signup/?$'), SignupView.as_view(), name='signup'),
|
||||||
|
url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
|
||||||
|
url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
|
||||||
|
PasswordResetConfirmView.as_view(), name='reset_password_confirm'),
|
||||||
url(_(r'history/?$'), HistoryView.as_view(), name='history'),
|
url(_(r'history/?$'), HistoryView.as_view(), name='history'),
|
||||||
|
url(_(r'membership/payment?$'), MembershipPaymentView.as_view(), name='membership_payment'),
|
||||||
url(_(r'supporters/?$'), views.supporters, name='supporters'),
|
url(_(r'supporters/?$'), views.supporters, name='supporters'),
|
||||||
url(r'calendar_api/(?P<month>\d+)/(?P<year>\d+)?$', views.CalendarApi.as_view(),name='calendar_api_1'),
|
url(r'calendar_api/(?P<month>\d+)/(?P<year>\d+)?$', views.CalendarApi.as_view(),name='calendar_api_1'),
|
||||||
url(r'calendar_api/', views.CalendarApi.as_view(),name='calendar_api'),
|
url(r'calendar_api/', views.CalendarApi.as_view(),name='calendar_api'),
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
import json
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.shortcuts import get_object_or_404, render
|
from django.shortcuts import get_object_or_404, render
|
||||||
from django.forms import ModelForm
|
from django.forms import ModelForm
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.core.urlresolvers import reverse_lazy
|
from django.core.urlresolvers import reverse_lazy, reverse
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.utils.translation import get_language
|
from django.utils.translation import get_language
|
||||||
from djangocms_blog.models import Post
|
from djangocms_blog.models import Post
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
@ -16,11 +19,117 @@ from .models import Supporter
|
||||||
from utils.forms import ContactUsForm
|
from utils.forms import ContactUsForm
|
||||||
from django.views.generic.edit import FormView
|
from django.views.generic.edit import FormView
|
||||||
from membership.calendar.calendar import BookCalendar
|
from membership.calendar.calendar import BookCalendar
|
||||||
from membership.models import Calendar as CalendarModel
|
from membership.models import Calendar as CalendarModel, CustomUser, StripeCustomer
|
||||||
import json
|
|
||||||
from django.contrib.auth import logout
|
|
||||||
|
|
||||||
|
|
||||||
|
from utils.views import LoginViewMixin, SignupViewMixin, \
|
||||||
|
PasswordResetViewMixin, PasswordResetConfirmViewMixin
|
||||||
|
from utils.forms import PasswordResetRequestForm
|
||||||
|
from utils.stripe_utils import StripeUtils
|
||||||
|
|
||||||
|
|
||||||
|
from .forms import LoginForm, SignupForm, MembershipBillingForm
|
||||||
|
from .models import MembershipType
|
||||||
|
|
||||||
|
|
||||||
|
class IndexView(TemplateView):
|
||||||
|
template_name = "digitalglarus/old_index.html"
|
||||||
|
|
||||||
|
|
||||||
|
class LoginView(LoginViewMixin):
|
||||||
|
template_name = "digitalglarus/login.html"
|
||||||
|
form_class = LoginForm
|
||||||
|
success_url = reverse_lazy('digitalglarus:landing')
|
||||||
|
|
||||||
|
|
||||||
|
class SignupView(SignupViewMixin):
|
||||||
|
template_name = "digitalglarus/signup.html"
|
||||||
|
form_class = SignupForm
|
||||||
|
success_url = reverse_lazy('digitalglarus:login')
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetView(PasswordResetViewMixin):
|
||||||
|
template_name = 'digitalglarus/reset_password.html'
|
||||||
|
success_url = reverse_lazy('digitalglarus:login')
|
||||||
|
form_class = PasswordResetRequestForm
|
||||||
|
template_email_path = 'digitalglarus/emails/'
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
||||||
|
template_name = 'digitalglarus/confirm_reset_password.html'
|
||||||
|
success_url = reverse_lazy('digitalglarus:login')
|
||||||
|
|
||||||
|
|
||||||
|
class HistoryView(TemplateView):
|
||||||
|
template_name = "digitalglarus/history.html"
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(HistoryView, self).get_context_data(**kwargs)
|
||||||
|
supporters = Supporter.objects.all()
|
||||||
|
context.update({
|
||||||
|
'supporters': supporters
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class MembershipPaymentView(LoginRequiredMixin, FormView):
|
||||||
|
template_name = "digitalglarus/membership_payment.html"
|
||||||
|
login_url = reverse_lazy('digitalglarus:login')
|
||||||
|
form_class = MembershipBillingForm
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
membership_type = MembershipType.objects.get(name='standard')
|
||||||
|
form_kwargs = super(MembershipPaymentView, self).get_form_kwargs()
|
||||||
|
form_kwargs.update({
|
||||||
|
'initial': {'membership_type': membership_type.id}
|
||||||
|
})
|
||||||
|
return form_kwargs
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(MembershipPaymentView, self).get_context_data(**kwargs)
|
||||||
|
context.update({
|
||||||
|
'stripe_key': settings.STRIPE_API_PUBLIC_KEY
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
import pdb;pdb.set_trace()
|
||||||
|
form = self.get_form()
|
||||||
|
|
||||||
|
if form.is_valid():
|
||||||
|
data = form.cleaned_data
|
||||||
|
context = self.get_context_data()
|
||||||
|
token = data.get('token')
|
||||||
|
membership_type = data.get('membership_type')
|
||||||
|
|
||||||
|
# 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=membership_type.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(request, self.template_name, context)
|
||||||
|
|
||||||
|
charge = charge_response.get('response_object')
|
||||||
|
else:
|
||||||
|
return self.form_invalid(form)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
############## OLD VIEWS
|
||||||
class CalendarApi(View):
|
class CalendarApi(View):
|
||||||
def get(self,request,month,year):
|
def get(self,request,month,year):
|
||||||
calendar = BookCalendar(request.user,requested_month=month).formatmonth(int(year),int(month))
|
calendar = BookCalendar(request.user,requested_month=month).formatmonth(int(year),int(month))
|
||||||
|
@ -46,21 +155,6 @@ class ContactView(FormView):
|
||||||
return super(ContactView, self).form_valid(form)
|
return super(ContactView, self).form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class IndexView(TemplateView):
|
|
||||||
template_name = "digitalglarus/old_index.html"
|
|
||||||
|
|
||||||
|
|
||||||
class HistoryView(TemplateView):
|
|
||||||
template_name = "digitalglarus/history.html"
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super(HistoryView, self).get_context_data(**kwargs)
|
|
||||||
supporters = Supporter.objects.all()
|
|
||||||
context.update({
|
|
||||||
'supporters': supporters
|
|
||||||
})
|
|
||||||
return context
|
|
||||||
|
|
||||||
|
|
||||||
class AboutView(TemplateView):
|
class AboutView(TemplateView):
|
||||||
template_name = "digitalglarus/about.html"
|
template_name = "digitalglarus/about.html"
|
||||||
|
|
|
@ -56,7 +56,7 @@ $( document ).ready(function() {
|
||||||
|
|
||||||
//set token on a hidden input
|
//set token on a hidden input
|
||||||
$('#id_token').val(token);
|
$('#id_token').val(token);
|
||||||
$('#donation-form').submit();
|
$('#billing-form').submit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ from stored_messages.api import mark_read
|
||||||
from membership.models import CustomUser, StripeCustomer
|
from membership.models import CustomUser, StripeCustomer
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
from utils.forms import BillingAddressForm, PasswordResetRequestForm
|
from utils.forms import BillingAddressForm, PasswordResetRequestForm
|
||||||
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin
|
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
|
||||||
from utils.mailer import BaseEmail
|
from utils.mailer import BaseEmail
|
||||||
from .models import VirtualMachineType, VirtualMachinePlan, HostingOrder
|
from .models import VirtualMachineType, VirtualMachinePlan, HostingOrder
|
||||||
from .forms import HostingUserSignupForm, HostingUserLoginForm
|
from .forms import HostingUserSignupForm, HostingUserLoginForm
|
||||||
|
@ -137,31 +137,10 @@ class IndexView(View):
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
||||||
class LoginView(FormView):
|
class LoginView(LoginViewMixin):
|
||||||
template_name = 'hosting/login.html'
|
template_name = "hosting/login.html"
|
||||||
success_url = reverse_lazy('hosting:orders')
|
|
||||||
form_class = HostingUserLoginForm
|
form_class = HostingUserLoginForm
|
||||||
moodel = CustomUser
|
success_url = reverse_lazy('hosting:orders')
|
||||||
|
|
||||||
def get_success_url(self):
|
|
||||||
next_url = self.request.session.get('next', self.success_url)
|
|
||||||
return next_url
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
|
||||||
email = form.cleaned_data.get('email')
|
|
||||||
password = form.cleaned_data.get('password')
|
|
||||||
auth_user = authenticate(email=email, password=password)
|
|
||||||
|
|
||||||
if auth_user:
|
|
||||||
login(self.request, auth_user)
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
|
||||||
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
if self.request.user.is_authenticated():
|
|
||||||
return HttpResponseRedirect(reverse('hosting:notifications'))
|
|
||||||
return super(LoginView, self).get(request, *args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class SignupView(CreateView):
|
class SignupView(CreateView):
|
||||||
|
@ -196,32 +175,6 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
||||||
template_name = 'hosting/confirm_reset_password.html'
|
template_name = 'hosting/confirm_reset_password.html'
|
||||||
success_url = reverse_lazy('hosting:login')
|
success_url = reverse_lazy('hosting:login')
|
||||||
|
|
||||||
# def post(self, request, uidb64=None, token=None, *arg, **kwargs):
|
|
||||||
# try:
|
|
||||||
# uid = urlsafe_base64_decode(uidb64)
|
|
||||||
# user = CustomUser.objects.get(pk=uid)
|
|
||||||
# except (TypeError, ValueError, OverflowError, CustomUser.DoesNotExist):
|
|
||||||
# user = None
|
|
||||||
|
|
||||||
# form = self.form_class(request.POST)
|
|
||||||
|
|
||||||
# if user is not None and default_token_generator.check_token(user, token):
|
|
||||||
# if form.is_valid():
|
|
||||||
# new_password = form.cleaned_data['new_password2']
|
|
||||||
# user.set_password(new_password)
|
|
||||||
# user.save()
|
|
||||||
# messages.success(request, 'Password has been reset.')
|
|
||||||
# return self.form_valid(form)
|
|
||||||
# else:
|
|
||||||
# messages.error(request, 'Password reset has not been unsuccessful.')
|
|
||||||
# form.add_error(None, 'Password reset has not been unsuccessful.')
|
|
||||||
# return self.form_invalid(form)
|
|
||||||
|
|
||||||
# else:
|
|
||||||
# messages.error(request, 'The reset password link is no longer valid.')
|
|
||||||
# form.add_error(None, 'Password reset has not been unsuccessful.')
|
|
||||||
# return self.form_invalid(form)
|
|
||||||
|
|
||||||
|
|
||||||
class NotificationsView(LoginRequiredMixin, TemplateView):
|
class NotificationsView(LoginRequiredMixin, TemplateView):
|
||||||
template_name = 'hosting/notifications.html'
|
template_name = 'hosting/notifications.html'
|
||||||
|
|
|
@ -4,19 +4,6 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
|
|
||||||
.navbar-default {
|
|
||||||
background-color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
section.login {
|
|
||||||
margin-top: 10%;
|
|
||||||
margin-bottom: 8%;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<section class="login">
|
<section class="login">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
from django.views.generic import TemplateView, CreateView, FormView, DetailView, UpdateView,\
|
from django.views.generic import TemplateView, FormView, DetailView, UpdateView,\
|
||||||
ListView
|
ListView
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.core.urlresolvers import reverse_lazy, reverse
|
from django.core.urlresolvers import reverse_lazy, reverse
|
||||||
from django.contrib.auth import authenticate, login
|
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
|
||||||
|
|
||||||
from membership.models import CustomUser, StripeCustomer
|
from membership.models import StripeCustomer
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin
|
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin,\
|
||||||
|
SignupViewMixin
|
||||||
from utils.forms import PasswordResetRequestForm
|
from utils.forms import PasswordResetRequestForm
|
||||||
from utils.mailer import BaseEmail
|
from utils.mailer import BaseEmail
|
||||||
|
|
||||||
|
@ -36,53 +36,16 @@ class LandingView(TemplateView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class LoginView(FormView):
|
class LoginView(LoginViewMixin):
|
||||||
template_name = "nosystemd/login.html"
|
template_name = "nosystemd/login.html"
|
||||||
form_class = LoginForm
|
form_class = LoginForm
|
||||||
success_url = reverse_lazy('nosystemd:landing')
|
success_url = reverse_lazy('nosystemd:landing')
|
||||||
|
|
||||||
def get_success_url(self):
|
|
||||||
next_url = self.request.session.get('next', self.success_url)
|
|
||||||
return next_url
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
class SignupView(SignupViewMixin):
|
||||||
email = form.cleaned_data.get('email')
|
template_name = "nosystemd/signup.html"
|
||||||
password = form.cleaned_data.get('password')
|
|
||||||
auth_user = authenticate(email=email, password=password)
|
|
||||||
|
|
||||||
if auth_user:
|
|
||||||
login(self.request, auth_user)
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
|
||||||
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
|
|
||||||
if self.request.user.is_authenticated():
|
|
||||||
return HttpResponseRedirect(reverse('nosystemd:landing'))
|
|
||||||
|
|
||||||
return super(LoginView, self).get(request, *args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class SignupView(CreateView):
|
|
||||||
template_name = 'nosystemd/signup.html'
|
|
||||||
model = CustomUser
|
|
||||||
form_class = SignupForm
|
form_class = SignupForm
|
||||||
|
success_url = reverse_lazy('nosystemd:landing')
|
||||||
def get_success_url(self):
|
|
||||||
next_url = self.request.POST.get('next', reverse('nosystemd:login'))
|
|
||||||
return next_url
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
|
||||||
name = form.cleaned_data.get('name')
|
|
||||||
email = form.cleaned_data.get('email')
|
|
||||||
password = form.cleaned_data.get('password')
|
|
||||||
|
|
||||||
CustomUser.register(name, password, email)
|
|
||||||
auth_user = authenticate(email=email, password=password)
|
|
||||||
login(self.request, auth_user)
|
|
||||||
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetView(PasswordResetViewMixin):
|
class PasswordResetView(PasswordResetViewMixin):
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
from django.views.generic import FormView
|
from django.views.generic import FormView, CreateView
|
||||||
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.contrib.auth import authenticate, login
|
||||||
|
|
||||||
from membership.models import CustomUser
|
from membership.models import CustomUser
|
||||||
|
|
||||||
|
@ -12,6 +12,52 @@ from .mailer import BaseEmail
|
||||||
from .forms import SetPasswordForm
|
from .forms import SetPasswordForm
|
||||||
|
|
||||||
|
|
||||||
|
class SignupViewMixin(CreateView):
|
||||||
|
model = CustomUser
|
||||||
|
success_url = None
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
next_url = self.request.POST.get('next', self.success_url)
|
||||||
|
return next_url
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
name = form.cleaned_data.get('name')
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
password = form.cleaned_data.get('password')
|
||||||
|
|
||||||
|
CustomUser.register(name, password, email)
|
||||||
|
auth_user = authenticate(email=email, password=password)
|
||||||
|
login(self.request, auth_user)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
|
||||||
|
class LoginViewMixin(FormView):
|
||||||
|
success_url = None
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
next_url = self.request.session.get('next', self.success_url)
|
||||||
|
return next_url
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
password = form.cleaned_data.get('password')
|
||||||
|
auth_user = authenticate(email=email, password=password)
|
||||||
|
|
||||||
|
if auth_user:
|
||||||
|
login(self.request, auth_user)
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
|
||||||
|
if self.request.user.is_authenticated():
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
return super(LoginViewMixin, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetViewMixin(FormView):
|
class PasswordResetViewMixin(FormView):
|
||||||
# template_name = 'hosting/reset_password.html'
|
# template_name = 'hosting/reset_password.html'
|
||||||
# form_class = PasswordResetRequestForm
|
# form_class = PasswordResetRequestForm
|
||||||
|
@ -72,11 +118,11 @@ class PasswordResetConfirmViewMixin(FormView):
|
||||||
messages.success(request, 'Password has been reset.')
|
messages.success(request, 'Password has been reset.')
|
||||||
return self.form_valid(form)
|
return self.form_valid(form)
|
||||||
else:
|
else:
|
||||||
messages.error(request, 'Password reset has not been unsuccessful.')
|
messages.error(request, 'Password reset has not been successful.')
|
||||||
form.add_error(None, 'Password reset has not been unsuccessful.')
|
form.add_error(None, 'Password reset has not been successful.')
|
||||||
return self.form_invalid(form)
|
return self.form_invalid(form)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
messages.error(request, 'The reset password link is no longer valid.')
|
messages.error(request, 'The reset password link is no longer valid.')
|
||||||
form.add_error(None, 'Password reset has not been unsuccessful.')
|
form.add_error(None, 'The reset password link is no longer valid.')
|
||||||
return self.form_invalid(form)
|
return self.form_invalid(form)
|
||||||
|
|
Loading…
Reference in a new issue