diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8852cb598..496e55726 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ default_language_version: - python: python3.8 + python: python3.11 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 diff --git a/Dockerfile b/Dockerfile index 509fd580b..3ea243ca7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ RUN npm rebuild node-sass COPY . /code/ # Url prefix to generate links on the back-end -ENV PROTOCOL_DOMAIN "http://127.0.0.1:8000" +ENV PROTOCOL_DOMAIN "http://0.0.0.0:8000" #Contact Us email address, used for Contact Form ENV CONTACT_EMAIL "hello@democracylab.org" diff --git a/app.json b/app.json index 9227bb206..e178fc7ed 100644 --- a/app.json +++ b/app.json @@ -8,9 +8,6 @@ "AWS_SECRET_ACCESS_KEY": { "required": true }, - "EMAIL_HOST_PASSWORD": { - "required": true - }, "S3_BUCKET": { "required": true }, diff --git a/civictechprojects/helpers/context_preload.py b/civictechprojects/helpers/context_preload.py index 4a3d09535..8b5732bfc 100644 --- a/civictechprojects/helpers/context_preload.py +++ b/civictechprojects/helpers/context_preload.py @@ -23,7 +23,6 @@ def about_project_preload(context, request): print('Failed to preload project info, no cache entry found: ' + project_id) return context - def about_event_preload(context, request): context = default_preload(context, request) query_args = url_params(request) @@ -79,14 +78,14 @@ def about_group_preload(context, request): def companies_preload(context, request): context = default_preload(context, request) - context['title'] = 'DemocracyLab | Corporate Engagement' + context['title'] = 'Corporate Engagement | DemocracyLab' context['description'] = 'Do well by doing good! Engage employees at custom events to build culture and spark innovation. Differentiate your brand by sponsoring our public hackathons.' return context def about_us_preload(context, request): context = default_preload(context, request) - context['title'] = 'DemocracyLab | About' + context['title'] = 'About | DemocracyLab' context['description'] = 'Learn About democracyLab, the nonprofit connecting skilled individuals to tech-for-good projects.' return context @@ -111,6 +110,17 @@ def create_event_preload(context, request): context['description'] = 'Create event page' return context +def create_group_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Create a Group | DemocracyLab' + context['description'] = 'Create group page' + return context + +def create_project_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Create a Project | DemocracyLab' + context['description'] = 'Create project page' + return context def my_projects_preload(context, request): context = default_preload(context, request) @@ -118,13 +128,29 @@ def my_projects_preload(context, request): context['description'] = 'My Projects page' return context - def my_groups_preload(context, request): context = default_preload(context, request) context['title'] = 'My Groups | DemocracyLab' context['description'] = 'My Groups page' return context +def find_events_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Find Events | DemocracyLab' + context['description'] = 'Optimizing the connection between skilled volunteers and tech-for-good events' + return context + +def find_groups_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Find Groups | DemocracyLab' + context['description'] = 'Optimizing the connection between skilled volunteers and tech-for-good groups' + return context + +def find_projects_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Find Projects | DemocracyLab' + context['description'] = 'Optimizing the connection between skilled volunteers and tech-for-good projects' + return context def my_events_preload(context, request): context = default_preload(context, request) @@ -144,6 +170,23 @@ def terms_preload(context, request): context['description'] = 'Terms of Use page' return context +def sign_up_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Sign Up | DemocracyLab' + context['description'] = 'Sign up' + return context + +def contact_us_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Contact Us | DemocracyLab' + context['description'] = 'Contact information for DemocracyLab.' + return context + +def reset_password_preload(context, request): + context = default_preload(context, request) + context['title'] = 'Reset Password | DemocracyLab' + context['description'] = 'Reset password page' + return context def videos_preload(context, request): context = default_preload(context, request) @@ -182,6 +225,8 @@ def default_preload(context, request): {'section': FrontEndSection.EditProfile.value, 'handler': edit_profile_preload}, {'section': FrontEndSection.AboutUs.value, 'handler': about_us_preload}, {'section': FrontEndSection.CreateEvent.value, 'handler': create_event_preload}, + {'section': FrontEndSection.CreateGroup.value,'handler':create_group_preload}, + {'section': FrontEndSection.CreateProject.value,'handler':create_project_preload}, {'section': FrontEndSection.MyProjects.value, 'handler': my_projects_preload}, {'section': FrontEndSection.MyGroups.value, 'handler': my_groups_preload}, {'section': FrontEndSection.MyEvents.value, 'handler': my_events_preload}, @@ -191,7 +236,13 @@ def default_preload(context, request): {'section': FrontEndSection.VideoOverview.value, 'handler': videos_preload}, {'section': FrontEndSection.AboutEventProject.value, 'handler': about_event_project_preload}, {'section': FrontEndSection.Privacy.value, 'handler': privacy_preload}, - {'section': FrontEndSection.Terms.value, 'handler': terms_preload} + {'section': FrontEndSection.Terms.value, 'handler': terms_preload}, + {'section': FrontEndSection.SignUp.value, 'handler': sign_up_preload}, + {'section': FrontEndSection.ContactUs.value,'handler':contact_us_preload}, + {'section': FrontEndSection.ResetPassword.value,'handler':reset_password_preload}, + {'section': FrontEndSection.FindEvents.value,'handler':find_events_preload}, + {'section': FrontEndSection.FindGroups.value,'handler':find_groups_preload}, + {'section': FrontEndSection.FindProjects.value,'handler':find_projects_preload}, ] diff --git a/civictechprojects/static/css/styles.scss b/civictechprojects/static/css/styles.scss index d0f885fea..bc27e0b21 100644 --- a/civictechprojects/static/css/styles.scss +++ b/civictechprojects/static/css/styles.scss @@ -1,11 +1,8 @@ //import our variables first @import "vars"; -//import our fonts from Google Fonts -@import url("https://fonts.googleapis.com/css?family=Montserrat:400,500,600&display=swap"); //import third-party CSS, so we can use it and override it. - -// IMPORTANT: Load our bootstrap overrides first, per Bootstrap's documentation. + // IMPORTANT: Load our bootstrap overrides first, per Bootstrap's documentation. @import "bootstrapoverride"; //import required Bootstrap (foundation elements) @import "vendor/bootstrap/functions"; diff --git a/civictechprojects/templates/new_index.html b/civictechprojects/templates/new_index.html index 59c2ec76d..93b19c922 100644 --- a/civictechprojects/templates/new_index.html +++ b/civictechprojects/templates/new_index.html @@ -16,6 +16,10 @@ + + + + diff --git a/common/components/chrome/MainHeader.jsx b/common/components/chrome/MainHeader.jsx index f68326915..21ca189fb 100644 --- a/common/components/chrome/MainHeader.jsx +++ b/common/components/chrome/MainHeader.jsx @@ -331,10 +331,13 @@ class MainHeader extends React.Component<{||}, State> { } _handleHeightChange(height: number) { - UniversalDispatcher.dispatch({ - type: "SET_HEADER_HEIGHT", - headerHeight: height, - }); + // Use setTimeout with a delay of 0 ms to break the dispatch chain + setTimeout(() => { + UniversalDispatcher.dispatch({ + type: "SET_HEADER_HEIGHT", + headerHeight: height, + }); + }, 0); this.props.onMainHeaderHeightChange(height); } diff --git a/common/components/common/Headers.jsx b/common/components/common/Headers.jsx deleted file mode 100644 index 81fb3f2ab..000000000 --- a/common/components/common/Headers.jsx +++ /dev/null @@ -1,31 +0,0 @@ -// @flow - -import React from "react"; -import Helmet from "react-helmet"; -import cdn from "../utils/cdn.js"; - -type Props = {| - +title: string, - +description: string, - +thumbnailUrl: ?string, -|}; - -class Headers extends React.PureComponent { - render(): React$Node { - return ( - - {this.props.title} - - - - - - - ); - } -} - -export default Headers; diff --git a/common/components/common/projects/AboutProjectDisplay.jsx b/common/components/common/projects/AboutProjectDisplay.jsx index 3353ca597..6d9929afb 100644 --- a/common/components/common/projects/AboutProjectDisplay.jsx +++ b/common/components/common/projects/AboutProjectDisplay.jsx @@ -18,7 +18,6 @@ import VolunteerSection from "../volunteers/VolunteerSection.jsx"; import IconLinkDisplay from "../../componentsBySection/AboutProject/IconLinkDisplay.jsx"; import type { PositionInfo } from "../../forms/PositionInfo.jsx"; import CurrentUser, { MyGroupData } from "../../utils/CurrentUser.js"; -import Headers from "../Headers.jsx"; import Truncate from "../../utils/truncate.js"; import Sort from "../../utils/sort.js"; import { LinkTypes } from "../../constants/LinkConstants.js"; @@ -113,7 +112,6 @@ class AboutProjectDisplay extends React.PureComponent { return (
{isWithinIframe() && } - {this._renderHeader(project)}
{this._renderTopSection(project)} @@ -366,23 +364,6 @@ class AboutProjectDisplay extends React.PureComponent { ); } - _renderHeader(project: ProjectDetailsAPIData): React$Node { - const title: string = project.project_name + " | DemocracyLab"; - const description: string = - project.project_short_description || - Truncate.stringT(project.project_description, 300); - - return ( - - ); - } - _renderContactAndVolunteerButtons(): React$Node { return (
diff --git a/common/components/controllers/AboutEventController.jsx b/common/components/controllers/AboutEventController.jsx index 6faee1746..3462c5e93 100644 --- a/common/components/controllers/AboutEventController.jsx +++ b/common/components/controllers/AboutEventController.jsx @@ -1,11 +1,9 @@ // @flow import React from "react"; -import Helmet from "react-helmet"; import ProjectAPIUtils from "../utils/ProjectAPIUtils.js"; import type { ProjectDetailsAPIData } from "../utils/ProjectAPIUtils.js"; import metrics from "../utils/metrics.js"; -import Headers from "../common/Headers.jsx"; import Truncate from "../utils/truncate.js"; import AboutProjectDisplay from "../common/projects/AboutProjectDisplay.jsx"; import { APIError } from "../utils/api.js"; @@ -59,25 +57,11 @@ class AboutEventController extends React.PureComponent<{||}, State> { _renderDetails(): React$Node { return ( - {this._renderEventHeader(this.state.event)} ); } - _renderEventHeader(event: EventData): React$Node { - const title: string = event.event_name + " | DemocracyLab"; - const description: string = event.event_short_description; - - return ( - - ); - } - _renderLoadMessage(): React$Node { return ( diff --git a/common/components/controllers/AboutProjectController.jsx b/common/components/controllers/AboutProjectController.jsx index 242af2229..c9afec749 100644 --- a/common/components/controllers/AboutProjectController.jsx +++ b/common/components/controllers/AboutProjectController.jsx @@ -1,11 +1,9 @@ // @flow import React from "react"; -import Helmet from "react-helmet"; import ProjectAPIUtils from "../utils/ProjectAPIUtils.js"; import type { ProjectDetailsAPIData } from "../utils/ProjectAPIUtils.js"; import metrics from "../utils/metrics.js"; -import Headers from "../common/Headers.jsx"; import Truncate from "../utils/truncate.js"; import AboutProjectDisplay from "../common/projects/AboutProjectDisplay.jsx"; import { APIError } from "../utils/api.js"; diff --git a/common/components/controllers/ContactUsController.jsx b/common/components/controllers/ContactUsController.jsx index 25fe908dd..999135e2c 100644 --- a/common/components/controllers/ContactUsController.jsx +++ b/common/components/controllers/ContactUsController.jsx @@ -1,22 +1,13 @@ // @flow import React from "react"; -import Headers from "../common/Headers.jsx"; import ContactForm from "../forms/ContactForm.jsx"; class ContactUsController extends React.PureComponent<{||}> { - _renderHeader(): React$Node { - const title: string = "DemocracyLab | Contact Us"; - const description: string = "Contact information for DemocracyLab."; - - return ; - } - render(): $React$Node { return ( - {this._renderHeader()}
diff --git a/common/components/controllers/CorporateHackathonController.jsx b/common/components/controllers/CorporateHackathonController.jsx index d9efec9ce..1134f4e29 100644 --- a/common/components/controllers/CorporateHackathonController.jsx +++ b/common/components/controllers/CorporateHackathonController.jsx @@ -33,6 +33,11 @@ const tabOptions: Dictionary = { sponsorship: "tab-sponsorship", }; +// for now we are trying to test this with a one file change. In the future we should handle this when and where the GOOGLE PROPERTY ID is set +// safeGtag needs to return true because event handlers need to return true for the event to keep propogating +// +const safeGtag=(...args)=>(window.gtag && gtag(...args),true) + class CorporateHackathonController extends React.PureComponent<{||}, State> { constructor(props) { super(props); @@ -112,7 +117,8 @@ class CorporateHackathonController extends React.PureComponent<{||}, State> { return (
- + safeGtag('event',tab_option)}> { variant="primary" href="#contact-hackathon" className="corporate-block-button" + onClick={e=>safeGtag('event','contact-hackathon')} > Get Started @@ -333,6 +340,7 @@ class CorporateHackathonController extends React.PureComponent<{||}, State> { variant="primary" href="#contact-sponsor" className="corporate-block-button" + onClick={e=>safeGtag('event','contact-sponsor')} > Get Started @@ -443,6 +451,7 @@ class CorporateHackathonController extends React.PureComponent<{||}, State> { href={cdn.document( "2023+DemocracyLab+Corporate+Hackathon+Prospectus.pdf" )} + onClick={e=>safeGtag('event','HackathonProspectus')} > Corporate Tech-for-Good Hackathons PDF{" "} @@ -455,6 +464,7 @@ class CorporateHackathonController extends React.PureComponent<{||}, State> { href={cdn.document( "2023+DemocracyLab+Sponsorship+Prospectus.pdf" )} + onClick={e=>safeGtag('event','SponsorProspectus')} > Sponsor Prospectus PDF{" "} diff --git a/common/components/controllers/CreateGroupController.jsx b/common/components/controllers/CreateGroupController.jsx index 9243928b6..ad28141ad 100644 --- a/common/components/controllers/CreateGroupController.jsx +++ b/common/components/controllers/CreateGroupController.jsx @@ -3,7 +3,6 @@ import React from "react"; import CurrentUser from "../../components/utils/CurrentUser.js"; import Section from "../enums/Section.js"; -import Headers from "../common/Headers.jsx"; import LogInController from "./LogInController.jsx"; import VerifyEmailBlurb from "../common/notification/VerifyEmailBlurb.jsx"; import GroupOverviewForm from "../componentsBySection/CreateGroup/GroupOverviewForm.jsx"; @@ -138,11 +137,6 @@ class CreateGroupController extends React.PureComponent<{||}, State> { render(): React$Node { return ( - -
{!CurrentUser.isLoggedIn() ? ( diff --git a/common/components/controllers/CreateProjectController.jsx b/common/components/controllers/CreateProjectController.jsx index a0fd7773a..07050bcce 100644 --- a/common/components/controllers/CreateProjectController.jsx +++ b/common/components/controllers/CreateProjectController.jsx @@ -6,7 +6,6 @@ import CurrentUser from "../../components/utils/CurrentUser.js"; import metrics from "../utils/metrics.js"; import LogInController from "./LogInController.jsx"; import Section from "../enums/Section.js"; -import Headers from "../common/Headers.jsx"; import ProjectOverviewForm from "../componentsBySection/CreateProject/ProjectOverviewForm.jsx"; import ProjectInfoForm from "../componentsBySection/CreateProject/ProjectInfoForm.jsx"; import ProjectPreviewForm from "../componentsBySection/CreateProject/ProjectPreviewForm.jsx"; @@ -198,10 +197,6 @@ class CreateProjectController extends React.PureComponent<{||}, State> { render(): React$Node { return ( -
{!CurrentUser.isLoggedIn() ? ( diff --git a/common/components/controllers/FindEventsController.jsx b/common/components/controllers/FindEventsController.jsx index 9dbcdbce7..26eb1a04c 100644 --- a/common/components/controllers/FindEventsController.jsx +++ b/common/components/controllers/FindEventsController.jsx @@ -1,6 +1,5 @@ // @flow -import Headers from "../common/Headers.jsx"; import EventCardsContainer from "../componentsBySection/FindEvents/EventCardsContainer.jsx"; import React from "react"; import urls from "../utils/url.js"; @@ -30,10 +29,6 @@ class FindEventsController extends React.PureComponent { render(): React$Node { return ( -
diff --git a/common/components/controllers/FindGroupsController.jsx b/common/components/controllers/FindGroupsController.jsx index ecea78042..94e0f4bab 100644 --- a/common/components/controllers/FindGroupsController.jsx +++ b/common/components/controllers/FindGroupsController.jsx @@ -4,7 +4,6 @@ import UniversalDispatcher from "../stores/UniversalDispatcher.js"; import { SearchFor } from "../stores/EntitySearchStore.js"; import GroupCardsContainer from "../componentsBySection/FindGroups/GroupCardsContainer.jsx"; import GroupFilterContainer from "../componentsBySection/FindGroups/FIlters/GroupFilterContainer.jsx"; -import Headers from "../common/Headers.jsx"; import urls from "../utils/url.js"; import React from "react"; import _ from "lodash"; @@ -47,10 +46,6 @@ class FindGroupsController extends React.PureComponent { render(): React$Node { return ( -
diff --git a/common/components/controllers/FindProjectsController.jsx b/common/components/controllers/FindProjectsController.jsx index e96e1cd54..3124cd2cf 100644 --- a/common/components/controllers/FindProjectsController.jsx +++ b/common/components/controllers/FindProjectsController.jsx @@ -5,7 +5,6 @@ import ProjectCardsContainer from "../componentsBySection/FindProjects/ProjectCa import ProjectFilterContainer from "../componentsBySection/FindProjects/Filters/ProjectFilterContainer.jsx"; import { FindProjectsArgs, SearchFor } from "../stores/EntitySearchStore.js"; -import Headers from "../common/Headers.jsx"; import urls from "../utils/url.js"; import React from "react"; import _ from "lodash"; @@ -51,10 +50,6 @@ class FindProjectsController extends React.PureComponent { render(): React$Node { return ( -
diff --git a/common/components/controllers/LogInController.jsx b/common/components/controllers/LogInController.jsx index 1d57fa38d..883840ce2 100644 --- a/common/components/controllers/LogInController.jsx +++ b/common/components/controllers/LogInController.jsx @@ -116,24 +116,25 @@ class LogInController extends React.Component { Sign In - + {/* Need to be converted to link to be able to change the header metadata */} + + + - + {/* Need to be converted to link to be able to change the header metadata */} + + +
diff --git a/common/components/controllers/PressController.jsx b/common/components/controllers/PressController.jsx index 5400de4aa..7e2b4c86d 100644 --- a/common/components/controllers/PressController.jsx +++ b/common/components/controllers/PressController.jsx @@ -2,7 +2,6 @@ import _ from "lodash"; import React from "react"; -import Headers from "../common/Headers.jsx"; import cdn from "../utils/cdn.js"; import LoadingMessage from "../chrome/LoadingMessage.jsx"; @@ -34,14 +33,6 @@ class PressController extends React.PureComponent<{||}, State> { }; } - _renderHeader(): React$Node { - const title: string = "DemocracyLab | News Feed"; - const description: string = - "Read external articles and blog posts describing DemocracyLab's work."; - - return ; - } - _renderTitle(): React$Node { return (
@@ -108,7 +99,6 @@ class PressController extends React.PureComponent<{||}, State> { render(): $React$Node { return ( - {this._renderHeader()}
{this._renderTitle()}
diff --git a/common/components/controllers/SignUpController.jsx b/common/components/controllers/SignUpController.jsx index 8b86df1cc..3ea63e636 100644 --- a/common/components/controllers/SignUpController.jsx +++ b/common/components/controllers/SignUpController.jsx @@ -7,7 +7,6 @@ import FormValidation from "../forms/FormValidation.jsx"; import metrics from "../utils/metrics.js"; import moment from "moment"; import _ from "lodash"; -import Headers from "../common/Headers.jsx"; import PseudoLink from "../chrome/PseudoLink.jsx"; import SocialMediaSignupSection from "../common/integrations/SocialMediaSignupSection.jsx"; import TermsModal, { TermsTypes } from "../common/confirmation/TermsModal.jsx"; @@ -102,7 +101,6 @@ class SignUpController extends React.Component { render(): React$Node { return ( -
SIGN UP, IT'S EASY AND FREE diff --git a/common/components/controllers/SignedUpController.jsx b/common/components/controllers/SignedUpController.jsx index ff756beb2..d703940bc 100644 --- a/common/components/controllers/SignedUpController.jsx +++ b/common/components/controllers/SignedUpController.jsx @@ -3,7 +3,6 @@ import React from "react"; import CurrentUser from "../utils/CurrentUser.js"; import cdn, { Images } from "../utils/cdn.js"; -import Headers from "../common/Headers.jsx"; class SignedUpController extends React.Component<{||}> { constructor(): void { diff --git a/common/components/controllers/ThankYouController.jsx b/common/components/controllers/ThankYouController.jsx index c2de22416..58824b6b4 100644 --- a/common/components/controllers/ThankYouController.jsx +++ b/common/components/controllers/ThankYouController.jsx @@ -2,7 +2,6 @@ import React from "react"; import cdn, { Images } from "../utils/cdn.js"; -import Headers from "../common/Headers.jsx"; class ThankYouController extends React.Component<{||}> { constructor(): void { diff --git a/democracylab/settings.py b/democracylab/settings.py index 5ba9c8b74..5585bcb82 100644 --- a/democracylab/settings.py +++ b/democracylab/settings.py @@ -402,7 +402,7 @@ def read_connection_config(config): "*.doubleclick.net", "*.newrelic.com", "*.nr-data.net", - "*.hotjar.com", + "https://*.hotjar.com", ) CSP_CONNECT_SRC = ( "'self'", @@ -412,7 +412,9 @@ def read_connection_config(config): "*.google-analytics.com", "*.nr-data.net", "*.hereapi.com", - "*.hotjar.com", + "https://*.hotjar.com", + "https://*.hotjar.io", + "wss://*.hotjar.com", ) CSP_FONT_SRC = ( "'self'", diff --git a/democracylab_environment_variables.sh b/democracylab_environment_variables.sh index d04088839..07c6df5ac 100755 --- a/democracylab_environment_variables.sh +++ b/democracylab_environment_variables.sh @@ -8,9 +8,6 @@ exit 1 #export AWS_SECRET_ACCESS_KEY=ASK #export S3_BUCKET=ASK -# Password for account used to send email -export EMAIL_HOST_PASSWORD=betterDemocracyViaTechnology - # Url prefix to generate links on the back-end export PROTOCOL_DOMAIN=http://127.0.0.1:8000 @@ -69,7 +66,6 @@ export VOLUNTEER_RENEW_REMINDER_PERIODS='[7,7,-1]' # export MAILCHIMP_SUBSCRIBE_LIST_ID=SECRET export S3_BUCKET=democracylab-marlok -export EMAIL_HOST_PASSWORD=betterDemocracyViaTechnology # ONLY FOR USE IN PRODUCTION #export HOTJAR_APPLICATION_ID=1097784 diff --git a/example.env b/example.env index 2552314c8..7a094fe0e 100644 --- a/example.env +++ b/example.env @@ -12,7 +12,6 @@ GOOGLE_RECAPTCHA_SECRET_KEY=change_me_asap GOOGLE_RECAPTCHA_SITE_KEY=change_me_asap ### Email Configs ### -EMAIL_HOST_PASSWORD=change_me_asap ADMIN_EMAIL=change_me_asap ### PayPal Configs ### @@ -21,4 +20,4 @@ PAYPAL_PAYEE=paypal_email_address_here ### Misc Project Configs ### DJANGO_SECRET_KEY=change_me_asap -STATIC_CDN_URL=https://d1agxr2dqkgkuy.cloudfront.net \ No newline at end of file +STATIC_CDN_URL=https://d1agxr2dqkgkuy.cloudfront.net diff --git a/oauth2/adapter.py b/oauth2/adapter.py index 812272af0..e15799df6 100644 --- a/oauth2/adapter.py +++ b/oauth2/adapter.py @@ -16,6 +16,10 @@ from django.utils import timezone import simplejson as json +from django.urls import reverse +from allauth.exceptions import ImmediateHttpResponse +from django.http import HttpResponseRedirect + class MissingOAuthFieldError(ReportableError): """Exception raised when required fields are not returned from OAuth @@ -26,25 +30,42 @@ class MissingOAuthFieldError(ReportableError): """ def __init__(self, message, provider, missing_fields): - super().__init__(message, {'provider': provider, 'missing_fields': missing_fields}) + super().__init__( + message, {"provider": provider, "missing_fields": missing_fields} + ) + class MyAccountAdapter(DefaultAccountAdapter): def get_login_redirect_url(self, request): - if 'prev_page' in request.session: - prev_page = request.session['prev_page'] - prev_page_args = request.session['prev_page_args'] - del request.session['prev_page'] - del request.session['prev_page_args'] - redirect_url = '/' if prev_page.strip('/') == '' else section_url(prev_page, prev_page_args) + if "prev_page" in request.session: + prev_page = request.session["prev_page"] + prev_page_args = request.session["prev_page_args"] + del request.session["prev_page"] + del request.session["prev_page_args"] + redirect_url = ( + "/" + if prev_page.strip("/") == "" + else section_url(prev_page, prev_page_args) + ) else: redirect_url = section_url(FrontEndSection.Home) return redirect_url + class SocialAccountAdapter(DefaultSocialAccountAdapter): + def authentication_error( + self, request, provider_id, error=None, exception=None, extra_context=None + ): + print("Reached error properly !!!") + raise ImmediateHttpResponse(HttpResponseRedirect(reverse("login_view"))) def new_user(self, request, sociallogin): - email = sociallogin.account.get_provider().extract_common_fields( - sociallogin.account.extra_data).get('email').lower() + email = ( + sociallogin.account.get_provider() + .extract_common_fields(sociallogin.account.extra_data) + .get("email") + .lower() + ) assert email # This account may actually belong to an existing user user = User.objects.filter(username=email).first() @@ -66,20 +87,19 @@ def pre_social_login(self, request, sociallogin): """ # standardizing fields across different providers provider = sociallogin.account.get_provider() - data = provider.extract_common_fields( - sociallogin.account.extra_data) + data = provider.extract_common_fields(sociallogin.account.extra_data) - full_name = data.get('name') - first_name = data.get('first_name') - last_name = data.get('last_name') + full_name = data.get("name") + first_name = data.get("first_name") + last_name = data.get("last_name") if full_name or (first_name and last_name): sociallogin.user.first_name = first_name or full_name.split()[0] - sociallogin.user.last_name = last_name or ' '.join(full_name.split()[1:]) + sociallogin.user.last_name = last_name or " ".join(full_name.split()[1:]) # Set username to lowercase email sociallogin.user.username = sociallogin.user.email.lower() - password = sociallogin.account.extra_data.get('password') + password = sociallogin.account.extra_data.get("password") if password: sociallogin.user.password = password @@ -94,7 +114,11 @@ def pre_social_login(self, request, sociallogin): def set_avatar_at_login(sender, sociallogin, **kwargs): owner = sociallogin.user.contributor user_avatar_url = sociallogin.account.get_provider().get_avatar_url(sociallogin) - + if user_avatar_url: - file_json = copy_external_thumbnail_to_s3(user_avatar_url, sociallogin.account.provider, owner) - ProjectFile.replace_single_file(owner, FileCategory(file_json['file_category']), file_json) + file_json = copy_external_thumbnail_to_s3( + user_avatar_url, sociallogin.account.provider, owner + ) + ProjectFile.replace_single_file( + owner, FileCategory(file_json["file_category"]), file_json + ) diff --git a/package.json b/package.json index 3cb6055a6..67c8e8169 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "react-dom": "^16.11.0", "react-file-drop": "^0.2.8", "react-google-recaptcha": "^1.1.0", - "react-helmet": "^5.2.0", "react-image-crop": "^8.3.0", "react-markdown": "^7.0.1", "react-moment": "^0.7.9", @@ -104,7 +103,9 @@ "async": "^2.6.4", "terser": "^4.8.1", "decode-uri-component": "^0.2.2", - "json5": "^1.0.2" + "json5": "^1.0.2", + "word-wrap": "1.2.4", + "browserify-sign": "^4.2.2" }, "jest": { "automock": false, diff --git a/requirements.txt b/requirements.txt index b758b326d..af50104cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ boto3==1.26.114 botocore==1.29.114 dj-database-url==0.4.1 -Django==4.2 +Django==4.2.3 django-allauth==0.44 django-appconf==1.0.2 django-compressor==2.1.1 @@ -25,9 +25,9 @@ psycopg2-binary==2.9.6 python-dateutil==2.8.2 pytz==2023.3 rcssmin==1.0.6 -redis==3.5.3 +redis==4.3.6 rq==1.10.0 -requests==2.28.2 +requests==2.31.0 rjsmin==1.0.12 s3transfer==0.6.0 simplejson==3.12.0 diff --git a/yarn.lock b/yarn.lock index 0bbdbb1b0..deb252663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2197,7 +2197,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -2316,7 +2316,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== @@ -2324,20 +2324,20 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: bn.js "^5.0.0" randombytes "^2.0.1" -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== +browserify-sign@^4.0.0, browserify-sign@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" + bn.js "^5.2.1" + browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.3" + elliptic "^6.5.4" inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" browserify-zlib@^0.2.0: version "0.2.0" @@ -6675,7 +6675,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: +parse-asn1@^5.0.0, parse-asn1@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== @@ -7272,7 +7272,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -7502,11 +7502,6 @@ react-dom@^16.11.0: prop-types "^15.6.2" scheduler "^0.19.1" -react-fast-compare@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== - react-file-drop@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/react-file-drop/-/react-file-drop-0.2.8.tgz#de1e26cef0f1a5855fa1fb1e0cee32bc03c34466" @@ -7522,16 +7517,6 @@ react-google-recaptcha@^1.1.0: prop-types "^15.5.0" react-async-script "^1.0.0" -react-helmet@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.1.tgz#16a7192fdd09951f8e0fe22ffccbf9bb3e591ffa" - integrity sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA== - dependencies: - object-assign "^4.1.1" - prop-types "^15.5.4" - react-fast-compare "^2.0.2" - react-side-effect "^1.1.0" - react-image-crop@^8.3.0: version "8.6.12" resolved "https://registry.yarnpkg.com/react-image-crop/-/react-image-crop-8.6.12.tgz#fb57e17c3b56ac0a52ba1967c108975b1f132dcd" @@ -7632,13 +7617,6 @@ react-select@^2.4.2: react-input-autosize "^2.2.1" react-transition-group "^2.2.1" -react-side-effect@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.2.0.tgz#0e940c78faba0c73b9b0eba9cd3dda8dfb7e7dae" - integrity sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w== - dependencies: - shallowequal "^1.0.1" - react-sortablejs@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/react-sortablejs/-/react-sortablejs-6.1.1.tgz#1c90b6ae79a59490986c7918ebc9aa2eecf965cf" @@ -7725,6 +7703,15 @@ readable-stream@^3.0.6, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -8026,7 +8013,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8127,9 +8114,9 @@ selfsigned@^1.10.8: node-forge "^0.10.0" "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.0.0: version "7.0.0" @@ -8137,9 +8124,9 @@ semver@7.0.0: integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== send@0.18.0: version "0.18.0" @@ -8235,11 +8222,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallowequal@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9556,10 +9538,10 @@ which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@1.2.4, word-wrap@~1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== worker-farm@^1.7.0: version "1.7.0"