Browse Source

[enh] Allow visitor to create an account

ljf 8 years ago
parent
commit
712d4235eb

+ 16 - 0
coin/members/forms.py

@@ -6,6 +6,22 @@ from django.contrib.auth.forms import PasswordResetForm, ReadOnlyPasswordHashFie
 
 from coin.members.models import Member
 
+from registration.forms import RegistrationForm
+
+
+
+class MemberRegistrationForm(RegistrationForm):
+
+    def __init__(self, *args, **kwargs):
+        super(MemberRegistrationForm, self).__init__(*args, **kwargs)
+
+        for fieldname in ['email', 'organization_name', 'password2']:
+            self.fields[fieldname].help_text = None
+
+    class Meta:
+        model = Member
+        fields = ['type', 'first_name', 'last_name', \
+                  'organization_name', 'email', 'username']
 
 class MemberCreationForm(forms.ModelForm):
 

+ 16 - 0
coin/members/registration_views.py

@@ -0,0 +1,16 @@
+from registration.backends.hmac.views import ActivationView, RegistrationView
+
+
+class MemberActivationView(ActivationView):
+    template_name = 'members/registration/activate.html'
+    def get_success_url(self, user):
+        return ('members:registration_activation_complete', (), {})
+
+class MemberRegistrationView(RegistrationView):
+    success_url = ('member:registration_activation_complete', (), {})
+    email_subject_template = 'members/registration/activation_email_subject.txt'
+    email_body_template = 'members/registration/activation_email.txt'
+    template_name = 'members/registration/registration_form.html'
+
+    def get_success_url(self, user):
+        return ('members:registration_complete', (), {})

+ 8 - 0
coin/members/templates/members/registration/activate.html

@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+<p>L'activation de votre compte a échoué ou ce dernier a déjà été activé.</p>
+
+{% endblock %}

+ 13 - 0
coin/members/templates/members/registration/activation_complete.html

@@ -0,0 +1,13 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+<h2>Compte adhérent créé</h2>
+<p>Votre compte adhérent est désormais créé, pour finaliser votre adhésion merci d'<b>envoyer votre adhésion de {{ settings.MEMBER_DEFAULT_COTISATION }} €</b> par virement  avec le libéllé suivant:&nbsp;<b>{{ user.pk }}</b> .</p>
+
+<h2>Coordonnées bancaires</h2>
+<div id="payment-howto" class="panel">
+    {% include "billing/payment_howto.html" %}
+</div>
+{% endblock %}

+ 8 - 0
coin/members/templates/members/registration/activation_email.txt

@@ -0,0 +1,8 @@
+{% load i18n %}
+Bonjour,
+
+Pour activer votre compte adhérent {{ site.name }}, merci de suivre le lien suivant:
+
+http://{{ site.domain }}{% url 'members:registration_activate' activation_key %}
+
+{% blocktrans %}Ce lien sera valable pendant {{ expiration_days }} jours.{% endblocktrans %}

+ 1 - 0
coin/members/templates/members/registration/activation_email_subject.txt

@@ -0,0 +1 @@
+{% load i18n %}Activation de votre compte adhérent {{ site.name }}

+ 9 - 4
coin/members/templates/members/registration/login.html

@@ -43,10 +43,15 @@
     </div>
     <div class="medium-5 columns">
         <div class="panel callout" id="newcomers">
-            <h3>Nouvel adhérent ?</h3>
-            <p>Pour votre première connexion, il faut définir votre mot de passe.<br />
-            <a href="{% url 'members:password_reset' %}"><i class="fa fa-arrow-right"></i>
- Initialiser mon mot de passe</a></p>
+            {% if not settings.REGISTRATION_OPEN  %}
+                <h3>Nouvel adhérent ?</h3>
+                <p>Pour votre première connexion, il faut définir votre mot de passe.<br />
+                <a href="{% url 'members:password_reset' %}"><i class="fa fa-arrow-right"></i> Initialiser mon mot de passe</a></p>
+            {% else %}
+                <h3>Adhérer</h3>
+                <p>Pour adhérer, merci de créer votre compte puis de régler les {{ settings.MEMBER_DEFAULT_COTISATION }} € d'adhésion.</p>
+                <a href="{% url 'members:registration_register' %}"><i class="fa fa-arrow-right"></i> Créer mon compte adhérent</a>
+            {% endif %}
         </div>
     </div>
 

+ 6 - 0
coin/members/templates/members/registration/registration_closed.html

@@ -0,0 +1,6 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+	<p>{% trans "Registration is currently closed." %}</p>
+{% endblock %}

+ 6 - 0
coin/members/templates/members/registration/registration_complete.html

@@ -0,0 +1,6 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+<p>Votre demande de création de compte a été enregistrée. Afin de finaliser la création du compte, un email d'activation vous a été envoyé.</p>
+{% endblock %}

+ 65 - 0
coin/members/templates/members/registration/registration_form.html

@@ -0,0 +1,65 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+        <h2>Créer un compte adhérent</h2>
+<div class="row">
+    <div class="medium-4 large-4 columns">
+        <div class="panel callout">
+            <h3>Déjà un compte ?</h3>
+            <p>Si vous avez payé en monnaie ou que vous vous avez remplis une adhésion papier, il est possible qu'un de nos bénévoles aient déjà créé votre compte.</p><p> Dans ce cas pour votre première connexion, il vous faut définir votre mot de passe.<br />
+            <a href="{% url 'members:password_reset' %}"><i class="fa fa-arrow-right"></i> Initialiser mon mot de passe</a></p>
+        
+        <a href="{% url 'members:login' %}"><i class="fa fa-arrow-right"></i> OU essayer de me connecter</a>
+        </div>
+    </div>
+
+    <div class="medium-8 large-8 columns">
+        <form method="post" action=".">
+        
+            {% csrf_token %}
+            <fieldset class="module aligned wide">
+            {{ form.as_p }}
+            </fieldset>
+        <input type="submit" class="button radius" value="Créer mon compte" />
+        </form>
+    </div>
+</div>
+{% endblock %}
+{% block extra_js %}
+<script>
+$(document).ready(function () {
+  var hideFields=function(){
+    var optionSelected = $("option:selected", this);
+    var valueSelected = this.value;
+    if (valueSelected == 'legal_entity') {
+      $('#id_first_name').parent().hide();
+      $('#id_last_name').parent().hide();
+      $('#id_organization_name').parent().show();
+      $('#id_first_name').val('');
+      $('#id_last_name').val('');
+    } else if (valueSelected == 'natural_person') {
+      $('#id_organization_name').parent().hide();
+      $('#id_first_name').parent().show();
+      $('#id_last_name').parent().show();
+      $('#id_organization_name').val('');
+    }
+    return false;
+  };
+  $('#id_type').on('change', hideFields);
+  if (!$('#id_organization_name').val()) {
+    $('#id_type').val('natural_person');
+      $('#id_organization_name').parent().hide();
+      $('#id_first_name').parent().show();
+      $('#id_last_name').parent().show();
+  }
+  else {
+    $('#id_type').val('legal_entity');
+      $('#id_first_name').parent().hide();
+      $('#id_last_name').parent().hide();
+      $('#id_organization_name').parent().show();
+  }
+});
+</script>
+
+{% endblock %}

+ 50 - 2
coin/members/urls.py

@@ -1,17 +1,33 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.conf.urls import patterns, url
+from django.conf.urls import patterns, url, include
 from django.views.generic import DetailView
+from coin.members import forms
 from coin.members import views
 from coin.members.models import Member
+from django.views.generic.base import TemplateView
+from coin.mixins import ExtraContextTemplateView
+from . import registration_views as views_r
+from coin import settings
 
+from registration.signals import user_activated
+from django.contrib.auth import login, authenticate
+
+def login_on_activation(sender, user, request, **kwargs):
+    """Logs in the user after activation"""
+    user.backend = 'django.contrib.auth.backends.ModelBackend'
+    login(request, user)
+
+# Registers the function with the django-registration user_activated signal
+user_activated.connect(login_on_activation)
 
 urlpatterns = patterns(
     '',
     url(r'^$', views.index, name='index'),
     url(r'^login/$', 'django.contrib.auth.views.login',
-        {'template_name': 'members/registration/login.html'},
+        {'template_name': 'members/registration/login.html',
+         'extra_context': {'settings': settings} },
         name='login'),
     url(r'^logout/$', 'django.contrib.auth.views.logout_then_login',
         name='logout'),
@@ -43,6 +59,38 @@ urlpatterns = patterns(
         name='password_reset_complete'),
 
 
+    url(r'^activate/complete/$',
+        ExtraContextTemplateView.as_view(
+            template_name='members/registration/activation_complete.html',
+            extra_context={'settings': settings}
+        ),
+        name='registration_activation_complete'),
+    # The activation key can make use of any character from the
+    # URL-safe base64 alphabet, plus the colon as a separator.
+    url(r'^activate/(?P<activation_key>[-:\w]+)/$',
+        views_r.MemberActivationView.as_view(),
+        name='registration_activate'),
+    url(r'^register/$',
+        views_r.MemberRegistrationView.as_view(
+            form_class=forms.MemberRegistrationForm,
+            template_name='members/registration/registration_form.html'
+        ),
+        name='registration_register'),
+    url(r'^register/complete/$',
+        TemplateView.as_view(
+            template_name='members/registration/registration_complete.html'
+        ),
+        name='registration_complete'),
+    url(r'^register/closed/$',
+        TemplateView.as_view(
+            template_name='members/registration/registration_closed.html'
+        ),
+        name='registration_disallowed'),
+    #url(r'', include('registration.auth_urls')),
+
+
+
+
     url(r'^detail/$', views.detail,
         name='detail'),
 

+ 11 - 0
coin/mixins.py

@@ -4,6 +4,17 @@ from __future__ import unicode_literals
 from django.db import transaction
 from django.conf import settings
 
+from django.views.generic import TemplateView
+
+class ExtraContextTemplateView(TemplateView):
+    """ Allow to create TemplateView with extra context (like settings) """
+
+    extra_context = {}
+    def get_context_data(self, **kwargs):
+         context = super(ExtraContextTemplateView, self).get_context_data(**kwargs)
+         context.update(self.extra_context)
+         return context
+
 
 class CoinLdapSyncMixin(object):