From 5c3c412968666ae483df3f34fece0e039a8de78c Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Wed, 2 Feb 2022 14:13:06 +0100 Subject: [PATCH] Rip out social user management --- config/api_router.py | 3 +- config/settings/base.py | 27 +--- config/urls.py | 7 +- env_secrets/production.env | Bin 1542 -> 1399 bytes example.env | 1 + requirements/requirements.in | 3 - .../templates/account/account_inactive.html | 11 -- vbv_lernwelt/templates/account/base.html | 10 -- vbv_lernwelt/templates/account/email.html | 78 ----------- .../templates/account/email_confirm.html | 31 ----- vbv_lernwelt/templates/account/login.html | 59 --------- vbv_lernwelt/templates/account/logout.html | 19 --- .../templates/account/password_change.html | 16 --- .../templates/account/password_reset.html | 25 ---- .../account/password_reset_done.html | 16 --- .../account/password_reset_from_key.html | 24 ---- .../account/password_reset_from_key_done.html | 9 -- .../templates/account/password_set.html | 16 --- vbv_lernwelt/templates/account/signup.html | 22 ---- .../templates/account/signup_closed.html | 11 -- .../templates/account/verification_sent.html | 12 -- .../account/verified_email_required.html | 21 --- vbv_lernwelt/templates/base.html | 44 +++---- vbv_lernwelt/templates/users/user_detail.html | 34 ----- vbv_lernwelt/templates/users/user_form.html | 17 --- vbv_lernwelt/users/adapters.py | 16 --- vbv_lernwelt/users/admin.py | 10 +- vbv_lernwelt/users/api/serializers.py | 14 -- vbv_lernwelt/users/api/views.py | 25 ---- vbv_lernwelt/users/context_processors.py | 8 -- vbv_lernwelt/users/forms.py | 39 ------ vbv_lernwelt/users/migrations/0001_initial.py | 123 +++--------------- vbv_lernwelt/users/models.py | 9 -- vbv_lernwelt/users/tests/factories.py | 32 ----- vbv_lernwelt/users/tests/test_admin.py | 40 ------ vbv_lernwelt/users/tests/test_drf_urls.py | 24 ---- vbv_lernwelt/users/tests/test_drf_views.py | 33 ----- vbv_lernwelt/users/tests/test_forms.py | 39 ------ vbv_lernwelt/users/tests/test_models.py | 9 -- vbv_lernwelt/users/tests/test_swagger_ui.py | 16 --- vbv_lernwelt/users/tests/test_urls.py | 24 ---- vbv_lernwelt/users/tests/test_views.py | 102 --------------- vbv_lernwelt/users/urls.py | 13 -- vbv_lernwelt/users/views.py | 46 ------- 44 files changed, 47 insertions(+), 1091 deletions(-) delete mode 100644 vbv_lernwelt/templates/account/account_inactive.html delete mode 100644 vbv_lernwelt/templates/account/base.html delete mode 100644 vbv_lernwelt/templates/account/email.html delete mode 100644 vbv_lernwelt/templates/account/email_confirm.html delete mode 100644 vbv_lernwelt/templates/account/login.html delete mode 100644 vbv_lernwelt/templates/account/logout.html delete mode 100644 vbv_lernwelt/templates/account/password_change.html delete mode 100644 vbv_lernwelt/templates/account/password_reset.html delete mode 100644 vbv_lernwelt/templates/account/password_reset_done.html delete mode 100644 vbv_lernwelt/templates/account/password_reset_from_key.html delete mode 100644 vbv_lernwelt/templates/account/password_reset_from_key_done.html delete mode 100644 vbv_lernwelt/templates/account/password_set.html delete mode 100644 vbv_lernwelt/templates/account/signup.html delete mode 100644 vbv_lernwelt/templates/account/signup_closed.html delete mode 100644 vbv_lernwelt/templates/account/verification_sent.html delete mode 100644 vbv_lernwelt/templates/account/verified_email_required.html delete mode 100644 vbv_lernwelt/templates/users/user_detail.html delete mode 100644 vbv_lernwelt/templates/users/user_form.html delete mode 100644 vbv_lernwelt/users/adapters.py delete mode 100644 vbv_lernwelt/users/api/serializers.py delete mode 100644 vbv_lernwelt/users/api/views.py delete mode 100644 vbv_lernwelt/users/context_processors.py delete mode 100644 vbv_lernwelt/users/tests/factories.py delete mode 100644 vbv_lernwelt/users/tests/test_admin.py delete mode 100644 vbv_lernwelt/users/tests/test_drf_urls.py delete mode 100644 vbv_lernwelt/users/tests/test_drf_views.py delete mode 100644 vbv_lernwelt/users/tests/test_forms.py delete mode 100644 vbv_lernwelt/users/tests/test_models.py delete mode 100644 vbv_lernwelt/users/tests/test_swagger_ui.py delete mode 100644 vbv_lernwelt/users/tests/test_urls.py delete mode 100644 vbv_lernwelt/users/tests/test_views.py diff --git a/config/api_router.py b/config/api_router.py index 5b4f6dc7..e932ae36 100644 --- a/config/api_router.py +++ b/config/api_router.py @@ -1,14 +1,13 @@ from django.conf import settings from rest_framework.routers import DefaultRouter, SimpleRouter -from vbv_lernwelt.users.api.views import UserViewSet if settings.DEBUG: router = DefaultRouter() else: router = SimpleRouter() -router.register("users", UserViewSet) +# router.register("users", UserViewSet) app_name = "api" diff --git a/config/settings/base.py b/config/settings/base.py index a0dfee50..111c53c5 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -20,7 +20,7 @@ if READ_DOT_ENV_FILE: # GENERAL # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#debug -DEBUG = env.bool("DJANGO_DEBUG", False) +DEBUG = env.bool("VBV_DJANGO_DEBUG", False) # Local time zone. Choices are # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # though not all of them may be available with every OS. @@ -69,11 +69,6 @@ DJANGO_APPS = [ "django.forms", ] THIRD_PARTY_APPS = [ - "crispy_forms", - "crispy_bootstrap5", - "allauth", - "allauth.account", - "allauth.socialaccount", "rest_framework", "rest_framework.authtoken", "corsheaders", @@ -97,7 +92,6 @@ MIGRATION_MODULES = {"sites": "vbv_lernwelt.contrib.sites.migrations"} # https://docs.djangoproject.com/en/dev/ref/settings/#authentication-backends AUTHENTICATION_BACKENDS = [ "django.contrib.auth.backends.ModelBackend", - "allauth.account.auth_backends.AuthenticationBackend", ] # https://docs.djangoproject.com/en/dev/ref/settings/#auth-user-model AUTH_USER_MODEL = "users.User" @@ -186,7 +180,6 @@ TEMPLATES = [ "django.template.context_processors.static", "django.template.context_processors.tz", "django.contrib.messages.context_processors.messages", - "vbv_lernwelt.users.context_processors.allauth_settings", ], }, } @@ -372,24 +365,6 @@ else: ) -# django-allauth -# ------------------------------------------------------------------------------ -ACCOUNT_ALLOW_REGISTRATION = env.bool("VBV_DJANGO_ACCOUNT_ALLOW_REGISTRATION", True) -# https://django-allauth.readthedocs.io/en/latest/configuration.html -ACCOUNT_AUTHENTICATION_METHOD = "username" -# https://django-allauth.readthedocs.io/en/latest/configuration.html -ACCOUNT_EMAIL_REQUIRED = True -# https://django-allauth.readthedocs.io/en/latest/configuration.html -ACCOUNT_EMAIL_VERIFICATION = "mandatory" -# https://django-allauth.readthedocs.io/en/latest/configuration.html -ACCOUNT_ADAPTER = "vbv_lernwelt.users.adapters.AccountAdapter" -# https://django-allauth.readthedocs.io/en/latest/forms.html -ACCOUNT_FORMS = {"signup": "vbv_lernwelt.users.forms.UserSignupForm"} -# https://django-allauth.readthedocs.io/en/latest/configuration.html -SOCIALACCOUNT_ADAPTER = "vbv_lernwelt.users.adapters.SocialAccountAdapter" -# https://django-allauth.readthedocs.io/en/latest/forms.html -SOCIALACCOUNT_FORMS = {"signup": "vbv_lernwelt.users.forms.UserSocialSignupForm"} - # django-rest-framework # ------------------------------------------------------------------------------- # django-rest-framework - https://www.django-rest-framework.org/api-guide/settings/ diff --git a/config/urls.py b/config/urls.py index 3b326997..e4816a7e 100644 --- a/config/urls.py +++ b/config/urls.py @@ -10,14 +10,9 @@ from rest_framework.authtoken.views import obtain_auth_token urlpatterns = [ path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), - path( - "about/", TemplateView.as_view(template_name="pages/about.html"), name="about" - ), + path("about/", TemplateView.as_view(template_name="pages/about.html"), name="about"), # Django Admin, use {% url 'admin:index' %} path(settings.ADMIN_URL, admin.site.urls), - # User management - path("users/", include("vbv_lernwelt.users.urls", namespace="users")), - path("accounts/", include("allauth.urls")), # Your stuff: custom urls includes go here ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG: diff --git a/env_secrets/production.env b/env_secrets/production.env index 7b9d29a2da8f5048eb9d18af15c244c78db42ba0..bb79376375344acee136f7c1d8e4417a619c6f44 100644 GIT binary patch literal 1399 zcmV--1&I0pM@dveQdv+`0BA;Y)x92x95+gqZ^JEk0>+|}bl(5oSEgK*8WG7os?e5X z!NeVeewXhaJ~F+Q`2hTQ6Rv`nAMha}?dg&TmwKm3F+t4z09umdLlKqyq!=End73_A zmEFWDI36K2sZAGb&8NoAsz(+kS&3OTJ>Z*7Mwz8$hX5h)6KSxZMp6M|VY6UAB+KZc zxvHQ|^O4vRc&kNcR8G+EUOe->=0QEzgpUKp_+nwLufn?vxk5iKN@w?^#5)quY1(bp zy6%m8J{Bo1G+I_ZJ#4dp<{*?IeS}c@dJp2ux$`woYpc&Jb9tG7zV)R?5#Nw{NVtXX zEM;HKA4(i4h@rW{qM{y2*gUc-d*x1(OL`PVp)I z6S=GR*@&HY35y3Vy6I`2_Re1csap8}HldDh9Cu%715NY2{`cm1Ox>ae!Zi&&`GKxd z*y}weq(X~vw_NLgo(!dnSgw-whNk?2fK>!K!{^>nad!blUL85YUq<1cp?N88k*uZP zbd9hHycxix^8n?p_SalauPKv=+#+jxcgcI!`fG6E*4R~P$kJsp8rLm+GmipUo!pmUu{%6I z&JEo3N&fOSGIqaOIOQ?Tv=6^1W*YV?E%`hDyDn1<xH=0<}j7g2;Kq+WfL4ORrS{^}Y|#-UUP~>#rZn>A5K&N7& zHE}S8199aBVdbN>qqi|+arFHfE7mkMRY`G)Q)QTFYZK&$@`3tCux(|b3S0b4=&Hge zG;(_*Tm(47FN#4kDR#vnCI8B*O|UrPxY)0301;iXHH>FSY5GW6Z!h>EV;VPfTgN zi)osLL~;!Uv+Gsu1Re<755Xv_J#g^Ni<=HnpEwr2%{j;}2qt(l8oml1{f|SV5<>}@ z2X@{2kGTazT1}m#f`qEae?~4JjqyQfS86F-Y+<&TdL1L_6}p%@O3}Mw4@@o=7QSdL z7pyK?cej69?&vC%BipF(R99&T4N|}hAn9u59e@J}(N)N0me-{H`Va?Uf2cOh{FDU~lXJ^+08}fn)81S&Wn!o9=y&kBO6Sohh<+Fwui4 z8&%q((tn^mD_q?NQ07$tz!(a}pJ0C_+Wx3&?_-{XBt!7zR9h zNJg<({=^e}jH$F_Gwl`z^NI8XX}YS!O(6Tgp$Z3>>#E$9g5iY=+APLm**MZYil@$d zl+H|m?7dKHK5Z6nqbbmMuV4hX{S-j|9$_fFFXki#ZFX0=ZG-klrBIB&qmE($OhS{LWpjxHf zL2C0Q_S(3u@z*P9emn_=Fx2&>bS5)P?0)g`)_nLyl926To!rE|=km{A#G{Jv3Ts)uAHe9V}ub@~VJ z414x7GTcQChLny4ADV~bX*l}w9Bz!U$`hq8>m3gr_Bv(~>yyD;2?tPvMmw{-r*89< z;yc)0|1;RDqf&{5{fZFVSc<2|pLn~M1h~UqJ2H3Hu`5a{@_2*$c|Bb*KWC;Wrop^p4Ty-xi+yXAot#)Qa4$t3CpeDQN7dFY_8` z!gbC?E2Wvxv)P=7(MrE@kKfZkZ!b#It) zpaS;Mu~$=#+I&=Vd?0x0dus`4JX@Fqt)#z3<1}n|FVfwwvRA>*x#PWF$RGB;YG#6{ z2kxi6bRRZNvOO{0C9-x;fp~3YWpc5ZLmgqxr{w2iF?uN&rWLX>D=a-v(yV==a}s$w z*%tn;LH)4iKCcS2SZ;K?du3LC52u8}_X6SP%t?$h#y*#73YPLhMR~C^auTad}|E_*8IdN3hAeJ!K7QT`eGj+7772+zU9*2K^?$U|MX;axeJQW!~+4})1 zv9QSX=r`)?XE6RkvRx5NS5Aag$1C_=eS3Wc#C~iH9>U9gdy$%g!AiQ-7GWg5`1t5WkV7%4+A$kS638q_iH(qDK*P~)no&|8 zBBSyl!zbT13tnq{S8#GYidz_@+_dNzMFiXRP6_YC*qezyuz);ytJ;%|cA6gPs^*C0 sy4IG#&+fu&w%&Ov-?WTJ70G$>dIC<~@c*#@p!?|ut+*Nc4>VRYzFK$&*Z=?k diff --git a/example.env b/example.env index 0db68299..1c3ab747 100644 --- a/example.env +++ b/example.env @@ -1,2 +1,3 @@ export VBV_DATABASE_URL='postgres://vbv_lernwelt@localhost:5432/vbv_lernwelt' export VBV_DJANGO_LOGGING_CONF=VBV_DJANGO_LOGGING_CONF_CONSOLE_COLOR +export VBV_DJANGO_DEBUG=True diff --git a/requirements/requirements.in b/requirements/requirements.in index db7b7578..4751c64a 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -12,9 +12,6 @@ uvicorn[standard] # https://github.com/encode/uvicorn django<4 # https://www.djangoproject.com/ django-environ # https://github.com/joke2k/django-environ django-model-utils # https://github.com/jazzband/django-model-utils -django-allauth # https://github.com/pennersr/django-allauth -django-crispy-forms # https://github.com/django-crispy-forms/django-crispy-forms -crispy-bootstrap5 # https://github.com/django-crispy-forms/crispy-bootstrap5 django-redis # https://github.com/jazzband/django-redis # Django REST Framework djangorestframework # https://github.com/encode/django-rest-framework diff --git a/vbv_lernwelt/templates/account/account_inactive.html b/vbv_lernwelt/templates/account/account_inactive.html deleted file mode 100644 index 07175e4d..00000000 --- a/vbv_lernwelt/templates/account/account_inactive.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} - -{% block head_title %}{% translate "Account Inactive" %}{% endblock %} - -{% block inner %} -

{% translate "Account Inactive" %}

- -

{% translate "This account is inactive." %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/account/base.html b/vbv_lernwelt/templates/account/base.html deleted file mode 100644 index 8e1f260e..00000000 --- a/vbv_lernwelt/templates/account/base.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "base.html" %} -{% block title %}{% block head_title %}{% endblock head_title %}{% endblock title %} - -{% block content %} -
-
- {% block inner %}{% endblock %} -
-
-{% endblock %} diff --git a/vbv_lernwelt/templates/account/email.html b/vbv_lernwelt/templates/account/email.html deleted file mode 100644 index f7fa9b26..00000000 --- a/vbv_lernwelt/templates/account/email.html +++ /dev/null @@ -1,78 +0,0 @@ - -{% extends "account/base.html" %} - -{% load i18n %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Account" %}{% endblock %} - -{% block inner %} -

{% translate "E-mail Addresses" %}

- -{% if user.emailaddress_set.all %} -

{% translate 'The following e-mail addresses are associated with your account:' %}

- - - -{% else %} -

{% translate 'Warning:'%} {% translate "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}

- -{% endif %} - - -

{% translate "Add E-mail Address" %}

- -
- {% csrf_token %} - {{ form|crispy }} - -
- -{% endblock %} - - -{% block inline_javascript %} -{{ block.super }} - -{% endblock %} diff --git a/vbv_lernwelt/templates/account/email_confirm.html b/vbv_lernwelt/templates/account/email_confirm.html deleted file mode 100644 index 525c0f3e..00000000 --- a/vbv_lernwelt/templates/account/email_confirm.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load account %} - -{% block head_title %}{% translate "Confirm E-mail Address" %}{% endblock %} - - -{% block inner %} -

{% translate "Confirm E-mail Address" %}

- -{% if confirmation %} - -{% user_display confirmation.email_address.user as user_display %} - -

{% blocktranslate with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktranslate %}

- -
-{% csrf_token %} - -
- -{% else %} - -{% url 'account_email' as email_url %} - -

{% blocktranslate %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktranslate %}

- -{% endif %} - -{% endblock %} diff --git a/vbv_lernwelt/templates/account/login.html b/vbv_lernwelt/templates/account/login.html deleted file mode 100644 index 838ed111..00000000 --- a/vbv_lernwelt/templates/account/login.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load account socialaccount %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Sign In" %}{% endblock %} - -{% block inner %} - -

{% translate "Sign In" %}

- -{% get_providers as socialaccount_providers %} - -{% if socialaccount_providers %} -

- {% translate "Please sign in with one of your existing third party accounts:" %} - {% if ACCOUNT_ALLOW_REGISTRATION %} - {% blocktranslate trimmed %} - Or, sign up - for a {{ site_name }} account and sign in below: - {% endblocktranslate %} - {% endif %} -

- -
- -
    - {% include "socialaccount/snippets/provider_list.html" with process="login" %} -
- - - -
- - {% include "socialaccount/snippets/login_extra.html" %} - -{% else %} - {% if ACCOUNT_ALLOW_REGISTRATION %} -

- {% blocktranslate trimmed %} - If you have not created an account yet, then please - sign up first. - {% endblocktranslate %} -

- {% endif %} -{% endif %} - - - -{% endblock %} diff --git a/vbv_lernwelt/templates/account/logout.html b/vbv_lernwelt/templates/account/logout.html deleted file mode 100644 index d41824e2..00000000 --- a/vbv_lernwelt/templates/account/logout.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} - -{% block head_title %}{% translate "Sign Out" %}{% endblock %} - -{% block inner %} -

{% translate "Sign Out" %}

- -

{% translate 'Are you sure you want to sign out?' %}

- -
- {% csrf_token %} - {% if redirect_field_value %} - - {% endif %} - -
-{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_change.html b/vbv_lernwelt/templates/account/password_change.html deleted file mode 100644 index 5182a7a1..00000000 --- a/vbv_lernwelt/templates/account/password_change.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Change Password" %}{% endblock %} - -{% block inner %} -

{% translate "Change Password" %}

- -
- {% csrf_token %} - {{ form|crispy }} - -
-{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_reset.html b/vbv_lernwelt/templates/account/password_reset.html deleted file mode 100644 index 8a2b7a5f..00000000 --- a/vbv_lernwelt/templates/account/password_reset.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load account %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Password Reset" %}{% endblock %} - -{% block inner %} - -

{% translate "Password Reset" %}

- {% if user.is_authenticated %} - {% include "account/snippets/already_logged_in.html" %} - {% endif %} - -

{% translate "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

- -
- {% csrf_token %} - {{ form|crispy }} - -
- -

{% blocktranslate %}Please contact us if you have any trouble resetting your password.{% endblocktranslate %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_reset_done.html b/vbv_lernwelt/templates/account/password_reset_done.html deleted file mode 100644 index f682ee8c..00000000 --- a/vbv_lernwelt/templates/account/password_reset_done.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load account %} - -{% block head_title %}{% translate "Password Reset" %}{% endblock %} - -{% block inner %} -

{% translate "Password Reset" %}

- - {% if user.is_authenticated %} - {% include "account/snippets/already_logged_in.html" %} - {% endif %} - -

{% blocktranslate %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktranslate %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_reset_from_key.html b/vbv_lernwelt/templates/account/password_reset_from_key.html deleted file mode 100644 index dd836b49..00000000 --- a/vbv_lernwelt/templates/account/password_reset_from_key.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load crispy_forms_tags %} -{% block head_title %}{% translate "Change Password" %}{% endblock %} - -{% block inner %} -

{% if token_fail %}{% translate "Bad Token" %}{% else %}{% translate "Change Password" %}{% endif %}

- - {% if token_fail %} - {% url 'account_reset_password' as passwd_reset_url %} -

{% blocktranslate %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktranslate %}

- {% else %} - {% if form %} -
- {% csrf_token %} - {{ form|crispy }} - -
- {% else %} -

{% translate 'Your password is now changed.' %}

- {% endif %} - {% endif %} -{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_reset_from_key_done.html b/vbv_lernwelt/templates/account/password_reset_from_key_done.html deleted file mode 100644 index 7a58b444..00000000 --- a/vbv_lernwelt/templates/account/password_reset_from_key_done.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% block head_title %}{% translate "Change Password" %}{% endblock %} - -{% block inner %} -

{% translate "Change Password" %}

-

{% translate 'Your password is now changed.' %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/account/password_set.html b/vbv_lernwelt/templates/account/password_set.html deleted file mode 100644 index a748eb92..00000000 --- a/vbv_lernwelt/templates/account/password_set.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Set Password" %}{% endblock %} - -{% block inner %} -

{% translate "Set Password" %}

- -
- {% csrf_token %} - {{ form|crispy }} - -
-{% endblock %} diff --git a/vbv_lernwelt/templates/account/signup.html b/vbv_lernwelt/templates/account/signup.html deleted file mode 100644 index 189ab9e7..00000000 --- a/vbv_lernwelt/templates/account/signup.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} -{% load crispy_forms_tags %} - -{% block head_title %}{% translate "Signup" %}{% endblock %} - -{% block inner %} -

{% translate "Sign Up" %}

- -

{% blocktranslate %}Already have an account? Then please sign in.{% endblocktranslate %}

- - - -{% endblock %} diff --git a/vbv_lernwelt/templates/account/signup_closed.html b/vbv_lernwelt/templates/account/signup_closed.html deleted file mode 100644 index fcea1f04..00000000 --- a/vbv_lernwelt/templates/account/signup_closed.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} - -{% block head_title %}{% translate "Sign Up Closed" %}{% endblock %} - -{% block inner %} -

{% translate "Sign Up Closed" %}

- -

{% translate "We are sorry, but the sign up is currently closed." %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/account/verification_sent.html b/vbv_lernwelt/templates/account/verification_sent.html deleted file mode 100644 index acf81be2..00000000 --- a/vbv_lernwelt/templates/account/verification_sent.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} - -{% block head_title %}{% translate "Verify Your E-mail Address" %}{% endblock %} - -{% block inner %} -

{% translate "Verify Your E-mail Address" %}

- -

{% blocktranslate %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktranslate %}

- -{% endblock %} diff --git a/vbv_lernwelt/templates/account/verified_email_required.html b/vbv_lernwelt/templates/account/verified_email_required.html deleted file mode 100644 index beefceaf..00000000 --- a/vbv_lernwelt/templates/account/verified_email_required.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "account/base.html" %} - -{% load i18n %} - -{% block head_title %}{% translate "Verify Your E-mail Address" %}{% endblock %} - -{% block inner %} -

{% translate "Verify Your E-mail Address" %}

- -{% url 'account_email' as email_url %} - -

{% blocktranslate %}This part of the site requires us to verify that -you are who you claim to be. For this purpose, we require that you -verify ownership of your e-mail address. {% endblocktranslate %}

- -

{% blocktranslate %}We have sent an e-mail to you for -verification. Please click on the link inside this e-mail. Please -contact us if you do not receive it within a few minutes.{% endblocktranslate %}

- -

{% blocktranslate %}Note: you can still change your e-mail address.{% endblocktranslate %}

-{% endblock %} diff --git a/vbv_lernwelt/templates/base.html b/vbv_lernwelt/templates/base.html index d59d5264..700eca41 100644 --- a/vbv_lernwelt/templates/base.html +++ b/vbv_lernwelt/templates/base.html @@ -6,15 +6,12 @@ {% block title %}VBV Lernwelt{% endblock title %} - - + + {% block css %} - - - @@ -23,10 +20,7 @@ ================================================== --> {# Placed at the top of the document so pages load faster with defer #} {% block javascript %} - - - @@ -52,27 +46,27 @@ - {% if request.user.is_authenticated %} - - #} +{# - {% else %} - {% if ACCOUNT_ALLOW_REGISTRATION %} - #} +{# {% else %}#} +{# {% if ACCOUNT_ALLOW_REGISTRATION %}#} +{# - {% endif %} - #} +{# {% endif %}#} +{# - {% endif %} +{# {% translate "Sign In" %}#} +{# #} +{# {% endif %}#} diff --git a/vbv_lernwelt/templates/users/user_detail.html b/vbv_lernwelt/templates/users/user_detail.html deleted file mode 100644 index 79b8233e..00000000 --- a/vbv_lernwelt/templates/users/user_detail.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "base.html" %} -{% load static %} - -{% block title %}User: {{ object.username }}{% endblock %} - -{% block content %} -
- -
-
- -

{{ object.username }}

- {% if object.name %} -

{{ object.name }}

- {% endif %} -
-
- -{% if object == request.user %} - -
- -
- My Info - E-Mail - -
- -
- -{% endif %} - -
-{% endblock content %} diff --git a/vbv_lernwelt/templates/users/user_form.html b/vbv_lernwelt/templates/users/user_form.html deleted file mode 100644 index 467357ad..00000000 --- a/vbv_lernwelt/templates/users/user_form.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base.html" %} -{% load crispy_forms_tags %} - -{% block title %}{{ user.username }}{% endblock %} - -{% block content %} -

{{ user.username }}

-
- {% csrf_token %} - {{ form|crispy }} -
-
- -
-
-
-{% endblock %} diff --git a/vbv_lernwelt/users/adapters.py b/vbv_lernwelt/users/adapters.py deleted file mode 100644 index 0d206fae..00000000 --- a/vbv_lernwelt/users/adapters.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Any - -from allauth.account.adapter import DefaultAccountAdapter -from allauth.socialaccount.adapter import DefaultSocialAccountAdapter -from django.conf import settings -from django.http import HttpRequest - - -class AccountAdapter(DefaultAccountAdapter): - def is_open_for_signup(self, request: HttpRequest): - return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) - - -class SocialAccountAdapter(DefaultSocialAccountAdapter): - def is_open_for_signup(self, request: HttpRequest, sociallogin: Any): - return getattr(settings, "ACCOUNT_ALLOW_REGISTRATION", True) diff --git a/vbv_lernwelt/users/admin.py b/vbv_lernwelt/users/admin.py index 070cffea..8d70d38a 100644 --- a/vbv_lernwelt/users/admin.py +++ b/vbv_lernwelt/users/admin.py @@ -3,19 +3,15 @@ from django.contrib.auth import admin as auth_admin from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ -from vbv_lernwelt.users.forms import UserAdminChangeForm, UserAdminCreationForm - User = get_user_model() @admin.register(User) class UserAdmin(auth_admin.UserAdmin): - form = UserAdminChangeForm - add_form = UserAdminCreationForm fieldsets = ( (None, {"fields": ("username", "password")}), - (_("Personal info"), {"fields": ("name", "email")}), + (_("Personal info"), {"fields": ("first_name", "last_name", "email")}), ( _("Permissions"), { @@ -30,5 +26,5 @@ class UserAdmin(auth_admin.UserAdmin): ), (_("Important dates"), {"fields": ("last_login", "date_joined")}), ) - list_display = ["username", "name", "is_superuser"] - search_fields = ["name"] + list_display = ["username", "first_name", "last_name", "is_active", "is_superuser"] + search_fields = ["first_name", "last_name", "email", "username"] diff --git a/vbv_lernwelt/users/api/serializers.py b/vbv_lernwelt/users/api/serializers.py deleted file mode 100644 index b5ccabba..00000000 --- a/vbv_lernwelt/users/api/serializers.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.contrib.auth import get_user_model -from rest_framework import serializers - -User = get_user_model() - - -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = User - fields = ["username", "name", "url"] - - extra_kwargs = { - "url": {"view_name": "api:user-detail", "lookup_field": "username"} - } diff --git a/vbv_lernwelt/users/api/views.py b/vbv_lernwelt/users/api/views.py deleted file mode 100644 index 98bb04e7..00000000 --- a/vbv_lernwelt/users/api/views.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.contrib.auth import get_user_model -from rest_framework import status -from rest_framework.decorators import action -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, UpdateModelMixin -from rest_framework.response import Response -from rest_framework.viewsets import GenericViewSet - -from .serializers import UserSerializer - -User = get_user_model() - - -class UserViewSet(RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet): - serializer_class = UserSerializer - queryset = User.objects.all() - lookup_field = "username" - - def get_queryset(self, *args, **kwargs): - assert isinstance(self.request.user.id, int) - return self.queryset.filter(id=self.request.user.id) - - @action(detail=False) - def me(self, request): - serializer = UserSerializer(request.user, context={"request": request}) - return Response(status=status.HTTP_200_OK, data=serializer.data) diff --git a/vbv_lernwelt/users/context_processors.py b/vbv_lernwelt/users/context_processors.py deleted file mode 100644 index e2633aec..00000000 --- a/vbv_lernwelt/users/context_processors.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf import settings - - -def allauth_settings(request): - """Expose some settings from django-allauth in templates.""" - return { - "ACCOUNT_ALLOW_REGISTRATION": settings.ACCOUNT_ALLOW_REGISTRATION, - } diff --git a/vbv_lernwelt/users/forms.py b/vbv_lernwelt/users/forms.py index 6e1dd9d3..d4b5f161 100644 --- a/vbv_lernwelt/users/forms.py +++ b/vbv_lernwelt/users/forms.py @@ -1,42 +1,3 @@ -from allauth.account.forms import SignupForm -from allauth.socialaccount.forms import SignupForm as SocialSignupForm -from django.contrib.auth import forms as admin_forms from django.contrib.auth import get_user_model -from django.utils.translation import gettext_lazy as _ User = get_user_model() - - -class UserAdminChangeForm(admin_forms.UserChangeForm): - class Meta(admin_forms.UserChangeForm.Meta): - model = User - - -class UserAdminCreationForm(admin_forms.UserCreationForm): - """ - Form for User Creation in the Admin Area. - To change user signup, see UserSignupForm and UserSocialSignupForm. - """ - - class Meta(admin_forms.UserCreationForm.Meta): - model = User - - error_messages = { - "username": {"unique": _("This username has already been taken.")} - } - - -class UserSignupForm(SignupForm): - """ - Form that will be rendered on a user sign up section/screen. - Default fields will be added automatically. - Check UserSocialSignupForm for accounts created from social. - """ - - -class UserSocialSignupForm(SocialSignupForm): - """ - Renders the form when user has signed up using social accounts. - Default fields will be added automatically. - See UserSignupForm otherwise. - """ diff --git a/vbv_lernwelt/users/migrations/0001_initial.py b/vbv_lernwelt/users/migrations/0001_initial.py index 4c4d6954..c0c36b57 100644 --- a/vbv_lernwelt/users/migrations/0001_initial.py +++ b/vbv_lernwelt/users/migrations/0001_initial.py @@ -1,4 +1,5 @@ -# Generated by Django 3.2.9 on 2021-11-20 11:23 +# Generated by Django 3.2.12 on 2022-02-02 13:01 + import django.contrib.auth.models import django.contrib.auth.validators from django.db import migrations, models @@ -10,116 +11,34 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ("auth", "0012_alter_user_first_name_max_length"), + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ migrations.CreateModel( - name="User", + name='User', fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("password", models.CharField(max_length=128, verbose_name="password")), - ( - "last_login", - models.DateTimeField( - blank=True, null=True, verbose_name="last login" - ), - ), - ( - "is_superuser", - models.BooleanField( - default=False, - help_text="Designates that this user has all permissions without explicitly assigning them.", - verbose_name="superuser status", - ), - ), - ( - "username", - models.CharField( - error_messages={ - "unique": "A user with that username already exists." - }, - help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", - max_length=150, - unique=True, - validators=[ - django.contrib.auth.validators.UnicodeUsernameValidator() - ], - verbose_name="username", - ), - ), - ( - "email", - models.EmailField( - blank=True, max_length=254, verbose_name="email address" - ), - ), - ( - "is_staff", - models.BooleanField( - default=False, - help_text="Designates whether the user can log into this admin site.", - verbose_name="staff status", - ), - ), - ( - "is_active", - models.BooleanField( - default=True, - help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", - verbose_name="active", - ), - ), - ( - "date_joined", - models.DateTimeField( - default=django.utils.timezone.now, verbose_name="date joined" - ), - ), - ( - "name", - models.CharField( - blank=True, max_length=255, verbose_name="Name of User" - ), - ), - ( - "groups", - models.ManyToManyField( - blank=True, - help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", - related_name="user_set", - related_query_name="user", - to="auth.Group", - verbose_name="groups", - ), - ), - ( - "user_permissions", - models.ManyToManyField( - blank=True, - help_text="Specific permissions for this user.", - related_name="user_set", - related_query_name="user", - to="auth.Permission", - verbose_name="user permissions", - ), - ), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), ], options={ - "verbose_name": "user", - "verbose_name_plural": "users", - "abstract": False, + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, }, managers=[ - ("objects", django.contrib.auth.models.UserManager()), + ('objects', django.contrib.auth.models.UserManager()), ], ), ] diff --git a/vbv_lernwelt/users/models.py b/vbv_lernwelt/users/models.py index 8f5356dc..62510db7 100644 --- a/vbv_lernwelt/users/models.py +++ b/vbv_lernwelt/users/models.py @@ -1,21 +1,12 @@ from django.contrib.auth.models import AbstractUser -from django.db.models import CharField from django.urls import reverse -from django.utils.translation import gettext_lazy as _ class User(AbstractUser): """ Default custom user model for VBV Lernwelt. If adding fields that need to be filled at user signup, - check forms.SignupForm and forms.SocialSignupForms accordingly. """ - - #: First and last name do not cover name patterns around the globe - name = CharField(_("Name of User"), blank=True, max_length=255) - first_name = None # type: ignore - last_name = None # type: ignore - def get_absolute_url(self): """Get url for user's detail view. diff --git a/vbv_lernwelt/users/tests/factories.py b/vbv_lernwelt/users/tests/factories.py deleted file mode 100644 index edd306cb..00000000 --- a/vbv_lernwelt/users/tests/factories.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Any, Sequence - -from django.contrib.auth import get_user_model -from factory import Faker, post_generation -from factory.django import DjangoModelFactory - - -class UserFactory(DjangoModelFactory): - - username = Faker("user_name") - email = Faker("email") - name = Faker("name") - - @post_generation - def password(self, create: bool, extracted: Sequence[Any], **kwargs): - password = ( - extracted - if extracted - else Faker( - "password", - length=42, - special_chars=True, - digits=True, - upper_case=True, - lower_case=True, - ).evaluate(None, None, extra={"locale": None}) - ) - self.set_password(password) - - class Meta: - model = get_user_model() - django_get_or_create = ["username"] diff --git a/vbv_lernwelt/users/tests/test_admin.py b/vbv_lernwelt/users/tests/test_admin.py deleted file mode 100644 index d40e08f2..00000000 --- a/vbv_lernwelt/users/tests/test_admin.py +++ /dev/null @@ -1,40 +0,0 @@ -import pytest -from django.urls import reverse - -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -class TestUserAdmin: - def test_changelist(self, admin_client): - url = reverse("admin:users_user_changelist") - response = admin_client.get(url) - assert response.status_code == 200 - - def test_search(self, admin_client): - url = reverse("admin:users_user_changelist") - response = admin_client.get(url, data={"q": "test"}) - assert response.status_code == 200 - - def test_add(self, admin_client): - url = reverse("admin:users_user_add") - response = admin_client.get(url) - assert response.status_code == 200 - - response = admin_client.post( - url, - data={ - "username": "test", - "password1": "My_R@ndom-P@ssw0rd", - "password2": "My_R@ndom-P@ssw0rd", - }, - ) - assert response.status_code == 302 - assert User.objects.filter(username="test").exists() - - def test_view_user(self, admin_client): - user = User.objects.get(username="admin") - url = reverse("admin:users_user_change", kwargs={"object_id": user.pk}) - response = admin_client.get(url) - assert response.status_code == 200 diff --git a/vbv_lernwelt/users/tests/test_drf_urls.py b/vbv_lernwelt/users/tests/test_drf_urls.py deleted file mode 100644 index 280258d2..00000000 --- a/vbv_lernwelt/users/tests/test_drf_urls.py +++ /dev/null @@ -1,24 +0,0 @@ -import pytest -from django.urls import resolve, reverse - -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -def test_user_detail(user: User): - assert ( - reverse("api:user-detail", kwargs={"username": user.username}) - == f"/api/users/{user.username}/" - ) - assert resolve(f"/api/users/{user.username}/").view_name == "api:user-detail" - - -def test_user_list(): - assert reverse("api:user-list") == "/api/users/" - assert resolve("/api/users/").view_name == "api:user-list" - - -def test_user_me(): - assert reverse("api:user-me") == "/api/users/me/" - assert resolve("/api/users/me/").view_name == "api:user-me" diff --git a/vbv_lernwelt/users/tests/test_drf_views.py b/vbv_lernwelt/users/tests/test_drf_views.py deleted file mode 100644 index 40979bcf..00000000 --- a/vbv_lernwelt/users/tests/test_drf_views.py +++ /dev/null @@ -1,33 +0,0 @@ -import pytest -from django.test import RequestFactory - -from vbv_lernwelt.users.api.views import UserViewSet -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -class TestUserViewSet: - def test_get_queryset(self, user: User, rf: RequestFactory): - view = UserViewSet() - request = rf.get("/fake-url/") - request.user = user - - view.request = request - - assert user in view.get_queryset() - - def test_me(self, user: User, rf: RequestFactory): - view = UserViewSet() - request = rf.get("/fake-url/") - request.user = user - - view.request = request - - response = view.me(request) - - assert response.data == { - "username": user.username, - "name": user.name, - "url": f"http://testserver/api/users/{user.username}/", - } diff --git a/vbv_lernwelt/users/tests/test_forms.py b/vbv_lernwelt/users/tests/test_forms.py deleted file mode 100644 index 95d41469..00000000 --- a/vbv_lernwelt/users/tests/test_forms.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -Module for all Form Tests. -""" -import pytest -from django.utils.translation import gettext_lazy as _ - -from vbv_lernwelt.users.forms import UserAdminCreationForm -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -class TestUserAdminCreationForm: - """ - Test class for all tests related to the UserAdminCreationForm - """ - - def test_username_validation_error_msg(self, user: User): - """ - Tests UserAdminCreation Form's unique validator functions correctly by testing: - 1) A new user with an existing username cannot be added. - 2) Only 1 error is raised by the UserCreation Form - 3) The desired error message is raised - """ - - # The user already exists, - # hence cannot be created. - form = UserAdminCreationForm( - { - "username": user.username, - "password1": user.password, - "password2": user.password, - } - ) - - assert not form.is_valid() - assert len(form.errors) == 1 - assert "username" in form.errors - assert form.errors["username"][0] == _("This username has already been taken.") diff --git a/vbv_lernwelt/users/tests/test_models.py b/vbv_lernwelt/users/tests/test_models.py deleted file mode 100644 index 19a28851..00000000 --- a/vbv_lernwelt/users/tests/test_models.py +++ /dev/null @@ -1,9 +0,0 @@ -import pytest - -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -def test_user_get_absolute_url(user: User): - assert user.get_absolute_url() == f"/users/{user.username}/" diff --git a/vbv_lernwelt/users/tests/test_swagger_ui.py b/vbv_lernwelt/users/tests/test_swagger_ui.py deleted file mode 100644 index b0c24d91..00000000 --- a/vbv_lernwelt/users/tests/test_swagger_ui.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest -from django.urls import reverse - -pytestmark = pytest.mark.django_db - - -def test_swagger_accessible_by_admin(admin_client): - url = reverse("api-docs") - response = admin_client.get(url) - assert response.status_code == 200 - - -def test_swagger_ui_not_accessible_by_normal_user(client): - url = reverse("api-docs") - response = client.get(url) - assert response.status_code == 403 diff --git a/vbv_lernwelt/users/tests/test_urls.py b/vbv_lernwelt/users/tests/test_urls.py deleted file mode 100644 index 19abdc64..00000000 --- a/vbv_lernwelt/users/tests/test_urls.py +++ /dev/null @@ -1,24 +0,0 @@ -import pytest -from django.urls import resolve, reverse - -from vbv_lernwelt.users.models import User - -pytestmark = pytest.mark.django_db - - -def test_detail(user: User): - assert ( - reverse("users:detail", kwargs={"username": user.username}) - == f"/users/{user.username}/" - ) - assert resolve(f"/users/{user.username}/").view_name == "users:detail" - - -def test_update(): - assert reverse("users:update") == "/users/~update/" - assert resolve("/users/~update/").view_name == "users:update" - - -def test_redirect(): - assert reverse("users:redirect") == "/users/~redirect/" - assert resolve("/users/~redirect/").view_name == "users:redirect" diff --git a/vbv_lernwelt/users/tests/test_views.py b/vbv_lernwelt/users/tests/test_views.py deleted file mode 100644 index 9a47bad3..00000000 --- a/vbv_lernwelt/users/tests/test_views.py +++ /dev/null @@ -1,102 +0,0 @@ -import pytest -from django.conf import settings -from django.contrib import messages -from django.contrib.auth.models import AnonymousUser -from django.contrib.messages.middleware import MessageMiddleware -from django.contrib.sessions.middleware import SessionMiddleware -from django.http import HttpRequest, HttpResponseRedirect -from django.test import RequestFactory -from django.urls import reverse - -from vbv_lernwelt.users.forms import UserAdminChangeForm -from vbv_lernwelt.users.models import User -from vbv_lernwelt.users.tests.factories import UserFactory -from vbv_lernwelt.users.views import ( - UserRedirectView, - UserUpdateView, - user_detail_view, -) - -pytestmark = pytest.mark.django_db - - -class TestUserUpdateView: - """ - TODO: - extracting view initialization code as class-scoped fixture - would be great if only pytest-django supported non-function-scoped - fixture db access -- this is a work-in-progress for now: - https://github.com/pytest-dev/pytest-django/pull/258 - """ - - def dummy_get_response(self, request: HttpRequest): - return None - - def test_get_success_url(self, user: User, rf: RequestFactory): - view = UserUpdateView() - request = rf.get("/fake-url/") - request.user = user - - view.request = request - - assert view.get_success_url() == f"/users/{user.username}/" - - def test_get_object(self, user: User, rf: RequestFactory): - view = UserUpdateView() - request = rf.get("/fake-url/") - request.user = user - - view.request = request - - assert view.get_object() == user - - def test_form_valid(self, user: User, rf: RequestFactory): - view = UserUpdateView() - request = rf.get("/fake-url/") - - # Add the session/message middleware to the request - SessionMiddleware(self.dummy_get_response).process_request(request) - MessageMiddleware(self.dummy_get_response).process_request(request) - request.user = user - - view.request = request - - # Initialize the form - form = UserAdminChangeForm() - form.cleaned_data = [] - view.form_valid(form) - - messages_sent = [m.message for m in messages.get_messages(request)] - assert messages_sent == ["Information successfully updated"] - - -class TestUserRedirectView: - def test_get_redirect_url(self, user: User, rf: RequestFactory): - view = UserRedirectView() - request = rf.get("/fake-url") - request.user = user - - view.request = request - - assert view.get_redirect_url() == f"/users/{user.username}/" - - -class TestUserDetailView: - def test_authenticated(self, user: User, rf: RequestFactory): - request = rf.get("/fake-url/") - request.user = UserFactory() - - response = user_detail_view(request, username=user.username) - - assert response.status_code == 200 - - def test_not_authenticated(self, user: User, rf: RequestFactory): - request = rf.get("/fake-url/") - request.user = AnonymousUser() - - response = user_detail_view(request, username=user.username) - login_url = reverse(settings.LOGIN_URL) - - assert isinstance(response, HttpResponseRedirect) - assert response.status_code == 302 - assert response.url == f"{login_url}?next=/fake-url/" diff --git a/vbv_lernwelt/users/urls.py b/vbv_lernwelt/users/urls.py index 9b47929a..8b137891 100644 --- a/vbv_lernwelt/users/urls.py +++ b/vbv_lernwelt/users/urls.py @@ -1,14 +1 @@ -from django.urls import path -from vbv_lernwelt.users.views import ( - user_detail_view, - user_redirect_view, - user_update_view, -) - -app_name = "users" -urlpatterns = [ - path("~redirect/", view=user_redirect_view, name="redirect"), - path("~update/", view=user_update_view, name="update"), - path("/", view=user_detail_view, name="detail"), -] diff --git a/vbv_lernwelt/users/views.py b/vbv_lernwelt/users/views.py index baa04a0d..139597f9 100644 --- a/vbv_lernwelt/users/views.py +++ b/vbv_lernwelt/users/views.py @@ -1,48 +1,2 @@ -from django.contrib.auth import get_user_model -from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib.messages.views import SuccessMessageMixin -from django.urls import reverse -from django.utils.translation import gettext_lazy as _ -from django.views.generic import DetailView, RedirectView, UpdateView - -User = get_user_model() -class UserDetailView(LoginRequiredMixin, DetailView): - - model = User - slug_field = "username" - slug_url_kwarg = "username" - - -user_detail_view = UserDetailView.as_view() - - -class UserUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): - - model = User - fields = ["name"] - success_message = _("Information successfully updated") - - def get_success_url(self): - assert ( - self.request.user.is_authenticated - ) # for mypy to know that the user is authenticated - return self.request.user.get_absolute_url() - - def get_object(self): - return self.request.user - - -user_update_view = UserUpdateView.as_view() - - -class UserRedirectView(LoginRequiredMixin, RedirectView): - - permanent = False - - def get_redirect_url(self): - return reverse("users:detail", kwargs={"username": self.request.user.username}) - - -user_redirect_view = UserRedirectView.as_view()