From 24bdb46c81f349c941d6391bd93780a9c06f32ce Mon Sep 17 00:00:00 2001 From: VitalinaMykoliuk Date: Thu, 2 Jan 2025 17:42:53 +0200 Subject: [PATCH 1/5] Add core settings, urls, pyproject.toml, and base.html --- core/settings.py | 33 +++++++++++++- core/urls.py | 1 + pyproject.toml | 1 + tracker/templates/base.html | 86 +++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 tracker/templates/base.html diff --git a/core/settings.py b/core/settings.py index 43f595e..783b79d 100644 --- a/core/settings.py +++ b/core/settings.py @@ -28,7 +28,7 @@ SECRET_KEY = os.environ.get("SECRET_KEY") # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True if os.environ.get("DEBUG") == "True" else False +DEBUG = True ALLOWED_HOSTS = ( [ @@ -51,6 +51,10 @@ "django.contrib.staticfiles", # third party apps "django_celery_beat", + "allauth", + "allauth.account", + "allauth.socialaccount", + "allauth.socialaccount.providers.github", # custom apps "tracker", ] @@ -63,6 +67,7 @@ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "allauth.account.middleware.AccountMiddleware", ] ROOT_URLCONF = "core.urls" @@ -162,3 +167,29 @@ # Custom app settings DEFAULT_SCHEDULE_INTERVAL = 3600 + +# Django-Allauth settings +AUTHENTICATION_BACKENDS = ( + "django.contrib.auth.backends.ModelBackend", + "allauth.account.auth_backends.AuthenticationBackend", +) + +LOGIN_REDIRECT_URL = "/" +ACCOUNT_LOGOUT_REDIRECT_URL = "/" + +SITE_ID = 1 + +SOCIALACCOUNT_PROVIDERS = { + "github": { + "APP": { + "client_id": os.environ.get("GITHUB_CLIENT_ID"), + "secret": os.environ.get("GITHUB_CLIENT_SECRET"), + "key": "", + } + } +} + +ACCOUNT_USER_MODEL_USERNAME_FIELD = None +ACCOUNT_AUTHENTICATION_METHOD = "email" +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_USERNAME_REQUIRED = False diff --git a/core/urls.py b/core/urls.py index 137ac1b..6a597fe 100644 --- a/core/urls.py +++ b/core/urls.py @@ -23,4 +23,5 @@ urlpatterns = [ path("admin/", admin.site.urls), path("", include("tracker.urls")), + path("accounts/", include("allauth.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/pyproject.toml b/pyproject.toml index 032400c..20dfb86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ celery = "^5.4.0" django-celery-beat = "^2.7.0" redis = "^5.2.0" faker = "^33.1.0" +django-allauth = "^65.3.1" [build-system] diff --git a/tracker/templates/base.html b/tracker/templates/base.html new file mode 100644 index 0000000..db47bb5 --- /dev/null +++ b/tracker/templates/base.html @@ -0,0 +1,86 @@ +{% load i18n %} + + + + + + + {% block head_title %} + {% endblock head_title %} + + {% block extra_head %} + {% endblock extra_head %} + + + {% block body %} + {% if messages %} +
+ {% trans "Messages:" %} + +
+ {% endif %} +
+ {% trans "Menu:" %} + +
+ {% block content %} + {% endblock content %} + {% endblock body %} + {% block extra_body %} + {% endblock extra_body %} + + \ No newline at end of file From df4440ee02316f379217a0b00ea9b87f2bb8cde6 Mon Sep 17 00:00:00 2001 From: VitalinaMykoliuk Date: Sat, 4 Jan 2025 17:42:46 +0200 Subject: [PATCH 2/5] Add settings, signup.html --- core/settings.py | 10 +++++----- tracker/templates/signup.html | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/settings.py b/core/settings.py index 783b79d..db4ad2e 100644 --- a/core/settings.py +++ b/core/settings.py @@ -28,7 +28,8 @@ SECRET_KEY = os.environ.get("SECRET_KEY") # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = True if os.environ.get("DEBUG") == "True" else False + ALLOWED_HOSTS = ( [ @@ -174,17 +175,16 @@ "allauth.account.auth_backends.AuthenticationBackend", ) -LOGIN_REDIRECT_URL = "/" -ACCOUNT_LOGOUT_REDIRECT_URL = "/" +LOGIN_REDIRECT_URL = "LOGIN_REDIRECT_URL" +ACCOUNT_LOGOUT_REDIRECT_URL = "ACCOUNT_LOGOUT_REDIRECT_URL" -SITE_ID = 1 +SITE_ID = "SITE_ID" SOCIALACCOUNT_PROVIDERS = { "github": { "APP": { "client_id": os.environ.get("GITHUB_CLIENT_ID"), "secret": os.environ.get("GITHUB_CLIENT_SECRET"), - "key": "", } } } diff --git a/tracker/templates/signup.html b/tracker/templates/signup.html index 8d19fe9..6f031fc 100644 --- a/tracker/templates/signup.html +++ b/tracker/templates/signup.html @@ -68,7 +68,7 @@
{{ form.role }} -
+
@@ -76,6 +76,7 @@ Log in + Sign in with GitHub
From f4d165fc90ee499c17d142c627b147f8fe6c1197 Mon Sep 17 00:00:00 2001 From: VitalinaMykoliuk Date: Fri, 10 Jan 2025 16:22:28 +0200 Subject: [PATCH 3/5] =?UTF-8?q?=20add=20settings.py=20=D0=B8=20signup.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/settings.py | 16 ++-- tracker/templates/base.html | 86 ------------------- tracker/templates/signup.html | 156 +++++++++++++++++++--------------- 3 files changed, 98 insertions(+), 160 deletions(-) delete mode 100644 tracker/templates/base.html diff --git a/core/settings.py b/core/settings.py index db4ad2e..105b080 100644 --- a/core/settings.py +++ b/core/settings.py @@ -175,20 +175,22 @@ "allauth.account.auth_backends.AuthenticationBackend", ) -LOGIN_REDIRECT_URL = "LOGIN_REDIRECT_URL" -ACCOUNT_LOGOUT_REDIRECT_URL = "ACCOUNT_LOGOUT_REDIRECT_URL" +LOGIN_REDIRECT_URL = os.environ.get("LOGIN_REDIRECT_URL") +ACCOUNT_LOGOUT_REDIRECT_URL = os.environ.get("ACCOUNT_LOGOUT_REDIRECT_URL") -SITE_ID = "SITE_ID" +SITE_ID = int(os.environ.get("SITE_ID", 1)) + +SOCIAL_AUTH_GITHUB_KEY = os.environ.get("GITHUB_CLIENT_ID") +SOCIAL_AUTH_GITHUB_SECRET = os.environ.get("GITHUB_CLIENT_SECRET") SOCIALACCOUNT_PROVIDERS = { "github": { - "APP": { - "client_id": os.environ.get("GITHUB_CLIENT_ID"), - "secret": os.environ.get("GITHUB_CLIENT_SECRET"), - } + "SCOPE": ["user", "repo"], + "AUTH_PARAMS": {"scope": "user"}, } } + ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_AUTHENTICATION_METHOD = "email" ACCOUNT_EMAIL_REQUIRED = True diff --git a/tracker/templates/base.html b/tracker/templates/base.html deleted file mode 100644 index db47bb5..0000000 --- a/tracker/templates/base.html +++ /dev/null @@ -1,86 +0,0 @@ -{% load i18n %} - - - - - - - {% block head_title %} - {% endblock head_title %} - - {% block extra_head %} - {% endblock extra_head %} - - - {% block body %} - {% if messages %} -
- {% trans "Messages:" %} -
    - {% for message in messages %}
  • {{ message }}
  • {% endfor %} -
-
- {% endif %} -
- {% trans "Menu:" %} - -
- {% block content %} - {% endblock content %} - {% endblock body %} - {% block extra_body %} - {% endblock extra_body %} - - \ No newline at end of file diff --git a/tracker/templates/signup.html b/tracker/templates/signup.html index 6f031fc..008d1a4 100644 --- a/tracker/templates/signup.html +++ b/tracker/templates/signup.html @@ -1,4 +1,6 @@ {% load static %} +{% load socialaccount %} + @@ -13,82 +15,102 @@ - - {% if messages %} -
    - {% for message in messages %} -
  • {{ message }}
  • - {% endfor %} -
- {% endif %} - - + +{% if messages %} +
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+{% endif %} -
- + +
+
+
+
+
+ {% csrf_token %} +
+ + +
+
+ + +
+
+ + +
+
+ + {{ form.role }} +
+
+ +
+
+ Log in +
+
+ +

Sign in with GitHub:

+ + + GitHub + Sign in with GitHub + -
-
-
-
-
- {% csrf_token %} -
- - -
-
- - -
-
- - -
-
- - {{ form.role }} -
-
- -
-
- Log in -
-
- Sign in with GitHub -
-
+ {% providers_media_js %}
-
-
+
+
+
+
- - - + + + + + + + + + + + + From 8c4e5f5d0cde5558310bcff1d545934e37a3be65 Mon Sep 17 00:00:00 2001 From: VitalinaMykoliuk Date: Tue, 14 Jan 2025 21:04:22 +0200 Subject: [PATCH 4/5] login to django admin using github --- core/settings.py | 4 +- tracker/templates/signup.html | 134 ++++++++++++++++++++-------------- 2 files changed, 83 insertions(+), 55 deletions(-) diff --git a/core/settings.py b/core/settings.py index 105b080..9dd64b4 100644 --- a/core/settings.py +++ b/core/settings.py @@ -175,8 +175,8 @@ "allauth.account.auth_backends.AuthenticationBackend", ) -LOGIN_REDIRECT_URL = os.environ.get("LOGIN_REDIRECT_URL") -ACCOUNT_LOGOUT_REDIRECT_URL = os.environ.get("ACCOUNT_LOGOUT_REDIRECT_URL") +LOGIN_REDIRECT_URL = "/admin/" +ACCOUNT_LOGOUT_REDIRECT_URL = "/admin/" SITE_ID = int(os.environ.get("SITE_ID", 1)) diff --git a/tracker/templates/signup.html b/tracker/templates/signup.html index 008d1a4..668a23c 100644 --- a/tracker/templates/signup.html +++ b/tracker/templates/signup.html @@ -1,6 +1,5 @@ {% load static %} {% load socialaccount %} - @@ -14,6 +13,44 @@ + {% if messages %} @@ -51,41 +88,51 @@
-
- {% csrf_token %} -
- - -
-
- - -
-
- - -
-
- - {{ form.role }} -
-
- -
-
- Log in -
-
+ +
+ + +
+ + + -

Sign in with GitHub:

- - - GitHub - Sign in with GitHub - + +

@@ -93,24 +140,5 @@
- - - - - - - - - - - - - - - From 3ca518d563b9f720742fc93a5ba301b737249a6d Mon Sep 17 00:00:00 2001 From: VitalinaMykoliuk Date: Thu, 23 Jan 2025 20:13:00 +0200 Subject: [PATCH 5/5] Add settings, adapter and signup.html --- core/settings.py | 10 ++++++++-- tracker/adapter.py | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tracker/adapter.py diff --git a/core/settings.py b/core/settings.py index ff9783e..2584913 100644 --- a/core/settings.py +++ b/core/settings.py @@ -50,6 +50,7 @@ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.sites", # third party apps "django_celery_beat", "allauth", @@ -185,12 +186,17 @@ SOCIALACCOUNT_PROVIDERS = { "github": { - "SCOPE": ["user", "repo"], - "AUTH_PARAMS": {"scope": "user"}, + "SCOPE": ["read:user", "user:email"], } } +SOCIALACCOUNT_ADAPTER = "tracker.adapter.CustomSocialAccountAdapter" +SOCIALACCOUNT_LOGIN_ON_GET = True +SOCIALACCOUNT_STORE_TOKENS = True +SOCIALACCOUNT_QUERY_EMAIL = True + +ACCOUNT_EMAIL_VERIFICATION = "optional" ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_AUTHENTICATION_METHOD = "email" ACCOUNT_EMAIL_REQUIRED = True diff --git a/tracker/adapter.py b/tracker/adapter.py new file mode 100644 index 0000000..7f3040d --- /dev/null +++ b/tracker/adapter.py @@ -0,0 +1,21 @@ +from allauth.socialaccount.adapter import DefaultSocialAccountAdapter +from django.contrib.auth import get_user_model + + +User = get_user_model() + + +class CustomSocialAccountAdapter(DefaultSocialAccountAdapter): + def pre_social_login(self, request, sociallogin): + """ + Processes a login attempt before registration. + If a user with such an email exists, associates it with the social account. + """ + if not sociallogin.is_existing: + email = sociallogin.account.extra_data.get("email") + if email: + try: + user = User.objects.get(email=email) + sociallogin.connect(request, user) + except User.DoesNotExist: + pass