Changeset - 64b4d93470bd
[Not reviewed]
0 4 2
Ben Sturmfels (bsturmfels) - 14 months ago 2023-04-19 14:00:00
ben@sturm.com.au
Add django-user-accounts app for use in place of SSO
6 files changed with 97 insertions and 2 deletions:
0 comments (0 inline, 0 general)
pinaxcon/devmode_settings.py
Show inline comments
 
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
 
AUTHENTICATION_BACKENDS = [
 
    'symposion.teams.backends.TeamPermissionsBackend',
 
    'django.contrib.auth.backends.ModelBackend',
 
]
 
LOGIN_URL='/accounts/login'
 

	
 
ROOT_URLCONF = "pinaxcon.devmode_urls"
 

	
 
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
 

	
 
INTERNAL_IPS = ['*']
pinaxcon/settings.py
Show inline comments
...
 
@@ -149,61 +149,64 @@ STATICFILES_FINDERS = [
 
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
 
    "sass_processor.finders.CssFinder",
 
]
 

	
 
TEMPLATES = [
 
    {
 
        "BACKEND": "django.template.backends.django.DjangoTemplates",
 
        "DIRS": [
 
            os.path.join(PACKAGE_ROOT, "templates"),
 
            os.path.join(DJANGO_ROOT, 'forms/templates')
 
        ],
 
        "APP_DIRS": True,
 
        "OPTIONS": {
 
            "debug": DEBUG,
 
            "context_processors": [
 
                "django.contrib.auth.context_processors.auth",
 
                "django.template.context_processors.debug",
 
                "django.template.context_processors.i18n",
 
                "django.template.context_processors.media",
 
                "django.template.context_processors.static",
 
                "django.template.context_processors.tz",
 
                "django.template.context_processors.request",
 
                "django.contrib.messages.context_processors.messages",
 
                "pinax_theme_bootstrap.context_processors.theme",
 
                "account.context_processors.account",
 
                "symposion.reviews.context_processors.reviews",
 
                "django_settings_export.settings_export",
 
            ],
 
        },
 
    },
 
]
 

	
 
MIDDLEWARE = [
 
    "whitenoise.middleware.WhiteNoiseMiddleware",
 
    "django.contrib.sessions.middleware.SessionMiddleware",
 
    "django.middleware.common.CommonMiddleware",
 
    "django.middleware.csrf.CsrfViewMiddleware",
 
    "django.contrib.auth.middleware.AuthenticationMiddleware",
 
    "account.middleware.LocaleMiddleware",
 
    "account.middleware.TimezoneMiddleware",
 
    "djangosaml2.middleware.SamlSessionMiddleware",
 
    "django.contrib.messages.middleware.MessageMiddleware",
 
    "debug_toolbar.middleware.DebugToolbarMiddleware",
 
    "reversion.middleware.RevisionMiddleware",
 
    "waffle.middleware.WaffleMiddleware",
 
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
 
    "django.contrib.flatpages.middleware.FlatpageFallbackMiddleware",
 
    'pinaxcon.monkey_patch.MonkeyPatchMiddleware',
 
]
 

	
 
if DEV_MODE and DEV_MODE == "LAPTOP":
 
    ROOT_URLCONF = "pinaxcon.devmode_urls"
 
else:
 
    ROOT_URLCONF = "pinaxcon.urls"
 

	
 
# Python dotted path to the WSGI application used by Django's runserver.
 
WSGI_APPLICATION = "pinaxcon.wsgi.application"
 

	
 
INSTALLED_APPS = [
 
    "whitenoise.runserver_nostatic",
 
    "django.contrib.admin",
 
    "django.contrib.auth",
 
    "django.contrib.contenttypes",
 
    "django.contrib.flatpages",
...
 
@@ -246,48 +249,50 @@ INSTALLED_APPS = [
 
    # Registrasion-stripe
 
    "pinax.stripe",
 
    "django_countries",
 
    "registripe",
 

	
 
    #registrasion-desk
 
    "regidesk",
 

	
 
    # admin - required by registrasion ??
 
    "nested_admin",
 

	
 
    # project
 
    "pinaxcon",
 
    "pinaxcon.proposals",
 
    "pinaxcon.registrasion",
 
    "pinaxcon.raffle",
 
    "jquery",
 
    "djangoformsetjs",
 

	
 
    # testing and rollout
 
    "django_nose",
 
    "waffle",
 

	
 
    "crispy_forms",
 

	
 
    "account",
 
]
 

	
 
CRISPY_TEMPLATE_PACK = "bootstrap4"
 

	
 
DEBUG_TOOLBAR_PANELS = [
 
    'debug_toolbar.panels.versions.VersionsPanel',
 
    'debug_toolbar.panels.timer.TimerPanel',
 
    'debug_toolbar.panels.settings.SettingsPanel',
 
    'debug_toolbar.panels.headers.HeadersPanel',
 
    'debug_toolbar.panels.request.RequestPanel',
 
    'debug_toolbar.panels.sql.SQLPanel',
 
    'debug_toolbar.panels.staticfiles.StaticFilesPanel',
 
    'debug_toolbar.panels.cache.CachePanel',
 
    'debug_toolbar.panels.signals.SignalsPanel',
 
    'debug_toolbar.panels.logging.LoggingPanel',
 
    'debug_toolbar.panels.templates.TemplatesPanel',
 
    'debug_toolbar.panels.redirects.RedirectsPanel',
 
]
 

	
 
DEBUG_TOOLBAR_CONFIG = {
 
    'INTERCEPT_REDIRECTS': False,
 
}
 

	
 
INTERNAL_IPS = [
...
 
@@ -335,49 +340,49 @@ LOGGING = {
 
            'level': 'DEBUG',
 
            'propagate': True,
 
        },
 
        'symposion.request': {
 
            'handlers': ['mail_admins'],
 
            'level': 'DEBUG',
 
            'propagate': True,
 
        },
 
    },
 
    'root': {
 
        'handlers': ['console', 'djdt_log'],
 
        'level': 'DEBUG'
 
    },
 
}
 
FIXTURE_DIRS = [
 
    os.path.join(PROJECT_ROOT, "fixtures"),
 
]
 

	
 
AUTHENTICATION_BACKENDS = [
 
    'symposion.teams.backends.TeamPermissionsBackend',
 
    'django.contrib.auth.backends.ModelBackend',
 
    'djangosaml2.backends.Saml2Backend',
 
]
 

	
 
LOGIN_URL = '/saml2/login/'
 
LOGIN_URL = '/account/login/'
 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
 

	
 
CONFERENCE_ID = 2
 
PROPOSAL_FORMS = {
 
    "talk": "pinaxcon.proposals.forms.TalkProposalForm",
 
    "tutorial": "pinaxcon.proposals.forms.TutorialProposalForm",
 
    "copyleft-compliance": "pinaxcon.proposals.forms.CopyleftComplianceProposalForm",
 
    "sfc-member-project": "pinaxcon.proposals.forms.MemberProjectProposalForm",
 
}
 
MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk",)
 

	
 
# Registrasion bits:
 
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
 
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
 
INVOICE_CURRENCY = "AUD"
 
GST_RATE =  Decimal('0.1')
 
TICKET_PRODUCT_CATEGORY = 1
 
TERMS_PRODUCT_CATEGORY = 2
 
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
 

	
 
#REGIDESK
 
REGIDESK_BOARDING_GROUP = "Ready For Boarding"
 

	
 
# CSRF custom error screen
...
 
@@ -561,24 +566,28 @@ SPEAKERS_DINNER = SpeakersDinnerCat
 

	
 
SPEAKERS_DINNER_ADULT = SpeakersDinnerCat.create(
 
    "Adult", Decimal("100.00"),
 
    "Includes an adult's meal and full beverage service.",
 
    timedelta(hours=1))
 

	
 
# SPEAKERS_DINNER_CHILD = SpeakersDinnerCat.create(
 
#     "Child", Decimal("60.00"),
 
#     "Children 14 and under. "
 
#     "Includes a child's meal and soft drink service.",
 
#     timedelta(hours=1))
 

	
 
# SPEAKERS_DINNER_INFANT = SpeakersDinnerCat.create(
 
#     "Infant", Decimal("00.00"),
 
#     "Infant must be seated in an adult's lap. "
 
#     "No food or beverage service.",
 
#     timedelta(hours=1))
 

	
 

	
 
# Venueless integration
 
VENUELESS_URL = os.environ.get('VENUELESS_URL', None)
 
VENUELESS_AUDIENCE = os.environ.get('VENUELESS_AUDIENCE', "venueless")
 
VENUELESS_TOKEN_ISSUER = os.environ.get('VENUELESS_TOKEN_ISSUER', "any")
 
VENUELESS_SECRET = os.environ.get('VENUELESS_SECRET', SECRET_KEY)
 

	
 

	
 
ACCOUNT_SIGNUP_REDIRECT_URL = '/dashboard/'
 
ACCOUNT_LOGIN_REDIRECT_URL = '/dashboard/'
pinaxcon/templates/account/login.html
Show inline comments
 
new file 100644
 
{% extends "site_base.html" %}
 

	
 
{% load account_tags %}
 
{% load i18n %}
 
{% load bootstrap %}
 

	
 
{% block head_title %}{% trans "Log in" %}{% endblock %}
 

	
 
{% block content %}
 
    <div class="row">
 
        <div class="col-md-4">
 
            <form method="POST" action="{% url "account_login" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
 
                <legend>{% trans "Log in to an existing account" %}</legend>
 
                {% csrf_token %}
 
                {{ form|bootstrap }}
 
                {% if redirect_field_value %}
 
                    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
 
                {% endif %}
 
                <button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
 
                <a href="{% url "account_password_reset" %}" class="btn btn-link">{% trans "Forgot your password?" %}</a>
 
            </form>
 
            {% if ACCOUNT_OPEN_SIGNUP %}
 
                <p class="login-signup">
 
                    <small>
 
                        {% trans "Don't have an account?" %}  <strong><a href="{% urlnext 'account_signup' %}">{% trans "Sign up" %}</a></strong>
 
                    </small>
 
                </p>
 
            {% endif %}
 
        </div>
 
        <div class="col-md-4">
 
            {% include "account/_login_sidebar.html" %}
 
        </div>
 
    </div>
 
{% endblock %}
 

	
 
{% block scripts %}
 
    {{ block.super }}
 
    <script type="text/javascript">
 
        $(document).ready(function() {
 
            $('#id_username').focus();
 
        });
 
    </script>
 
{% endblock %}
pinaxcon/templates/account/signup.html
Show inline comments
 
new file 100644
 
{% extends "site_base.html" %}
 
{% load account_tags %}
 
{% load i18n %}
 
{% load bootstrap %}
 

	
 
{% block head_title %}Sign up{% endblock %}
 
{% block page_title %}Sign up{% endblock %}
 

	
 
{% block alert %}
 
{% endblock %}
 

	
 
{% block content %}
 
    <div class="row">
 
        <div class="col-md-4">
 
            <form id="signup_form" method="post" action="{% url "account_signup" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
 
                {% csrf_token %}
 
                {{ form|bootstrap }}
 
                {% if redirect_field_value %}
 
                    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
 
                {% endif %}
 
                <button type="submit" class="btn btn-primary">{% trans "Sign up" %}</button>
 
            </form>
 
            <p class="login-signup">
 
                <small>
 
                    {% trans "Already have an account?" %}  <strong><a href="{% urlnext 'account_login' %}">{% trans "Log in" %}</a></strong>
 
                </small>
 
            </p>
 
        </div>
 
        <div class="col-md-4">
 
            {% include "account/_signup_sidebar.html" %}
 
        </div>
 
    </div>
 
{% endblock %} <!-- block content -->
 

	
 
{% block scripts_extra %}
 
    <script type="text/javascript">
 
        $(document).ready(function() {
 
            $('#id_username').focus();
 
        });
 
    </script>
 
{% endblock %}
pinaxcon/urls.py
Show inline comments
...
 
@@ -3,39 +3,41 @@ from django.conf import settings
 
from django.conf.urls.static import static
 
from django.views.generic import RedirectView
 
from django.views.generic import TemplateView
 
from django.urls import include, path
 
from django.contrib.flatpages.views import flatpage
 

	
 
from django.contrib import admin
 

	
 
import symposion.views
 

	
 

	
 
urlpatterns = [
 
    path('saml2/', include('djangosaml2.urls')),
 
    path('admin/', admin.site.urls),
 

	
 
    path("speaker/", include("symposion.speakers.urls")),
 
    path("proposals/", include("symposion.proposals.urls")),
 
    path("reviews/", include("symposion.reviews.urls")),
 
    path("schedule/", include("symposion.schedule.urls")),
 
    path("conference/", include("symposion.conference.urls")),
 

	
 
    path("teams/", include("symposion.teams.urls")),
 
    path('raffle/', include("pinaxcon.raffle.urls")),
 

	
 
    path("account/", include("account.urls")),
 

	
 
    # Required by registrasion
 
    path('tickets/payments/', include('registripe.urls')),
 
    path('tickets/', include('registrasion.urls')),
 
    path('nested_admin/', include('nested_admin.urls')),
 
    path('checkin/', include('regidesk.urls')),
 
    path('pages/', include('django.contrib.flatpages.urls')),
 

	
 
    path('dashboard/', symposion.views.dashboard, name="dashboard"),
 
    path('boardingpass', RedirectView.as_view(pattern_name="regidesk:boardingpass")),
 

	
 
    # Debug Toolbar. Always include to ensure tests work.
 
    path('__debug__/', include(debug_toolbar.urls)),
 
]
 

	
 
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
requirements.txt
Show inline comments
...
 
@@ -29,24 +29,25 @@ django-sitetree==1.16.0
 
django-taggit==1.3.0
 
django-timezone-field==4.1.2
 
easy-thumbnails==2.7.0
 
bleach==3.2.1
 
pytz>=2020.1
 
django-ical==1.7.1
 

	
 
# Registrasion reqs
 
django-nested-admin==3.3.2
 
CairoSVG==2.4.2
 
PyJWT==2.0.0
 

	
 
# Registripe
 
django-countries==7.3.2
 
pinax-stripe==4.4.0
 
requests==2.24.0
 
stripe==2.55.0
 

	
 
# SASS Compiler and template tags
 
libsass==0.20.1
 
django-sass-processor==0.8.2
 
django-compressor==2.4
 

	
 
django-crispy-forms==1.9.2
 
django-user-accounts==3.2.0
...
 
\ No newline at end of file
0 comments (0 inline, 0 general)