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 7b9d29a2..bb793763 100644
Binary files a/env_secrets/production.env and b/env_secrets/production.env differ
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" %}
-
-
-
-{% 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 %}
-
-
-
-{% 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" %}
-
-
-
{% translate "or" %}
-
-
-
- {% 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?' %}
-
-
-{% 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" %}
-
-
-{% 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." %}
-
-
-
- {% 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 %}
-
- {% 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" %}
-
-
-{% 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 @@
About
- {% if request.user.is_authenticated %}
-
+{# {% if request.user.is_authenticated %}#}
+{# #}
{# URL provided by django-allauth/account/urls.py #}
- {% translate "My Profile" %}
-
-
+{# {% translate "My Profile" %} #}
+{# #}
+{# #}
{# URL provided by django-allauth/account/urls.py #}
- {% translate "Sign Out" %}
-
- {% else %}
- {% if ACCOUNT_ALLOW_REGISTRATION %}
-
+{# {% translate "Sign Out" %} #}
+{# #}
+{# {% else %}#}
+{# {% if ACCOUNT_ALLOW_REGISTRATION %}#}
+{# #}
{# URL provided by django-allauth/account/urls.py #}
- {% translate "Sign Up" %}
-
- {% endif %}
-
+{# {% translate "Sign Up" %} #}
+{# #}
+{# {% endif %}#}
+{# #}
{# URL provided by django-allauth/account/urls.py #}
- {% translate "Sign In" %}
-
- {% 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 %}
-
-
-
-{% 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 }}
-
-{% 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()