From 8b7009a174b5317e0272e6ff4a17d88777b5ce7b Mon Sep 17 00:00:00 2001 From: Hemant <133942800+hk2166@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:55:02 +0530 Subject: [PATCH] add preferred login provider selection for social auth --- .../templates/eventyay_common/auth/login.html | 48 ++++- app/eventyay/eventyay_common/views/auth.py | 18 +- .../socialauth/schemas/login_providers.py | 1 + .../socialauth/social_auth_settings.html | 183 ++++++++++-------- app/eventyay/plugins/socialauth/views.py | 4 + deployment/docker-compose.yml | 12 ++ deployment/eventyay.cfg | 51 +++++ setup.md | 12 ++ 8 files changed, 241 insertions(+), 88 deletions(-) create mode 100644 deployment/eventyay.cfg create mode 100644 setup.md diff --git a/app/eventyay/eventyay_common/templates/eventyay_common/auth/login.html b/app/eventyay/eventyay_common/templates/eventyay_common/auth/login.html index 9cbb8dc8fb..2286471641 100644 --- a/app/eventyay/eventyay_common/templates/eventyay_common/auth/login.html +++ b/app/eventyay/eventyay_common/templates/eventyay_common/auth/login.html @@ -49,12 +49,47 @@
- {% if login_providers %} + {% comment %} First, show the preferred login provider {% endcomment %} {% for provider, settings in login_providers.items %} - {% if settings.state %} + {% if settings.state and settings.preferred %} + + {% with provider|capfirst as provider_capitalized %} + {% blocktranslate %}Login with {{ provider_capitalized }}{% endblocktranslate %} + {% endwith %} + + {% endif %} + {% endfor %} + + {% comment %} Check if there are any other enabled providers {% endcomment %} + {% with has_other_providers=False %} + {% for provider, settings in login_providers.items %} + {% if settings.state and not settings.preferred %} + {% with has_other_providers=True %}{% endwith %} + {% endif %} + {% endfor %} + {% endwith %} + + {% comment %} Show "or use the following:" text if there are other providers or email login {% endcomment %} + {% if login_providers %} + {% for provider, settings in login_providers.items %} + {% if settings.state and settings.preferred %} +

+ {% translate "or use the following:" %} +

+ {% endif %} + {% endfor %} + {% endif %} + + {% comment %} Show email login button {% endcomment %} + + + {% comment %} Then, show other enabled providers {% endcomment %} + {% for provider, settings in login_providers.items %} + {% if settings.state and not settings.preferred %} {% with provider|capfirst as provider_capitalized %} @@ -63,6 +98,11 @@ {% endif %} {% endfor %} + {% else %} + {% comment %} No social login providers, just show email login {% endcomment %} + {% endif %}
diff --git a/app/eventyay/eventyay_common/views/auth.py b/app/eventyay/eventyay_common/views/auth.py index 674bc8b6ba..86e1e98cf0 100644 --- a/app/eventyay/eventyay_common/views/auth.py +++ b/app/eventyay/eventyay_common/views/auth.py @@ -140,7 +140,23 @@ def login(request): request, form.user_cache, form.cleaned_data.get('keep_logged_in', False) ) else: - form = LoginForm(backend=backend, request=request) + gs = GlobalSettingsObject() + login_providers = gs.settings.get('login_providers', as_type=dict) + + # Check if there's a preferred provider - if so, pre-select "Keep me logged in" + has_preferred_provider = any( + settings.get('preferred', False) + for settings in login_providers.values() + if settings.get('state', False) + ) if login_providers else False + + # Initialize form with keep_logged_in pre-selected if there's a preferred provider + initial_data = {} + if has_preferred_provider and 'keep_logged_in' in LoginForm(backend=backend, request=request).fields: + initial_data['keep_logged_in'] = True + + form = LoginForm(backend=backend, request=request, initial=initial_data) + ctx['form'] = form ctx['can_register'] = settings.EVENTYAY_REGISTRATION ctx['can_reset'] = settings.EVENTYAY_PASSWORD_RESET diff --git a/app/eventyay/plugins/socialauth/schemas/login_providers.py b/app/eventyay/plugins/socialauth/schemas/login_providers.py index fc9e6b6d71..827dca3995 100644 --- a/app/eventyay/plugins/socialauth/schemas/login_providers.py +++ b/app/eventyay/plugins/socialauth/schemas/login_providers.py @@ -5,6 +5,7 @@ class ProviderConfig(BaseModel): state: bool = Field(description='State of this providers', default=False) client_id: str = Field(description='Client ID of this provider', default='') secret: str = Field(description='Secret of this provider', default='') + preferred: bool = Field(description='Is this the preferred login method', default=False) class LoginProviders(BaseModel): diff --git a/app/eventyay/plugins/socialauth/templates/socialauth/social_auth_settings.html b/app/eventyay/plugins/socialauth/templates/socialauth/social_auth_settings.html index 6df5f8a539..76cb9f53f8 100644 --- a/app/eventyay/plugins/socialauth/templates/socialauth/social_auth_settings.html +++ b/app/eventyay/plugins/socialauth/templates/socialauth/social_auth_settings.html @@ -4,89 +4,106 @@ {% load rich_text %} {% block title %}{% trans "Social login settings" %}{% endblock %} + {% block content %} - -
- {% csrf_token %} - {% if "success" in request.GET %} -
- {% trans "Your changes have been saved." %} -
- {% endif %} -
-
- {% trans "Social login providers" %} -
- - {% for provider, settings in login_providers.items %} - - - - - {% if settings.state %} - - - - {% endif %} - {% endfor %} -
- {% with provider|capfirst as provider_capitalized %} - {% trans provider_capitalized %} -

{% blocktrans %}Login with {{ provider_capitalized }}{% endblocktrans %}

- {% endwith %} -
- {% if settings.state %} - - {% else %} - - {% endif %} -
-
- -
- -
-
-
- -
- -
-
-
+ + + {% csrf_token %} + {% if "success" in request.GET %} +
+ {% trans "Your changes have been saved." %} +
+ {% endif %} +
+
+ {% trans "Social login providers" %} +
+ + {% for provider, settings in login_providers.items %} + + + + + {% if settings.state %} + + + + {% endif %} + {% endfor %} +
+ {% with provider|capfirst as provider_capitalized %} + {{ provider_capitalized }} +

{% blocktrans with name=provider_capitalized %}Login with {{ name }}{% endblocktrans %}

+ {% endwith %} +
+ {% if settings.state %} + + {% else %} + + {% endif %} +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+

+ {% trans "The preferred login method will be shown first and emphasized in the login page." %} +

- -
- {% include "socialauth/social_setup.html" %} -
-
-
- -
- + +
+
+
+
+ {% include "socialauth/social_setup.html" %} +
+
+
+ +
+ {% endblock %} diff --git a/app/eventyay/plugins/socialauth/views.py b/app/eventyay/plugins/socialauth/views.py index 003c875fd6..1feaa5722c 100644 --- a/app/eventyay/plugins/socialauth/views.py +++ b/app/eventyay/plugins/socialauth/views.py @@ -161,12 +161,16 @@ def get_context_data(self, **kwargs): def post(self, request, *args, **kwargs): login_providers = self.gs.settings.get('login_providers', as_type=dict) setting_state = request.POST.get('save_credentials', '').lower() + preferred_provider = request.POST.get('preferred_login_provider', '') for provider in LoginProviders.model_fields.keys(): if setting_state == self.SettingState.CREDENTIALS: self.update_credentials(request, provider, login_providers) else: self.update_provider_state(request, provider, login_providers) + + # Update preferred status + login_providers[provider]['preferred'] = (provider == preferred_provider) self.gs.settings.set('login_providers', login_providers) return redirect(self.get_success_url()) diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 24dcfe79df..77d7753ef1 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -2,6 +2,9 @@ name: eventyay-next services: web: + build: + context: ../app + dockerfile: Dockerfile image: eventyay/eventyay-next:enext container_name: eventyay-next-web command: gunicorn eventyay.config.wsgi:application --bind 0.0.0.0:8000 @@ -9,6 +12,7 @@ services: - ./data/static:/home/app/web/eventyay/static.dist - ./data/data:/data - ./eventyay.cfg:/etc/eventyay.cfg:ro + - ../app/eventyay:/usr/src/app/eventyay ports: - 8000:8000 expose: @@ -20,12 +24,16 @@ services: - redis websocket: + build: + context: ../app + dockerfile: Dockerfile image: eventyay/eventyay-next:enext container_name: eventyay-next-websocket entrypoint: daphne -b 0.0.0.0 -p 8001 eventyay.config.asgi:application volumes: - ./data/data:/data - ./eventyay.cfg:/etc/eventyay.cfg:ro + - ../app/eventyay:/usr/src/app/eventyay ports: - 8001:8001 expose: @@ -39,11 +47,15 @@ services: - redis worker: + build: + context: ../app + dockerfile: Dockerfile image: eventyay/eventyay-next:enext container_name: eventyay-next-worker entrypoint: celery -A eventyay worker -l info volumes: - ./eventyay.cfg:/etc/eventyay.cfg:ro + - ../app/eventyay:/usr/src/app/eventyay env_file: - ./.env environment: diff --git a/deployment/eventyay.cfg b/deployment/eventyay.cfg new file mode 100644 index 0000000000..b82860861d --- /dev/null +++ b/deployment/eventyay.cfg @@ -0,0 +1,51 @@ +[eventyay] +instance_name=eventyay +#url=https://app.eventyay.com/tickets +url=http://localhost:8000 +currency=USD +; DO NOT change the following value, it has to be set to the location of the +; directory *inside* the docker container +datadir=/data +trust_x_forwarded_for=on +trust_x_forwarded_proto=on +registration=on +talk_hostname=http://localhost:8000 +video_server_hostname=http://localhost:8443 +base_path=/tickets + +[urls] +static=/static/ +media=/media/ + +[locale] +default=en +# The following doesn't really work: +#timezone=America/Denver +# because (??) the machines run on UTC time and with this setting +# celery communication has a time difference, giving: +# eventyay-tickets | [2024-06-08 22:21:15,313: WARNING/MainProcess] Substantial drift from celery@5f47a4113906 may mean clocks are out of sync. Current drift is 21600 seconds. [orig: 2024-06-08 22:21:15.313012 recv: 2024-06-09 04:21:15.310646] +# which is 6h difference which seems to be the diff between Denver and UTC +timezone=UTC + +[mail] +from = info@eventyay.com +host = mail.your-server.de +port = 587 +user = info@eventyay.com +password = CHANGEME +tls = True +ssl = False + +# redis stream: +[redis] +location=redis://redis/0 +; Remove the following line if you are unsure about your redis' security +; to reduce impact if redis gets compromised. +sessions=true + +[celery] +backend=redis://redis/1 +broker=redis://redis/2 + +[django] +secret=CHANGEME diff --git a/setup.md b/setup.md new file mode 100644 index 0000000000..782f237bc0 --- /dev/null +++ b/setup.md @@ -0,0 +1,12 @@ +docker compose up -d --build + + +docker exec -ti eventyay-next-web python manage.py createsuperuser + + +Web interface: http://localhost:8000 +Admin panel: http://localhost:8000/admin + + + +docker compose down \ No newline at end of file