Skip to content

Commit

Permalink
Allow forms to be overridden from settings. Fix #88
Browse files Browse the repository at this point in the history
  • Loading branch information
nitmir committed Apr 13, 2024
1 parent 235d8a4 commit 80a1eac
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 11 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Added
-----

* Support for Django 4.2
* Allow forms to be overridden from settings


v2.0.0 - 2022-10-17
Expand Down
4 changes: 2 additions & 2 deletions cas_server/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from .models import ServiceTicket, ProxyTicket, ProxyGrantingTicket, User, ServicePattern
from .models import Username, ReplaceAttributName, ReplaceAttributValue, FilterAttributValue
from .models import FederatedIendityProvider, FederatedUser, UserAttributes
from .forms import TicketForm
from .utils import import_attr


class BaseInlines(admin.TabularInline):
Expand All @@ -36,7 +36,7 @@ class UserAdminInlines(BaseInlines):
Base class for inlines in :class:`UserAdmin` interface
"""
#: The form :class:`TicketForm<cas_server.forms.TicketForm>` used to display tickets.
form = TicketForm
form = import_attr(settings.CAS_TICKET_FORM)
#: Fields to display on a object that are read only (not editable).
readonly_fields = (
'validate', 'service', 'service_pattern',
Expand Down
12 changes: 11 additions & 1 deletion cas_server/default_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,14 +246,24 @@
#: :class:`bool` If `True` Django language cookie will be removed on logout from CAS server
CAS_REMOVE_DJANGO_LANGUAGE_COOKIE_ON_LOGOUT = False

#: A dotted path to a form or a form used on the login page to retrieve user credentials
CAS_USER_CREDENTIAL_FORM = "cas_server.forms.UserCredential"
#: A dotted path to a form or a form used on warn page before emitting a ticket
CAS_WARN_FORM = "cas_server.forms.WarnForm"
#: A dotted path to a form or a form used on the login page to select another CAS in federated mode
CAS_FEDERATE_SELECT_FORM = "cas_server.forms.FederateSelect"
#: A dotted path to a form or a form used on the login page in federated mode
CAS_FEDERATE_USER_CREDENTIAL_FORM = "cas_server.forms.FederateUserCredential"
#: A dotted path to a form or a form for Tickets in the admin interface
CAS_TICKET_FORM = "cas_server.forms.TicketForm"

GLOBALS = globals().copy()
for name, default_value in GLOBALS.items():
# only care about parameter begining by CAS_
if name.startswith("CAS_"):
# get the current setting value, falling back to default_value
value = getattr(settings, name, default_value)
# set the setting value to its value if defined, ellse to the default_value.
# set the setting value to its value if defined, else to the default_value.
setattr(settings, name, value)

# Allow the user defined CAS_COMPONENT_URLS to omit not changed values
Expand Down
15 changes: 7 additions & 8 deletions cas_server/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,9 @@ def python_2_unicode_compatible(func):
from datetime import timedelta

import cas_server.utils as utils
import cas_server.forms as forms
import cas_server.models as models

from .utils import json_response
from .utils import json_response, import_attr
from .models import Ticket, ServiceTicket, ProxyTicket, ProxyGrantingTicket
from .models import ServicePattern, FederatedIendityProvider, FederatedUser
from .federate import CASFederateValidateUser
Expand Down Expand Up @@ -302,7 +301,7 @@ def post(self, request, provider=None, *args, **kwargs):
.process_view(request, None, (), {})
if reason is not None: # pragma: no cover (csrf checks are disabled during tests)
return reason # Failed the test, stop here.
form = forms.FederateSelect(request.POST)
form = import_attr(settings.CAS_FEDERATE_SELECT_FORM)(request.POST)
if form.is_valid():
params = utils.copy_params(
request.POST,
Expand Down Expand Up @@ -677,14 +676,14 @@ def init_form(self, values=None):
form_initial['username'] = self.username
form_initial['password'] = self.ticket
form_initial['ticket'] = self.ticket
self.form = forms.FederateUserCredential(
self.form = import_attr(settings.CAS_FEDERATE_USER_CREDENTIAL_FORM)(
values,
initial=form_initial
)
else:
self.form = forms.FederateSelect(values, initial=form_initial)
self.form = import_attr(settings.CAS_FEDERATE_SELECT_FORM)(values, initial=form_initial)
else:
self.form = forms.UserCredential(
self.form = import_attr(settings.CAS_USER_CREDENTIAL_FORM)(
values,
initial=form_initial
)
Expand Down Expand Up @@ -720,7 +719,7 @@ def service_login(self):
data = {"status": "error", "detail": "confirmation needed"}
return json_response(self.request, data)
else:
warn_form = forms.WarnForm(initial={
warn_form = import_attr(settings.CAS_WARN_FORM)(initial={
'service': self.service,
'renew': self.renew,
'gateway': self.gateway,
Expand Down Expand Up @@ -999,7 +998,7 @@ def post(request):
return HttpResponse(u"no\n", content_type="text/plain; charset=utf-8")
if not username or not password or not service:
return HttpResponse(u"no\n", content_type="text/plain; charset=utf-8")
form = forms.UserCredential(
form = import_attr(settings.CAS_USER_CREDENTIAL_FORM)(
request.POST,
initial={
'service': service,
Expand Down

0 comments on commit 80a1eac

Please sign in to comment.