Merge pull request #150 from Brett78/issue-137

User register feature
This commit is contained in:
Oliver Marks 2017-10-07 13:19:24 +01:00 committed by GitHub
commit 5acf72a5fa
12 changed files with 116 additions and 6 deletions

View File

@ -42,6 +42,8 @@ ST_ALLOWED_URL_PROTOCOLS = {
ST_UNICODE_SLUGS = True ST_UNICODE_SLUGS = True
ST_UNIQUE_EMAILS = True ST_UNIQUE_EMAILS = True
ST_CASE_INSENSITIVE_EMAILS = True ST_CASE_INSENSITIVE_EMAILS = True
ST_UPLOAD_IMAGE_ENABLED = True
ST_UPLOAD_FILE_ENABLED = True
# Tests helpers # Tests helpers
ST_TESTS_RATELIMIT_NEVER_EXPIRE = False ST_TESTS_RATELIMIT_NEVER_EXPIRE = False
@ -139,6 +141,7 @@ LOCAL_APPS = (
'mhackspace.blog', 'mhackspace.blog',
'mhackspace.core', 'mhackspace.core',
'mhackspace.requests', 'mhackspace.requests',
'mhackspace.register',
'mhackspace.rfid', 'mhackspace.rfid',
) )

View File

@ -24,6 +24,7 @@ from mhackspace.feeds.views import FeedViewSet, ArticleViewSet
from mhackspace.requests.views import RequestsForm, RequestsList from mhackspace.requests.views import RequestsForm, RequestsList
from mhackspace.rfid.views import DeviceViewSet, AuthUserWithDeviceViewSet from mhackspace.rfid.views import DeviceViewSet, AuthUserWithDeviceViewSet
from mhackspace.register.views import RegisterForm
from wiki.urls import get_pattern as get_wiki_pattern from wiki.urls import get_pattern as get_wiki_pattern
from django_nyt.urls import get_pattern as get_nyt_pattern from django_nyt.urls import get_pattern as get_nyt_pattern
@ -95,6 +96,9 @@ urlpatterns = [
url(r'^admin/password_reset/done/$', auth_views.password_reset_done, name='password_reset_done'), url(r'^admin/password_reset/done/$', auth_views.password_reset_done, name='password_reset_done'),
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', auth_views.password_reset_confirm, name='password_reset_confirm'), url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', auth_views.password_reset_confirm, name='password_reset_confirm'),
url(r'^reset/done/$', auth_views.password_reset_complete, name='password_reset_complete'), url(r'^reset/done/$', auth_views.password_reset_complete, name='password_reset_complete'),
url(r'^register/$', RegisterForm.as_view(), name='register_form'),
url(r'^register/success$', TemplateView.as_view(template_name='pages/register.html'), name='register_success'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += [ urlpatterns += [

View File

View File

@ -0,0 +1,7 @@
from django.contrib import admin
from mhackspace.register.models import RegisteredUser
@admin.register(RegisteredUser)
class RegisteredUserAdmin(admin.ModelAdmin):
list_display = ('name', 'user_id', 'created_at')

View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class RegisterConfig(AppConfig):
name = 'register'

View File

@ -0,0 +1,8 @@
from django import forms
from mhackspace.register.models import RegisteredUser
class RegisteredUserForm(forms.ModelForm):
class Meta:
model = RegisteredUser
exclude = ['user', 'created_at']

View File

@ -0,0 +1,9 @@
from django.db import models
import datetime
class RegisteredUserManager(models.Manager):
def is_registered(self, user):
today = datetime.date.today()
return super(RegisteredUserManager, self).get_queryset().filter(user=user, created_at__gte=today).exists()

View File

@ -0,0 +1,15 @@
from django.db import models
from django.conf import settings
from django.utils import timezone
from mhackspace.register.managers import RegisteredUserManager
class RegisteredUser(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', null=True, blank=True)
name = models.CharField(max_length=100, null=False, blank=False)
created_at = models.DateTimeField(default=timezone.now)
objects = RegisteredUserManager()
class Meta:
ordering = ('-created_at',)

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,25 @@
from django.views.generic.edit import FormView
from mhackspace.register.forms import RegisteredUserForm
from mhackspace.register.models import RegisteredUser
class RegisterForm(FormView):
template_name = 'pages/register.html'
form_class = RegisteredUserForm
success_url = '/register/success'
def get(self, request, *args, **kwargs):
if request.user.is_authenticated():
if not RegisteredUser.objects.is_registered(request.user):
registered_user = RegisteredUser.objects.create(user=request.user, name=request.user.username)
registered_user.save()
return super(RegisterForm, self).form_valid(None)
return super(RegisterForm, self).get(self, request, *args, **kwargs)
def form_valid(self, form):
if form.is_valid():
form.save()
return super(RegisterForm, self).form_valid(form)

View File

@ -1,5 +1,4 @@
from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.decorators import method_decorator
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.contrib import messages from django.contrib import messages
from mhackspace.requests.forms import UserRequestForm from mhackspace.requests.forms import UserRequestForm
@ -8,8 +7,7 @@ from django.views.generic import ListView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
@method_decorator(login_required, name='dispatch') class RequestsForm(LoginRequiredMixin, FormView):
class RequestsForm(FormView):
template_name = 'pages/requests.html' template_name = 'pages/requests.html'
form_class = UserRequestForm form_class = UserRequestForm
success_url = '/requests' success_url = '/requests'
@ -30,8 +28,8 @@ class RequestsForm(FormView):
return super(FormView, self).form_valid(form) return super(FormView, self).form_valid(form)
@method_decorator(login_required, name='dispatch')
class RequestsList(ListView): class RequestsList(LoginRequiredMixin, ListView):
template_name = 'pages/requests.html' template_name = 'pages/requests.html'
model = UserRequests model = UserRequests
context_object_name = 'requests' context_object_name = 'requests'

View File

@ -0,0 +1,33 @@
{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load recapture %}
{% block head-open-graph %}
<meta property="og:title" content="Register attendance" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
<meta property="og:image" content="https://maidstone-hackspace.org.uk/static/images/android-chrome-192x192.png" />
{% endblock head-open-graph %}
{% block content %}
<h2>Register</h2>
{% if form %}
<form method="POST" action="{% url 'register_form' %}" class="register_form">
{% csrf_token %}
{{ form|crispy }}
{{ google_capture }}
<button class="btn btn-primary " type="submit" name="action">
<span class="fa fa-submit" ></span>
{% trans "Send" %}</button>
</form>
{% else %}
<div class="row">
<div class="col">
Thanks for registering!
</div>
</div>
{% endif %}
{% endblock content %}