Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
Refactor icekit.admin* and icekit.utils.admin.* to icekit.admin_tools…
Browse files Browse the repository at this point in the history
….*. Previous classes/functions are deprecated.
  • Loading branch information
Greg Turner committed Mar 5, 2017
1 parent 25bde0a commit 8cea84f
Show file tree
Hide file tree
Showing 27 changed files with 780 additions and 482 deletions.
2 changes: 1 addition & 1 deletion docs/architecture/content/content-plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ with two mixin classes:

# admin.py

from icekit.admin_mixins import FluentLayoutsMixin
from icekit.admin_tools.mixins import FluentLayoutsMixin

class MyModelAdmin(FluentLayoutsMixin, MyModelAdminBase):
...
Expand Down
6 changes: 5 additions & 1 deletion docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Changelog
In development
--------------

- Refactor icekit.admin* and icekit.utils.admin.* to icekit.admin_tools.*
in preparation for admin consolidation and extension. Previous classes and
functions are deprecated.

- Add ``icekit.workflow`` application to associate, manage, and filter
workflow state information like status and user-assigment for
arbitrary models.
Expand Down Expand Up @@ -119,7 +123,7 @@ Breaking changes
``icekit.abstract_models``.

- Import admin mixin ``FluentLayoutsMixin`` from
``icekit.admin_mixins`` module instead of ``icekit.admin``.
``icekit.admin_tools.mixins`` module instead of ``icekit.admin``.

0.14.1 (2016-09-26)
-------------------
Expand Down
2 changes: 1 addition & 1 deletion docs/customising/content-plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ models, with two mixin classes:

# admin.py

from icekit.admin_mixins import FluentLayoutsMixin
from icekit.admin_tools.mixins import FluentLayoutsMixin

class MyModelAdmin(FluentLayoutsMixin, MyModelAdminBase):
...
Expand Down
11 changes: 7 additions & 4 deletions icekit/abstract_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@
from django.utils import encoding, timezone
from django.utils.translation import ugettext_lazy as _
from fluent_contents.analyzer import get_template_placeholder_data
from fluent_contents.extensions import ContentPlugin
from fluent_contents.models import ContentItem
from icekit import appsettings
from icekit.admin_tools.filters import ChildModelFilter



from . import fields, plugins

ChildModelFilter



class AbstractBaseModel(models.Model):
"""
Expand Down Expand Up @@ -143,4 +146,4 @@ class BoostedTermsMixin(models.Model):
)

class Meta:
abstract = True
abstract = True
185 changes: 57 additions & 128 deletions icekit/admin.py
Original file line number Diff line number Diff line change
@@ -1,141 +1,15 @@
"""
Admin configuration for ``icekit`` app.
"""
# Admin for top-level ICEKit models
import warnings

# Define `list_display`, `list_filter` and `search_fields` for each model.
# These go a long way to making the admin more usable.
from django.conf import settings
from django.conf.urls import url, patterns
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.http import JsonResponse
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy as _
from polymorphic.admin import PolymorphicParentModelAdmin

from icekit.publishing.admin import PublishingAdmin, \
PublishableFluentContentsAdmin, ICEKitFluentPagesParentAdminMixin
from icekit.workflow.admin import WorkflowMixinAdmin, \
WorkflowStateTabularInline

from icekit import models


# FILTERS #####################################################################


class ChildModelFilter(admin.SimpleListFilter):
title = _('type')
parameter_name = 'type'

child_model_plugin_class = None

def lookups(self, request, model_admin):
lookups = [
(p.content_type.pk, p.verbose_name.capitalize())
for p in self.child_model_plugin_class.get_plugins()
]
return lookups

def queryset(self, request, queryset):
value = self.value()
if value:
content_type = ContentType.objects.get_for_id(value)
return queryset.filter(polymorphic_ctype=content_type)


# MIXINS ######################################################################


class ICEkitContentsAdmin(PublishingAdmin, WorkflowMixinAdmin):
"""
A base for generic admins that will include ICEkit features:
- publishing
- workflow
"""
list_display = PublishingAdmin.list_display + \
WorkflowMixinAdmin.list_display
list_filter = PublishingAdmin.list_filter + \
WorkflowMixinAdmin.list_filter
inlines = [WorkflowStateTabularInline]


class ICEkitFluentContentsAdmin(
PublishableFluentContentsAdmin, WorkflowMixinAdmin):
"""
A base for Fluent Contents admins that will include ICEkit features:
- publishing
- workflow
"""
list_display = ICEkitContentsAdmin.list_display
list_filter = ICEkitContentsAdmin.list_filter
inlines = ICEkitContentsAdmin.inlines


class PolymorphicAdminUtilsMixin(admin.ModelAdmin):
"""
Utility methods for working with Polymorphic admins.
"""
def child_type_name(self, inst):
"""
e.g. for use in list_display
:param inst: a polymorphic parent instance
:return: The name of the polymorphic model
"""
return capfirst(inst.polymorphic_ctype.name)
child_type_name.short_description = "Type"


class ChildModelPluginPolymorphicParentModelAdmin(
PolymorphicParentModelAdmin,
PolymorphicAdminUtilsMixin
):
"""
Get child models and choice labels from registered plugins.
"""

child_model_plugin_class = None
child_model_admin = None

def get_child_type_choices(self, request, action):
"""
Override choice labels with ``verbose_name`` from plugins and sort.
"""
# Get choices from the super class to check permissions.
choices = super(ChildModelPluginPolymorphicParentModelAdmin, self) \
.get_child_type_choices(request, action)
# Update label with verbose name from plugins.
plugins = self.child_model_plugin_class.get_plugins()
if plugins:
labels = {
plugin.content_type.pk: capfirst(plugin.verbose_name) for plugin in plugins
}
choices = [(ctype, labels[ctype]) for ctype, _ in choices]
return sorted(choices, lambda a, b: cmp(a[1], b[1]))
return choices

def get_child_models(self):
"""
Get child models from registered plugins. Fallback to the child model
admin and its base model if no plugins are registered.
"""
child_models = []
for plugin in self.child_model_plugin_class.get_plugins():
child_models.append((plugin.model, plugin.model_admin))
if not child_models:
child_models.append((
self.child_model_admin.base_model,
self.child_model_admin,
))
return child_models



# MODELS ######################################################################


class LayoutAdmin(admin.ModelAdmin):
filter_horizontal = ('content_types',)
list_display = ('title', 'display_template_name', 'display_content_types' )
Expand Down Expand Up @@ -220,3 +94,58 @@ class MediaCategoryAdmin(admin.ModelAdmin):

admin.site.register(models.Layout, LayoutAdmin)
admin.site.register(models.MediaCategory, MediaCategoryAdmin)

# Classes that used to be here

from icekit.admin_tools.filters import \
ChildModelFilter as new_ChildModelFilter
from icekit.admin_tools.mixins import \
ICEkitContentsAdmin as new_ICEkitContentsAdmin, \
ICEkitFluentContentsAdmin as new_ICEkitFluentContentsAdmin

from icekit.admin_tools.polymorphic import \
PolymorphicAdminUtilsMixin as new_PolymorphicAdminUtilsMixin, \
ChildModelPluginPolymorphicParentModelAdmin as new_ChildModelPluginPolymorphicParentModelAdmin

from icekit.utils.deprecation import deprecated

@deprecated
class ChildModelFilter(new_ChildModelFilter):
"""
.. deprecated::
Use :class:`icekit.admin_tools.filters.ChildModelFilter` instead.
"""
pass

@deprecated
class ICEkitContentsAdmin(new_ICEkitContentsAdmin):
"""
.. deprecated::
Use :class:`icekit.admin_tools.mixins.ICEkitContentsAdmin` instead.
"""
pass

@deprecated
class ICEkitFluentContentsAdmin(new_ICEkitFluentContentsAdmin):
"""
.. deprecated::
Use :class:`icekit.admin_tools.mixins.ICEkitFluentContentsAdmin` instead.
"""
pass

@deprecated
class PolymorphicAdminUtilsMixin(new_PolymorphicAdminUtilsMixin):
"""
.. deprecated::
Use :class:`icekit.admin_tools.polymorphic.PolymorphicAdminUtilsMixin` instead.
"""
pass

@deprecated
class ChildModelPluginPolymorphicParentModelAdmin(new_ChildModelPluginPolymorphicParentModelAdmin):
"""
.. deprecated::
Use :class:`icekit.admin_tools.polymorphic.ChildModelPluginPolymorphicParentModelAdmin` instead.
"""
pass

41 changes: 14 additions & 27 deletions icekit/admin_forms.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,19 @@
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import PasswordResetForm
import warnings

warnings.warn(
"the icekit.admin_forms module is deprecated. Use icekit.admin_tools.forms instead.",
DeprecationWarning,
stacklevel=2)

class PasswordResetForm(PasswordResetForm):
"""
An extended Password reset form designed for staff users.
It limits the users allowed to use this form the send them a
password reset email to staff users only.
"""
def get_users(self, email):
"""
Make sure users are staff users.

Additionally to the other PasswordResetForm conditions ensure
that the user is a staff user before sending them a password
reset email.
from icekit.utils.deprecation import deprecated

:param email: Textual email address.
:return: List of users.
"""
# Django 1.8 supports this feature.
if hasattr(super(PasswordResetForm, self), 'get_users'):
return (
u for u in super(PasswordResetForm, self).get_users(email)
if u.is_staff and u.is_active
)
from icekit.admin_tools.forms import PasswordResetForm as new_PasswordResetForm

# Django Django < 1.8 support we can do this manually.
active_users = get_user_model()._default_manager.filter(email__iexact=email, is_active=True)
return (u for u in active_users if u.has_usable_password() and u.is_staff and u.is_active)
@deprecated
class PasswordResetForm(new_PasswordResetForm):
"""
.. deprecated::
Use :class:`icekit.admin_tools.forms.PasswordResetForm` instead.
"""
pass

0 comments on commit 8cea84f

Please sign in to comment.