test
This commit is contained in:
parent
6bb092a101
commit
e7f11e9556
38 changed files with 416 additions and 1365 deletions
14
membership/forms.py
Normal file
14
membership/forms.py
Normal 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'}))
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 473 KiB After Width: | Height: | Size: 473 KiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
25
membership/templates/validated.html
Normal file
25
membership/templates/validated.html
Normal 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
10
membership/urls.py
Normal 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')
|
||||
)
|
||||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue