Skip to content

Commit

Permalink
feat(dev): registration simplification (#291)
Browse files Browse the repository at this point in the history
  • Loading branch information
eugena committed Jul 30, 2023
1 parent 58f2461 commit 8f105f6
Show file tree
Hide file tree
Showing 26 changed files with 335 additions and 172 deletions.
48 changes: 43 additions & 5 deletions acesta/account/adapter.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,58 @@
from allauth.account import signals
from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.utils import user_field
from django.contrib import messages
from django.http import HttpResponseRedirect


class AccountAdapter(DefaultAccountAdapter):
def post_login(
self,
request,
user,
*,
email_verification,
signal_kwargs,
email,
signup,
redirect_url
):
from allauth.account.utils import get_login_redirect_url

response = HttpResponseRedirect(
get_login_redirect_url(request, redirect_url, signup=signup)
)

if signal_kwargs is None:
signal_kwargs = {}
signals.user_logged_in.send(
sender=user.__class__,
request=request,
response=response,
user=user,
**signal_kwargs,
)

if user.registered:
self.add_message(
request,
messages.SUCCESS,
"account/messages/logged_in.txt",
{"user": user},
)

return response

def save_user(self, request, user, form, commit=False):
"""
Saves a new `User` instance using information provided in the
signup form.
"""
user = super().save_user(request, user, form, commit)
data = form.cleaned_data
user_field(user, "middle_name", data.get("middle_name", ""))
user_field(user, "company", data.get("company"), "")
user_field(user, "position", data.get("position"), "")
user_field(user, "phone", data.get("phone"), "")
setattr(user, "region_id", getattr(data.get("region"), "code", None))
setattr(user, "city_id", getattr(data.get("city"), "id", None))
if user.last_name is not None and len(user.last_name):
user.note = user.last_name
user.last_name = None
user.save()
return user
37 changes: 31 additions & 6 deletions acesta/account/forms.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from allauth.account.forms import PasswordField
from allauth.account.forms import SignupForm as BaseSignupForm
from allauth.account.forms import UserForm
from allauth.account.utils import get_adapter
from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _
Expand All @@ -9,20 +10,44 @@


class SignupForm(BaseSignupForm, forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["password1"].required = False

class Meta:
model = User
fields = (
"last_name",
"first_name",
"middle_name",
"region",
"city",
"position",
"company",
"phone",
)


class SignupNextForm(forms.ModelForm):
def __init__(self, user=None, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
self.fields["password1"] = PasswordField(
label=_("Password"), autocomplete="new-password"
)

def clean(self):
super().clean()
password = self.cleaned_data.get("password1")
if password:
try:
get_adapter().clean_password(password, user=self.user)
except forms.ValidationError as e:
self.add_error("password1", e)

class Meta:
model = User
fields = (
"region",
"purpose",
"subscription",
)


class ChangeEmailForm(UserForm):

email = forms.EmailField(required=True)
Expand Down
2 changes: 1 addition & 1 deletion acesta/account/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ def user_display(user: User):
:param user: User
:return: str
"""
return f"{ user.first_name } { user.middle_name }".strip()
return f"{ user.first_name } { user.middle_name if user.middle_name is not None else '' }".strip()
66 changes: 59 additions & 7 deletions acesta/account/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from allauth.account import app_settings
from allauth.account.adapter import get_adapter
from allauth.account.views import PasswordChangeView as BasePasswordChangeView
from allauth.account.views import PasswordSetView as BasePasswordSetView
Expand All @@ -11,33 +12,84 @@
from django.views.generic.edit import FormView

from acesta.account.forms import ChangeEmailForm
from acesta.account.forms import SignupNextForm
from acesta.geo.utils import get_geo_objects_from_geo_base
from acesta.user.utils import send_message

User = get_user_model()


class SignupView(BaseSignupView):
success_url = reverse_lazy("account_signupnext")

def dispatch(self, request, *args, **kwargs):
return super(FormView, self).dispatch(request, *args, **kwargs)

def form_valid(self, form):
send_message("Новая регистрация через форму")
return super().form_valid(form)

def form_invalid(self, form):
send_message(f"Ошибка при регистрации через форму {form.errors}")
return super().form_invalid(form)


signup = SignupView.as_view()


class SignupnextView(FormView):
template_name = "account/signupnext." + app_settings.TEMPLATE_EXTENSION
success_url = reverse_lazy("region")
form_class = SignupNextForm

def get_initial(self):
initial = super().get_initial()
if not initial.get("region") or not initial.get("city"):
region, city = get_geo_objects_from_geo_base(self.request)
if not initial.get("region"):
region, _ = get_geo_objects_from_geo_base(self.request)
if not initial.get("region") and region:
initial["region"] = region.code
if not initial.get("city") and city:
initial["city"] = city.id
return initial

def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user.registered:
response = HttpResponseRedirect(self.success_url)
else:
response = super(FormView, self).dispatch(request, *args, **kwargs)
return response

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs

def form_valid(self, form):
send_message("Новая регистрация через форму")
data = form.cleaned_data
self.request.user.region = data.get("region")
self.request.user.current_region = data.get("region")
self.request.user.purpose = data.get("purpose")
self.request.user.subscription = data.get("subscription", True)
self.request.user.registered = True
self.request.user.set_password(data.get("password1"))
self.request.user.save(
update_fields=[
"region",
"current_region",
"registered",
"purpose",
"subscription",
"password",
]
)
get_adapter().login(self.request, self.request.user)
send_message("Новый вход после регистрации")
return super().form_valid(form)

def form_invalid(self, form):
send_message(f"Ошибка при регистрации через форму {form.errors}")
send_message(f"Ошибка входа после регистрации {form.errors}")
return super().form_invalid(form)


signup = SignupView.as_view()
signupnext = SignupnextView.as_view()


class PasswordChangeView(BasePasswordChangeView):
Expand Down
6 changes: 0 additions & 6 deletions acesta/socialaccount/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ class SocialSignupForm(BaseSocialSignupForm, ModelForm):
class Meta:
model = User
fields = (
"last_name",
"first_name",
"middle_name",
"region",
"city",
"position",
"company",
"phone",
)
11 changes: 1 addition & 10 deletions acesta/socialaccount/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,11 @@
from django.contrib.auth.decorators import login_required
from django.urls import reverse_lazy

from acesta.geo.utils import get_geo_objects_from_geo_base
from acesta.user.utils import send_message


class SignupView(BaseSignupView):
def get_form(self, form_class=None):
form = super().get_form(form_class)
if not form.initial.get("region") or not form.initial.get("city"):
region, city = get_geo_objects_from_geo_base(self.request)
if not form.initial.get("region") and region:
form.fields["region"].initial = region
if not form.initial.get("city") and city:
form.initial["city"] = city
return form
success_url = reverse_lazy("account_signupnext")

def form_valid(self, form):
send_message("Новая регистрация через соцсеть")
Expand Down
5 changes: 4 additions & 1 deletion acesta/static/css/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,10 @@ box-shadow:0px 5px 8px -10px rgba(34, 60, 80, 0.8);border:1px solid #ececec}
.modal-footer{justify-content:flex-start}

input[type=radio] {margin-right:.3em;position:relative;top:.2em;appearance:none;border-radius:50%;font:inherit;color:currentColor;width:1em;height:1em;border:0.1em solid #429388}
.form-check-input:checked{background-color: var(--acesta-primary);border-color: var(--acesta-primary);}
.form-check-input:focus{border-color: var(--acesta-dark-primary);}
input:checked[type=radio] {background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}
input:checked {background-color:#429388;border-color:#429388}
input:checked {background-color:var(--acesta-light-primary);border-color:var(--acesta-dark-primary)}

._dash-loading{display:none}
*[data-dash-is-loading="true"]{filter:blur(2px);-web-kit-filter:blur(2px);-moz-filter:blur(2px);-o-filter:blur(2px);-ms-filter:blur(2px);}
Expand Down Expand Up @@ -479,6 +481,7 @@ label:focus
.btn-close:focus,
.btn-close:active
{outline:0px !important;-webkit-appearance:none;box-shadow:none !important}
textarea.form-control{min-height: 100px;}

.form-control:focus,.form-select:focus{border:1px solid var(--acesta-primary)}

Expand Down
5 changes: 4 additions & 1 deletion acesta/stats/dash.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ def formatted_percentage(x: int, y: int) -> str:
Returns formatted result
:return: str
"""
return str(int(round(x / y, 2) * 100)).rjust(2)
try:
return str(int(round(x / y, 2) * 100)).rjust(2)
except ZeroDivisionError:
return "0"


# Sights Statistics Application
Expand Down
2 changes: 1 addition & 1 deletion acesta/templates/account/base_col6.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

{% block content %}
<div class="row">
<div class="d-none d-md-block col-md-7 d-flex align-content-center pb-5">
<div class="d-none col-md-7 d-md-flex justify-content-center align-content-center pb-5">
{% block content_image %}
<img width="80%" src="{% static 'img/login.svg' %}">
{% endblock %}
Expand Down
22 changes: 4 additions & 18 deletions acesta/templates/account/signup.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{% extends "outside.html" %}
{% extends "account/base_col6.html" %}

{% load static %}
{% load i18n %}

{% block title %}Регистрация. {% endblock %}

Expand All @@ -15,23 +14,10 @@
{% block vkimage %}{% static 'img/og/login.vk.png' %}{% endblock %}
{% block vkimage_secure %}{% static 'img/og/login.vk.png' %}{% endblock %}

{% block css_external %}
<link rel="stylesheet" href="{% static 'css/select2.min.css' %}">
{{ block.super }}
{% endblock %}

{% block content %}
<div class="row">
<h1>{% trans "Sign Up" %}</h1>
</div>
{% block content_block %}
<h1>Регистрация</h1>
<form class="signup has-masked" id="signup_form" method="post" action="{% url 'account_signup' %}">
{% csrf_token %}
{% include "include/sign_up_fields.html" %}
{% include "include/sign_up_fields_1.html" %}
</form>
{% endblock %}

{% block js %}
{{ block.super }}
<script src="{% static 'js/region.selector.js' %}"></script>
<script src="{% static 'js/city.selector.js' %}"></script>
{% endblock %}
33 changes: 33 additions & 0 deletions acesta/templates/account/signupnext.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{% extends "account/base_col6.html" %}

{% load static %}

{% block title %}Завершение регистрации. {% endblock %}

{% block description %}Завершение регистрации на аналитическом сервисе для развития туризма ацеста{% endblock %}

{% block ogtitle %}Завершение регистрации. {% endblock %}

{% block ogimage %}{% static 'img/og/login.png' %}{% endblock %}
{% block ogimage_secure %}{% static 'img/og/login.png' %}{% endblock %}

{% block vkimage %}{% static 'img/og/login.vk.png' %}{% endblock %}
{% block vkimage_secure %}{% static 'img/og/login.vk.png' %}{% endblock %}

{% block css_external %}
<link rel="stylesheet" href="{% static 'css/select2.min.css' %}">
{{ block.super }}
{% endblock %}

{% block content_block %}
<h1>Завершение регистрации</h1>
<form class="signup" id="signup_form" method="post" action="{% url 'account_signupnext' %}">
{% csrf_token %}
{% include "include/sign_up_fields_2.html" %}
</form>
{% endblock %}

{% block js %}
{{ block.super }}
<script src="{% static 'js/region.selector.js' %}"></script>
{% endblock %}
8 changes: 5 additions & 3 deletions acesta/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ <h5 class="modal-title text-nowrap fw-bolder" id="privacyLabel">Политика
<script src="{% static 'js/jquery.mask.min.js' %}"></script>
<script src="{% static 'js/user.clear.phone.mask.js' %}"></script>
<script src="{% static 'js/channel.selector.js' %}"></script>
{% if messages %}
{% include "include/messages.html" %}
{% endif %}
{% block messages %}
{% if messages %}
{% include "include/messages.html" %}
{% endif %}
{% endblock messages %}
{% if not DEBUG %}
{% include "include/metrika.html" %}
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion acesta/templates/dashboard/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ <h5>Области</h5>
<ul class="navbar-nav d-none d-lg-flex">
<li>{% include "include/contact_block.html" %}</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ request.user.first_name }} {{ request.user.middle_name }}</a>
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ request.user.first_name }} {{ request.user.middle_name|default:"" }}</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="{% url 'user' %}"><svg fill="#429388" class="me-1" width="22" height="22"><use href="{% static 'img/sprite.svg' %}#user"></use></svg>Моя страница</a></li>
<li><a class="dropdown-item" href="{% url 'price' %}"><svg fill="#429388" class="me-1" width="22" height="22"><use href="{% static 'img/sprite.svg' %}#price"></use></svg>Услуги</a></li>
Expand Down
Loading

0 comments on commit 8f105f6

Please sign in to comment.