Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from django.core.urlresolvers import reverse
from django.utils import formats
from django.utils.translation import ugettext_lazy as _
from django.utils import six
try:
from cms.admin.placeholderadmin import FrontendEditableAdminMixin, PlaceholderAdminMixin
except ImportError:
# temporary django-cms backward compat
from cms.admin.placeholderadmin import (
FrontendEditableAdmin as FrontendEditableAdminMixin,
PlaceholderAdmin as PlaceholderAdminMixin
)
from newsbox.admin import NewsboxBaseAdmin, remove_field_from_fieldsets, add_fields_to_fieldset
class CustomModelCMSAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("newsbox_cms/custom_model.css",)
}
def CustomModelCMSAdminFactory(
object_title=None,
edit_link_short_description=_('title'),
edit_link_admin_order_field=None,
):
class klass(CustomModelCMSAdmin):
def edit_link_title(self, obj, func_or_attr=None):
if func_or_attr is not None:
if isinstance(func_or_attr, basestring):
if not hasattr(obj, func_or_attr):
raise ValueError(
'func_or_attr is a string, it needs to be'
' an object attribute (eventualy a function)'
)
attr = getattr(obj, func_or_attr)
if callable(attr):
title = attr(obj)
else:
title = attr
elif callable(func_or_attr):
title = func_or_attr(obj)
else:
raise ValueError('func_or_attr needs to be either a string or a collable')
else:
title = six.text_type(obj)
return title
def edit_link(self, obj):
"""
build the change list edit link
"""
output = ''
edit_url = reverse(
'admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name),
args=[obj.pk])
show_url = None
if hasattr(obj, 'get_absolute_url'):
show_url = obj.get_absolute_url()
output = '<a class="edit" href="{edit_url}" title="{edit_label}"></a>'
if show_url:
output += '<a class="title" href="{show_url}" target="_parent" title="{show_label}">{title}</a>'
else:
output += '<span class="title">{title}</span>'
return output.format(
edit_url=edit_url, show_url=show_url, show_label=_("show object's page"),
title=self.edit_link_title(obj, object_title), edit_label=_("edit object's parameters"))
edit_link.allow_tags = True
edit_link.short_description = edit_link_short_description
edit_link.admin_order_field = edit_link_admin_order_field
def get_list_display(self, request):
list_display = super(CustomModelCMSAdmin, self).get_list_display(request)
list_display = list(list_display)
del list_display[0]
list_display.insert(0, 'edit_link')
return list_display
def get_list_display_links(self, request, list_display):
return [None, ]
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
return klass
def newsbox_admin_title(obj):
return '{date}<br/>{title}'.format(
date=formats.date_format(obj.newsbox_date, 'DATE_FORMAT'),
title=six.text_type(obj)
)
class NewsboxCMSAdmin(
#XXX: hvad TranslatableAdmin doesn't support admin_order_field on translated field
# CustomModelCMSAdminFactory(edit_link_admin_order_field='newsbox_title'),
CustomModelCMSAdminFactory(object_title=newsbox_admin_title, edit_link_admin_order_field='newsbox_date'),
FrontendEditableAdminMixin,
PlaceholderAdminMixin,
NewsboxBaseAdmin
):
def __init__(self, *args, **kwargs):
# We manage the edit link ourself
self.list_display_links = (None, )
return super(NewsboxCMSAdmin, self).__init__(*args, **kwargs)
def get_fieldsets(self, request, obj=None):
fieldsets = super(NewsboxCMSAdmin, self).get_fieldsets(request, obj)
remove_field_from_fieldsets('newsbox_body', fieldsets)
add_fields_to_fieldset(
['newsbox_summary'],
fieldsets,
same_fieldset_as='newsbox_published',
replace_existing_field=True,
remove_empty_fieldset=True,
)
return fieldsets
def get_list_display(self, request):
list_display = super(NewsboxCMSAdmin, self).get_list_display(request)
if 'newsbox_date_short' in list_display:
list_display.remove('newsbox_date_short')