diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5b2b3f504bd1dbff4444dc7e4650cd39800fddd3..6806ee00f1201fc4bb40e5a845d9925c79fd91e2 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,7 @@ Fixed * Fix order of submit buttons in login form and restructure login template to make 2FA work correctly. +* Fix page title bug on the impersonate page. * Provide `style.css` and icon files without any authentication to avoid caching issues. `2.0rc7`_ - 2021-10-18 @@ -41,6 +42,7 @@ Added * OpenID Connect scope and accompanying claim ``groups`` * Support config files in JSON format * Allow apps to dynamically generate OAuth scopes +* Provide an ``ExtensiblePolymorphicModel`` to support the features of extensible models for polymorphic models and vice-versa. Changed ~~~~~~~ diff --git a/aleksis/core/managers.py b/aleksis/core/managers.py index ade623230aff2b8663e976ae4c133c3e24b979b4..aed4cab72d4b0cd53d3544b20f0180a7087dfd2c 100644 --- a/aleksis/core/managers.py +++ b/aleksis/core/managers.py @@ -120,3 +120,7 @@ class InstalledWidgetsDashboardWidgetOrderManager(Manager): # [obj["id"] for obj in list(Person.objects.all().values("id"))] return super().get_queryset().filter(widget_id__in=dashboard_widget_pks) + + +class PolymorphicCurrentSiteManager(_CurrentSiteManager, PolymorphicManager): + """Default manager for extensible, polymorphic models.""" diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py index fa6c4fa29a67ec2904e42dba173ce72575c0e6ba..1e4fd42168f66d4ca986dca670f277ead0cbf3e7 100644 --- a/aleksis/core/mixins.py +++ b/aleksis/core/mixins.py @@ -24,9 +24,16 @@ from guardian.admin import GuardedModelAdmin from guardian.core import ObjectPermissionChecker from jsonstore.fields import IntegerField, JSONFieldMixin from material.base import Layout, LayoutNode +from polymorphic.base import PolymorphicModelBase +from polymorphic.managers import PolymorphicManager +from polymorphic.models import PolymorphicModel from rules.contrib.admin import ObjectPermissionsModelAdmin -from aleksis.core.managers import CurrentSiteManagerWithoutMigrations, SchoolTermRelatedQuerySet +from aleksis.core.managers import ( + CurrentSiteManagerWithoutMigrations, + PolymorphicCurrentSiteManager, + SchoolTermRelatedQuerySet, +) class _ExtensibleModelBase(models.base.ModelBase): @@ -351,6 +358,22 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): abstract = True +class _ExtensiblePolymorphicModelBase(_ExtensibleModelBase, PolymorphicModelBase): + """Base class for extensible, polymorphic models.""" + + +class ExtensiblePolymorphicModel( + ExtensibleModel, PolymorphicModel, metaclass=_ExtensiblePolymorphicModelBase +): + """Model class for extensible, polymorphic models.""" + + objects = PolymorphicCurrentSiteManager() + objects_all_sites = PolymorphicManager() + + class Meta: + abstract = True + + class PureDjangoModel(object): """No-op mixin to mark a model as deliberately not using ExtensibleModel.""" diff --git a/aleksis/core/templates/impersonate/list_users.html b/aleksis/core/templates/impersonate/list_users.html index aff2f8660ac374cebb1bbeff646bc038aee9e5f1..fd273ca60902e5defbc41e567a9205cfe99fb349 100644 --- a/aleksis/core/templates/impersonate/list_users.html +++ b/aleksis/core/templates/impersonate/list_users.html @@ -4,9 +4,8 @@ {% extends "core/base.html" %} {% load i18n %} -{% block page_title %} - {% blocktrans %}Impersonate user{% endblocktrans %} -{% endblock %} +{% block browser_title %}{% trans "Impersonate" %}{% endblock %} +{% block page_title %}{% trans "Impersonate" %}{% endblock %} {% block content %} {% if page.object_list %}