This commit is contained in:
Tomislav R 2016-03-07 17:49:02 +01:00
commit e7f11e9556
38 changed files with 416 additions and 1365 deletions

14
membership/forms.py Normal file
View file

@ -0,0 +1,14 @@
__author__ = 'tomislav'
from django import forms
class LoginForm(forms.Form):
email = forms.EmailField(label="Email address", max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter email'}))
password = forms.CharField(label='Password', max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Password','type':'password'}))
class RegisterForm(LoginForm):
name = forms.CharField(label='Name', max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder':'Enter name'}))

View file

@ -1,3 +1,109 @@
from django.db import models
from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager
from django.contrib.auth.hashers import make_password
from django.core.mail import send_mail
# Create your models here.
REGISTRATION_MESSAGE = {'subject': "Validation mail",
'message': 'Please validate Your account under this link http://localhost:8000/en-us/validate/{}',
'from': 'test@test.com'}
class MyUserManager(BaseUserManager):
def create_user(self, email, name, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
name=name
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, name, password):
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(email,
password=password,
name=name
)
user.is_admin = True
user.save(using=self._db)
return user
class CustomUser(AbstractBaseUser):
VALIDATED_CHOICES = ((0, 'Not validated'), (1, 'Validated'))
name = models.CharField(max_length=50)
email = models.EmailField(unique=True)
validated = models.IntegerField(choices=VALIDATED_CHOICES, default=0)
validation_slug = models.CharField(db_index=True, unique=True, max_length=50)
objects = MyUserManager()
USERNAME_FIELD = "email"
@classmethod
def register(cls, name, password, email):
user = cls.objects.filter(email=email).first()
if not user:
user = cls.objects.create_user(username=name, email=email, password=password)
if user:
user.validation_slug = make_password(None)
send_mail(REGISTRATION_MESSAGE['subject'], REGISTRATION_MESSAGE['message'].format(user.validation_slug),
REGISTRATION_MESSAGE['from'], [user.email], fail_silently=False)
return user
else:
return None
else:
return None
@classmethod
def validate_url(cls, validation_slug):
user = cls.objects.filter(validation_slug=validation_slug).first()
if user:
user.validated = 1
return True
return False
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __str__(self): # __unicode__ on Python 2
return self.email
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
# class CreditCards(models.Model):
# id = models.IntegerField(primary_key=True)
# user_id = models.ForeignKey(User, on_delete=models.CASCADE)
# number = models.CharField(max_length=400)

View file

Before

Width:  |  Height:  |  Size: 473 KiB

After

Width:  |  Height:  |  Size: 473 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Before After
Before After

View file

@ -1,44 +1,50 @@
<html><head>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href="membership.css" rel="stylesheet" type="text/css">
</head><body>
<div class="section">
<div class="container">
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"
type="text/css">
{% load static %}
<link href="{% get_static_prefix %}membership.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="section">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1 class="text-center">Oops! Something went wrong..</h1>
</div>
<div class="col-md-12">
<h1 class="text-center">Oops! Something went wrong..</h1>
</div>
</div>
<div class="row">
<div class="col-md-12">
<p class="text-center">Your last action was not complete.
<br>Have problems? contact us at
<a href="">help@digitalglarus.ch</a>
</p>
<p></p>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
<div class="col-md-12">
<p class="text-center">Your last action was not complete.
<br>Have problems? contact us at
<a href="">help@digitalglarus.ch</a>
</p>
<p></p>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
</div>
<div class="row">
<div class="col-md-12 text-center">
<a class="btn btn-primary">Back</a>
</div>
<div class="col-md-12 text-center">
<a class="btn btn-primary">Back</a>
</div>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
</a>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
</div>
<a hrefhelp@digitalglarus.ch<="" p="">
</a>
</body></html>
</body>
</html>

View file

@ -1,109 +1,122 @@
<html><head>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href="membership.css" rel="stylesheet" type="text/css">
</head><body>
<div class="navbar navbar-default navbar-static-top">
<div class="container">
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"
type="text/css">
{% load static %}
<link href="{% get_static_prefix %}membership.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-ex-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"><span>Brand</span></a>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-ex-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"><span>Brand</span></a>
</div>
<div class="collapse navbar-collapse" id="navbar-ex-collapse">
<ul class="nav navbar-nav navbar-right">
<li class="active">
<a href="#">Home</a>
</li>
<li>
<a href="#">Contacts</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="active">
<a href="#">Home</a>
</li>
<li>
<a href="#">Contacts</a>
</li>
</ul>
</div>
</div>
</div>
<div class="section">
<div class="container">
</div>
<div class="section">
<div class="container">
<div class="row">
<div class="col-md-6">
<h1>I'm already a member!</h1>
<p>To book you need to be logged in.</p>
<h2>Log in</h2>
<hr>
<form role="form">
<div class="form-group">
<label class="control-label" for="exampleInputEmail1">Email address</label>
<input class="form-control" id="exampleInputEmail1" placeholder="Enter email" type="email">
</div>
<div class="form-group">
<label class="control-label" for="exampleInputPassword1">Password</label>
<input class="form-control" id="exampleInputPassword1" placeholder="Password" type="password">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
<div class="col-md-6">
<h1></h1>
<h1>Not yet a member?</h1>
<p>It only takes your email to register!
You'll get a mail from us for confirmation.</p>
<h2>Register</h2>
<hr>
<form role="form">
<div class="form-group">
<label class="control-label" for="exampleInputEmail1">Name</label>
<input class="form-control" id="exampleInputEmail1" placeholder="Enter name" type="text">
</div>
<div class="form-group">
<label class="control-label" for="exampleInputPassword1">Email address</label>
<input class="form-control" id="exampleInputPassword1" placeholder="Enter email" type="email">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
</div>
</div>
</div>
<footer class="section section-primary">
<div class="container">
<div class="row">
<div class="col-sm-6">
<h1>Digital Glarus</h1>
<p>In der Au 7 8762 Schwanden
<br>Copyright © ungleich GmbH 2016</p>
</div>
<div class="col-sm-6">
<p class="text-info text-right">
<br>
<br>
</p>
<div class="row">
<div class="col-md-12 hidden-lg hidden-md hidden-sm text-left">
<a href="#"><i class="fa fa-3x fa-fw fa-instagram text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-twitter text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-facebook text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-github text-inverse"></i></a>
</div>
</div>
<div class="row">
<div class="col-md-12 hidden-xs text-right">
<a href="#"><i class="fa fa-3x fa-fw fa-instagram text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-twitter text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-facebook text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-github text-inverse"></i></a>
</div>
</div>
</div>
</div>
</div>
</footer>
<div class="col-md-6">
<h1>I'm already a member!</h1>
</body></html>
<p>To book you need to be logged in.</p>
<h2>Log in</h2>
<hr>
<form role="form" action="" method="POST">
{% csrf_token %}
{% for field in login_form %}
<div class="form-group">
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>{{ field }}
</div>
{% endfor %}
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
<div class="col-md-6">
<h1></h1>
<h1>Not yet a member?</h1>
<p>It only takes your email to register!
You'll get a mail from us for confirmation.</p>
<h2>Register</h2>
<hr>
<form role="form" action="" method="POST">
{% csrf_token %}
<div class="form-group">
{% for field in register_form %}
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>
{{ field }}
{% endfor %}
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
</div>
</div>
</div>
<footer class="section section-primary">
<div class="container">
<div class="row">
<div class="col-sm-6">
<h1>Digital Glarus</h1>
<p>In der Au 7 8762 Schwanden
<br>Copyright © ungleich GmbH 2016</p>
</div>
<div class="col-sm-6">
<p class="text-info text-right">
<br>
<br>
</p>
<div class="row">
<div class="col-md-12 hidden-lg hidden-md hidden-sm text-left">
<a href="#"><i class="fa fa-3x fa-fw fa-instagram text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-twitter text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-facebook text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-github text-inverse"></i></a>
</div>
</div>
<div class="row">
<div class="col-md-12 hidden-xs text-right">
<a href="#"><i class="fa fa-3x fa-fw fa-instagram text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-twitter text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-facebook text-inverse"></i></a>
<a href="#"><i class="fa fa-3x fa-fw fa-github text-inverse"></i></a>
</div>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -4,7 +4,8 @@
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href="membership.css" rel="stylesheet" type="text/css">
{% load static %}
<link href="{% get_static_prefix %}membership.css" rel="stylesheet" type="text/css">
</head><body>
<div class="cover">
<div class="navbar">
@ -30,7 +31,9 @@
</div>
</div>
</div>
<div class="cover-image" style="background-image : url('photo-1418479631014-8cbf89db3431 2.jpg')"></div>
{% load static %}
<div class="cover-image" style="background-image : url('{% get_static_prefix %}photo-1418479631014-8cbf89db3431 2.jpg')"></div>
<div class="container">
<div class="row">
<div class="col-md-12 text-center">

View file

@ -0,0 +1,25 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"
type="text/css">
<link href="http://pingendo.github.io/pingendo-bootstrap/themes/default/bootstrap.css" rel="stylesheet"
type="text/css">
</head>
<body>
<div class="section">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1 class="text-center text-muted">You're successfully validated!</h1>
</div>
</div>
</div>
</div>
</body>
</html>

10
membership/urls.py Normal file
View file

@ -0,0 +1,10 @@
__author__ = 'tomislav'
from django.conf.urls import url
from . import views
urlpatterns = (
url(r"^/$", views.LoginRegistrationView.as_view()),
url(r"^/validate/(?P<validate_slug>.*)/$", views.validate_email),
url(r"^/membership/$",views.MembershipView.as_view(),name='membership')
)

View file

@ -1,3 +1,45 @@
from django.shortcuts import render
from django.shortcuts import render, redirect
from django.views.generic import View
# Create your views here.
from .models import CustomUser
from .forms import LoginForm, RegisterForm
def validate_email(request, validate_slug):
validated = User.validate_url(validate_slug)
if validated:
return render(request,'templates/validated.html')
else:
return render(request,'templates/error.html')
class LoginRegistrationView(View):
def get(self, request):
login_form = LoginForm()
register_form = RegisterForm()
if request.user.is_authenticated():
return redirect("membership")
else:
return render(request, 'templates/login.html', {'login_form': login_form, 'register_form': register_form})
def post(self, request):
email = request.POST.get('email')
password = request.POST.get('password')
name = request.POST.get('name')
if name and email and password:
user = CustomUser.register(name, password,email)
if user:
return render(request, 'templates/success.html')
else:
return render(request, 'templates/error.html')
elif email and password and not name:
user = CustomUser.authenticate(email, password)
if user:
return redirect('membership')
else:
return render(request, 'templates/login', {'msg': 'Wrong username or password'})
class MembershipView(View):
def get(self,request):
return render(request,'templates/membership.html')