diff --git a/ofu_app/apps/registration/__init__.py b/ofu_app/apps/registration/__init__.py new file mode 100644 index 0000000..e69de29 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/0001_initial.py b/ofu_app/apps/registration/migrations/0001_initial.py new file mode 100644 index 0000000..453d622 --- /dev/null +++ b/ofu_app/apps/registration/migrations/0001_initial.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-10-29 11:07 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email_confirmed', models.BooleanField(default=False)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] 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..b3131c5 --- /dev/null +++ b/ofu_app/apps/registration/views.py @@ -0,0 +1,58 @@ +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 +from django.core.mail import send_mail +from django.shortcuts import HttpResponse + + +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 = request.META['HTTP_HOST'] + subject = 'Activate Your MySite Account' + message = render_to_string('registration/account_activation_email.jinja', { + 'user': user, + 'domain': current_site, + 'uid': urlsafe_base64_encode(force_bytes(user.pk)), + 'token': account_activation_token.make_token(user), + }) + + send_mail(from_email="signup.basta@gmail.com", recipient_list=[user.email], subject=subject, + message=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 render(request, 'registration/account_activation_success.jinja') + else: + return render(request, 'registration/account_activation_invalid.jinja') + + +def account_activation_sent(request): + return render(request, 'registration/account_activation_sent.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 d45a573..bed7d0b 100644 --- a/ofu_app/ofu_app/settings.py +++ b/ofu_app/ofu_app/settings.py @@ -34,14 +34,18 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.sites', 'django_jinja', 'apps.food', 'apps.events', 'apps.donar', + 'apps.registration', 'rest_framework', 'analytical', ] +SITE_ID = 1 + REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAdminUser', @@ -59,7 +63,6 @@ REST_FRAMEWORK = { # ] ROOT_URLCONF = 'ofu_app.urls' - TEMPLATES = [ { 'BACKEND': 'django_jinja.backend.Jinja2', @@ -162,5 +165,19 @@ SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = '/media/' +# monitoring PIWIK_DOMAIN_PATH = 'mg-server.ddns.net/piwik' PIWIK_SITE_ID = '1' + +LOGIN_REDIRECT_URL = 'home' + +# Sign Up E-Mail authentication +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_HOST_USER = 'signup.basta@gmail.com' +EMAIL_HOST_PASSWORD = '1\SL^QzlSuP<`8gkP4Fd' +EMAIL_PORT = '587' +EMAIL_USE_TLS = True + +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 d26dcc4..b6fae3f 100644 --- a/ofu_app/ofu_app/urls.py +++ b/ofu_app/ofu_app/urls.py @@ -15,10 +15,15 @@ Including another URLconf """ from django.conf.urls import url, include from django.contrib import admin +from django.contrib.auth import views as auth_views from ofu_app import views urlpatterns = [ + url(r'^login/$', auth_views.login, {'template_name': 'registration/login.jinja'}, name='login'), + 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/static/css/nav.css b/ofu_app/static/css/nav.css index fb14fd1..5c19023 100644 --- a/ofu_app/static/css/nav.css +++ b/ofu_app/static/css/nav.css @@ -55,12 +55,7 @@ #menu-button { text-align: center; - margin-top: 12px;; height: 100%; } -#menu-button i { - -} - diff --git a/ofu_app/templates/base.jinja b/ofu_app/templates/base.jinja index 79d272a..ea13208 100644 --- a/ofu_app/templates/base.jinja +++ b/ofu_app/templates/base.jinja @@ -40,51 +40,56 @@ {% block body %} -
-
- -
-
- {% block headline %}{% endblock %}
-
-