From 4f968e5d1c18f4719e1db063a4a3978858adeef7 Mon Sep 17 00:00:00 2001 From: michigg Date: Sun, 29 Oct 2017 11:53:52 +0100 Subject: [PATCH] kp --- .../registration/__init__.py} | 0 ofu_app/apps/registration/admin.py | 3 ++ ofu_app/apps/registration/apps.py | 5 ++ ofu_app/apps/registration/forms.py | 11 ++++ .../apps/registration/migrations/__init__.py | 0 ofu_app/apps/registration/models.py | 17 ++++++ ofu_app/apps/registration/tests.py | 3 ++ ofu_app/apps/registration/tokens.py | 11 ++++ ofu_app/apps/registration/urls.py | 9 ++++ ofu_app/apps/registration/views.py | 54 +++++++++++++++++++ ofu_app/ofu_app/models.py | 0 ofu_app/ofu_app/settings.py | 9 +++- ofu_app/ofu_app/urls.py | 1 + .../account_activation_email.jinja | 7 +++ ofu_app/templates/registration/signup.jinja | 23 ++++++++ 15 files changed, 152 insertions(+), 1 deletion(-) rename ofu_app/{templates/registration/sign_up.jinja => apps/registration/__init__.py} (100%) create mode 100644 ofu_app/apps/registration/admin.py create mode 100644 ofu_app/apps/registration/apps.py create mode 100644 ofu_app/apps/registration/forms.py create mode 100644 ofu_app/apps/registration/migrations/__init__.py create mode 100644 ofu_app/apps/registration/models.py create mode 100644 ofu_app/apps/registration/tests.py create mode 100644 ofu_app/apps/registration/tokens.py create mode 100644 ofu_app/apps/registration/urls.py create mode 100644 ofu_app/apps/registration/views.py create mode 100644 ofu_app/ofu_app/models.py create mode 100644 ofu_app/templates/registration/account_activation_email.jinja create mode 100644 ofu_app/templates/registration/signup.jinja diff --git a/ofu_app/templates/registration/sign_up.jinja b/ofu_app/apps/registration/__init__.py similarity index 100% rename from ofu_app/templates/registration/sign_up.jinja rename to ofu_app/apps/registration/__init__.py diff --git a/ofu_app/apps/registration/admin.py b/ofu_app/apps/registration/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ofu_app/apps/registration/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ofu_app/apps/registration/apps.py b/ofu_app/apps/registration/apps.py new file mode 100644 index 0000000..5b503f1 --- /dev/null +++ b/ofu_app/apps/registration/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class RegistrationConfig(AppConfig): + name = 'apps.registration' diff --git a/ofu_app/apps/registration/forms.py b/ofu_app/apps/registration/forms.py new file mode 100644 index 0000000..c387b21 --- /dev/null +++ b/ofu_app/apps/registration/forms.py @@ -0,0 +1,11 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User + + +class SignUpForm(UserCreationForm): + email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.') + + class Meta: + model = User + fields = ('username', 'email', 'password1', 'password2', ) \ No newline at end of file diff --git a/ofu_app/apps/registration/migrations/__init__.py b/ofu_app/apps/registration/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/apps/registration/models.py b/ofu_app/apps/registration/models.py new file mode 100644 index 0000000..2f21264 --- /dev/null +++ b/ofu_app/apps/registration/models.py @@ -0,0 +1,17 @@ +from django.db import models +from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver + + +class Profile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + email_confirmed = models.BooleanField(default=False) + # other fields... + + +@receiver(post_save, sender=User) +def update_user_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + instance.profile.save() diff --git a/ofu_app/apps/registration/tests.py b/ofu_app/apps/registration/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/ofu_app/apps/registration/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ofu_app/apps/registration/tokens.py b/ofu_app/apps/registration/tokens.py new file mode 100644 index 0000000..5f5709e --- /dev/null +++ b/ofu_app/apps/registration/tokens.py @@ -0,0 +1,11 @@ +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.utils import six + +class AccountActivationTokenGenerator(PasswordResetTokenGenerator): + def _make_hash_value(self, user, timestamp): + return ( + six.text_type(user.pk) + six.text_type(timestamp) + + six.text_type(user.profile.email_confirmed) + ) + +account_activation_token = AccountActivationTokenGenerator() \ No newline at end of file diff --git a/ofu_app/apps/registration/urls.py b/ofu_app/apps/registration/urls.py new file mode 100644 index 0000000..224ec8b --- /dev/null +++ b/ofu_app/apps/registration/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url +from apps.registration import views as core_views + +urlpatterns = [ + url(r'^$', core_views.signup, name='signup'), + url(r'^account_activation_sent/$', core_views.account_activation_sent, name='account_activation_sent'), + url(r'^activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', + core_views.activate, name='activate'), +] diff --git a/ofu_app/apps/registration/views.py b/ofu_app/apps/registration/views.py new file mode 100644 index 0000000..5268b1a --- /dev/null +++ b/ofu_app/apps/registration/views.py @@ -0,0 +1,54 @@ +from django.contrib.sites.shortcuts import get_current_site +from django.shortcuts import render, redirect +from django.utils.encoding import force_bytes +from django.utils.http import urlsafe_base64_encode +from django.template.loader import render_to_string +from apps.registration.forms import SignUpForm +from apps.registration.tokens import account_activation_token +from django.contrib.auth import login +from django.contrib.auth.models import User +from django.utils.encoding import force_text +from django.utils.http import urlsafe_base64_decode + + +def signup(request): + if request.method == 'POST': + form = SignUpForm(request.POST) + if form.is_valid(): + user = form.save(commit=False) + user.is_active = False + user.save() + current_site = get_current_site(request) + subject = 'Activate Your MySite Account' + message = render_to_string('registration/account_activation_email.jinja', { + 'user': user, + 'domain': current_site.domain, + 'uid': urlsafe_base64_encode(force_bytes(user.pk)), + 'token': account_activation_token.make_token(user), + }) + user.email_user(subject, message) + return redirect('account_activation_sent') + else: + form = SignUpForm() + return render(request, 'registration/signup.jinja', {'form': form}) + + +def activate(request, uidb64, token): + try: + uid = force_text(urlsafe_base64_decode(uidb64)) + user = User.objects.get(pk=uid) + except (TypeError, ValueError, OverflowError, User.DoesNotExist): + user = None + + if user is not None and account_activation_token.check_token(user, token): + user.is_active = True + user.profile.email_confirmed = True + user.save() + login(request, user) + return redirect('home') + else: + return render(request, 'account_activation_invalid.html') + + +def account_activation_sent(request): + return render(request, 'home.jinja', {}) diff --git a/ofu_app/ofu_app/models.py b/ofu_app/ofu_app/models.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/ofu_app/settings.py b/ofu_app/ofu_app/settings.py index 17b7f54..b8dad97 100644 --- a/ofu_app/ofu_app/settings.py +++ b/ofu_app/ofu_app/settings.py @@ -34,6 +34,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.sites', 'django_jinja', 'apps.food', 'apps.events', @@ -41,6 +42,8 @@ INSTALLED_APPS = [ 'rest_framework', ] +SITE_ID = 1 + REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser', @@ -58,7 +61,6 @@ REST_FRAMEWORK = { # ] ROOT_URLCONF = 'ofu_app.urls' -TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates'), TEMPLATES = [ { 'BACKEND': 'django_jinja.backend.Jinja2', @@ -162,3 +164,8 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = '/media/' LOGIN_REDIRECT_URL = 'home' + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +ACCOUNT_EMAIL_UNIQUE = True +ACCOUNT_EMAIL_CONFIRMATION_REQUIRED = True diff --git a/ofu_app/ofu_app/urls.py b/ofu_app/ofu_app/urls.py index 79b9c4c..b6fae3f 100644 --- a/ofu_app/ofu_app/urls.py +++ b/ofu_app/ofu_app/urls.py @@ -23,6 +23,7 @@ urlpatterns = [ url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'), url(r'^admin/', admin.site.urls), # url(r'^signup/$', core_views.signup, name='signup'), + url(r"^account/", include("apps.registration.urls")), url(r'^$', views.home, name="home"), # -- Apps -- diff --git a/ofu_app/templates/registration/account_activation_email.jinja b/ofu_app/templates/registration/account_activation_email.jinja new file mode 100644 index 0000000..cb47f9e --- /dev/null +++ b/ofu_app/templates/registration/account_activation_email.jinja @@ -0,0 +1,7 @@ +{% autoescape off %} +Hi {{ user.username }}, + +Please click on the link below to confirm your registration: + +http://{{ domain }}{% url 'activate' uidb64=uid token=token %} +{% endautoescape %} \ No newline at end of file diff --git a/ofu_app/templates/registration/signup.jinja b/ofu_app/templates/registration/signup.jinja new file mode 100644 index 0000000..4a68df9 --- /dev/null +++ b/ofu_app/templates/registration/signup.jinja @@ -0,0 +1,23 @@ +{% extends 'base.jinja' %} + +{% block content %} +
+

Sign up

+
+ {% csrf_token %} + {% for field in form %} +

+ {{ field.label_tag }}
+ {{ field }} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} + {% for error in field.errors %} +

{{ error }}

+ {% endfor %} +

+ {% endfor %} + +
+
+{% endblock %} \ No newline at end of file