diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 68ab395b..07bb93e4 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -111,6 +111,10 @@ jobs: bench --site buzz.test set-config allow_tests true bench --site buzz.test set-config host_name "http://buzz.test:8000" + - name: Create Test User + working-directory: /home/runner/frappe-bench + run: bench --site buzz.test add-user testuser@buzz.test --first-name Test --last-name User --password Test@123 --add-role "System Manager" + - name: Start Frappe Server working-directory: /home/runner/frappe-bench run: | @@ -135,8 +139,8 @@ jobs: run: npx playwright test env: BASE_URL: http://buzz.test:8000 - FRAPPE_USER: Administrator - FRAPPE_PASSWORD: admin + FRAPPE_USER: testuser@buzz.test + FRAPPE_PASSWORD: Test@123 - name: Upload Playwright Report uses: actions/upload-artifact@v4 diff --git a/buzz/api/auth.py b/buzz/api/auth.py new file mode 100644 index 00000000..a1335646 --- /dev/null +++ b/buzz/api/auth.py @@ -0,0 +1,38 @@ +import frappe +from frappe.utils import cint, md_to_html +from frappe.utils.oauth import get_oauth2_authorize_url, get_oauth_keys + + +@frappe.whitelist(allow_guest=True) # nosemgrep: frappe-semgrep-rules.rules.security.guest-whitelisted-method +def get_login_context(redirect_to: str | None = None): + context = { + "disable_signup": frappe.get_website_settings("disable_signup"), + "disable_user_pass_login": frappe.get_system_settings("disable_user_pass_login"), + "login_with_email_link": frappe.get_system_settings("login_with_email_link"), + "login_banner": md_to_html(raw_banner) + if (raw_banner := frappe.db.get_single_value("Buzz Settings", "login_banner")) + else None, + "provider_logins": [], + } + + if not redirect_to: + redirect_to = frappe.utils.get_url("/dashboard") + + social_login_keys = frappe.get_all( + "Social Login Key", + filters={"enable_social_login": 1}, + fields=["name", "provider_name", "icon", "client_id", "base_url"], + ) + + for provider in social_login_keys: + if provider.client_id and provider.base_url and get_oauth_keys(provider.name): + context["provider_logins"].append( + { + "name": provider.name, + "provider_name": provider.provider_name, + "icon": provider.icon or "", + "auth_url": get_oauth2_authorize_url(provider.name, redirect_to), + } + ) + + return context diff --git a/buzz/events/doctype/buzz_settings/buzz_settings.json b/buzz/events/doctype/buzz_settings/buzz_settings.json index 83cdc042..f690cac4 100644 --- a/buzz/events/doctype/buzz_settings/buzz_settings.json +++ b/buzz/events/doctype/buzz_settings/buzz_settings.json @@ -13,6 +13,9 @@ "allow_add_ons_change_before_event_start_days", "column_break_hagy", "allow_ticket_cancellation_request_before_event_start_days", + "login_tab", + "login_banner_section", + "login_banner", "communications_tab", "ticketing_emails_section", "default_ticket_email_template", @@ -73,6 +76,22 @@ "label": "Support Email", "options": "Email" }, + { + "fieldname": "login_tab", + "fieldtype": "Tab Break", + "label": "Login" + }, + { + "fieldname": "login_banner_section", + "fieldtype": "Section Break", + "label": "Login Banner Config" + }, + { + "description": "Promotional message shown in the login/signup modal. Supports Markdown.", + "fieldname": "login_banner", + "fieldtype": "Markdown Editor", + "label": "Login Banner" + }, { "fieldname": "communications_tab", "fieldtype": "Tab Break", @@ -148,7 +167,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-13 22:34:24.493305", + "modified": "2026-03-26 17:39:40.326309", "modified_by": "Administrator", "module": "Events", "name": "Buzz Settings", diff --git a/buzz/events/doctype/buzz_settings/buzz_settings.py b/buzz/events/doctype/buzz_settings/buzz_settings.py index d5031a0b..3ab416c2 100644 --- a/buzz/events/doctype/buzz_settings/buzz_settings.py +++ b/buzz/events/doctype/buzz_settings/buzz_settings.py @@ -21,8 +21,9 @@ class BuzzSettings(Document): auto_send_pitch_deck: DF.Check default_sponsor_deck_cc: DF.SmallText | None default_sponsor_deck_email_template: DF.Link | None - default_sponsor_deck_reply_to: DF.Data + default_sponsor_deck_reply_to: DF.Data | None default_ticket_email_template: DF.Link | None + login_banner: DF.MarkdownEditor | None support_email: DF.Data | None # end: auto-generated types diff --git a/dashboard/components.d.ts b/dashboard/components.d.ts index 916445e6..d8d060ca 100644 --- a/dashboard/components.d.ts +++ b/dashboard/components.d.ts @@ -26,6 +26,7 @@ declare module 'vue' { EventSelector: typeof import('./src/components/EventSelector.vue')['default'] EventSponsorForm: typeof import('./src/components/EventSponsorForm.vue')['default'] LanguageSwitcher: typeof import('./src/components/LanguageSwitcher.vue')['default'] + LoginDialog: typeof import('./src/components/LoginDialog.vue')['default'] LoginRequired: typeof import('./src/components/LoginRequired.vue')['default'] Navbar: typeof import('./src/components/Navbar.vue')['default'] OfflinePaymentDialog: typeof import('./src/components/OfflinePaymentDialog.vue')['default'] diff --git a/dashboard/src/App.vue b/dashboard/src/App.vue index 13fb7937..6987cad9 100644 --- a/dashboard/src/App.vue +++ b/dashboard/src/App.vue @@ -1,4 +1,5 @@ diff --git a/dashboard/src/components/LoginRequired.vue b/dashboard/src/components/LoginRequired.vue index 39454103..0197695d 100644 --- a/dashboard/src/components/LoginRequired.vue +++ b/dashboard/src/components/LoginRequired.vue @@ -5,21 +5,23 @@ {{ __("Login Required") }}
- {{ message }} + {{ __(message) }}
- + diff --git a/dashboard/src/components/Navbar.vue b/dashboard/src/components/Navbar.vue index d9043ffb..64a0d214 100644 --- a/dashboard/src/components/Navbar.vue +++ b/dashboard/src/components/Navbar.vue @@ -27,7 +27,7 @@ -