diff --git a/rc_hip/rc_hip/settings.py b/rc_hip/rc_hip/settings.py index b5c9c16..c602302 100644 --- a/rc_hip/rc_hip/settings.py +++ b/rc_hip/rc_hip/settings.py @@ -41,6 +41,7 @@ ALLOWED_HOSTS = [ # Application definition INSTALLED_APPS = [ + 'repapp_users.apps.RepappUsersConfig', 'repapp.apps.RepappConfig', 'django.contrib.admin', 'django.contrib.auth', @@ -150,3 +151,7 @@ EMAIL_PORT = (int)(os.getenv("DJANGO_EMAIL_PORT", '25')) EMAIL_HOST_USER = os.getenv("DJANGO_EMAIL_HOST_USER", None) EMAIL_HOST_PASSWORD = os.getenv("DJANGO_EMAIL_HOST_PASSWORD", None) EMAIL_USE_TLS = os.getenv("DJANGO_EMAIL_USE_TLS", 'true') in ('true', '1', 't') + +AUTH_USER_MODEL = "repapp_users.CustomUser" +AUTHENTICATION_BACKENDS = [ + "repapp_users.backends.EmailBackend", "django.contrib.auth.backends.ModelBackend"] diff --git a/rc_hip/rc_hip/urls.py b/rc_hip/rc_hip/urls.py index 2469ed7..e83b2f9 100644 --- a/rc_hip/rc_hip/urls.py +++ b/rc_hip/rc_hip/urls.py @@ -22,5 +22,7 @@ from django.conf.urls.static import static urlpatterns = [ path("", include("repapp.urls")), + path("", include("repapp_users.urls")), + path('users/', include('django.contrib.auth.urls')), path('admin/', admin.site.urls), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/rc_hip/repapp/admin.py b/rc_hip/repapp/admin.py index 0bccd55..f08860d 100644 --- a/rc_hip/repapp/admin.py +++ b/rc_hip/repapp/admin.py @@ -2,7 +2,6 @@ Admin interface configuration for RepApp. """ from django.contrib import admin - from .models import (Organisator, Cafe, Question, Device, Reparateur, Appointment, Guest, Candidate) diff --git a/rc_hip/repapp/migrations/0013_alter_cafe_address_alter_device_device_and_more.py b/rc_hip/repapp/migrations/0013_alter_cafe_address_alter_device_device_and_more.py index 0155f4c..dd81294 100644 --- a/rc_hip/repapp/migrations/0013_alter_cafe_address_alter_device_device_and_more.py +++ b/rc_hip/repapp/migrations/0013_alter_cafe_address_alter_device_device_and_more.py @@ -18,7 +18,8 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='device', name='device', - field=models.CharField(max_length=200, verbose_name='Art des Geräts'), + field=models.CharField( + max_length=200, verbose_name='Art des Geräts'), ), migrations.AlterField( model_name='device', @@ -28,6 +29,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='device', name='manufacturer', - field=models.CharField(max_length=200, verbose_name='Hersteller & Modell/Typ'), + field=models.CharField( + max_length=200, verbose_name='Hersteller & Modell/Typ'), ), ] diff --git a/rc_hip/repapp_users/__init__.py b/rc_hip/repapp_users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rc_hip/repapp_users/admin.py b/rc_hip/repapp_users/admin.py new file mode 100644 index 0000000..5cd50eb --- /dev/null +++ b/rc_hip/repapp_users/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import CustomUser + +admin.site.register(CustomUser) diff --git a/rc_hip/repapp_users/apps.py b/rc_hip/repapp_users/apps.py new file mode 100644 index 0000000..3ed1ca5 --- /dev/null +++ b/rc_hip/repapp_users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RepappUsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'repapp_users' diff --git a/rc_hip/repapp_users/backends.py b/rc_hip/repapp_users/backends.py new file mode 100644 index 0000000..169d764 --- /dev/null +++ b/rc_hip/repapp_users/backends.py @@ -0,0 +1,15 @@ +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend + + +class EmailBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + UserModel = get_user_model() + try: + user = UserModel.objects.get(email=username) + except UserModel.DoesNotExist: + return None + else: + if user.check_password(password): + return user + return None diff --git a/rc_hip/repapp_users/forms.py b/rc_hip/repapp_users/forms.py new file mode 100644 index 0000000..e69de29 diff --git a/rc_hip/repapp_users/migrations/0001_initial.py b/rc_hip/repapp_users/migrations/0001_initial.py new file mode 100644 index 0000000..c67c117 --- /dev/null +++ b/rc_hip/repapp_users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2 on 2023-04-23 10:29 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + 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')), + ('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')), + ('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')), + ('email', models.EmailField(max_length=254, unique=True)), + ('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, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/rc_hip/repapp_users/migrations/__init__.py b/rc_hip/repapp_users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rc_hip/repapp_users/models.py b/rc_hip/repapp_users/models.py new file mode 100644 index 0000000..2770e12 --- /dev/null +++ b/rc_hip/repapp_users/models.py @@ -0,0 +1,14 @@ +from django.contrib.auth.models import AbstractUser +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class CustomUser(AbstractUser): + email = models.EmailField(unique=True, verbose_name=_("eMail Adresse")) + + class Meta: + verbose_name = _('Benutzer') + verbose_name_plural = _('Benutzer') + + def __str__(self): + return f'{self.email}' diff --git a/rc_hip/repapp_users/templates/login.html b/rc_hip/repapp_users/templates/login.html new file mode 100644 index 0000000..f2307c7 --- /dev/null +++ b/rc_hip/repapp_users/templates/login.html @@ -0,0 +1,33 @@ +{% extends "repapp/base.html" %} +{% block content %} + {% if form.errors %}
Your username and password didn't match. Please try again.
{% endif %} + {% if next %} + {% if user.is_authenticated %} ++ Your account doesn't have access to this page. To proceed, + please login with an account that has access. +
+ {% else %} +Please login to see this page.
+ {% endif %} + {% endif %} + + {# Assumes you setup the password_reset view in your URLconf #} ++ Lost password? +
+{% endblock %} diff --git a/rc_hip/repapp_users/tests.py b/rc_hip/repapp_users/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/rc_hip/repapp_users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/rc_hip/repapp_users/urls.py b/rc_hip/repapp_users/urls.py new file mode 100644 index 0000000..ad783e1 --- /dev/null +++ b/rc_hip/repapp_users/urls.py @@ -0,0 +1,4 @@ +from django.urls import path, include + +urlpatterns = [ +] diff --git a/rc_hip/repapp_users/views.py b/rc_hip/repapp_users/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/rc_hip/repapp_users/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.