icone rss
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / admin.py
CommitLineData
6ef8ead4 1# -*- encoding: utf-8 -*-
23b5b3d5 2import re
e3c3296e 3
6a6986bc 4from django.db import models
6ef8ead4 5from django.contrib import admin
6d885e0c 6from django.contrib.auth.admin import UserAdmin
7from django.contrib.auth.models import User
6a6986bc 8from django.contrib.admin.filterspecs import RelatedFilterSpec, FilterSpec
23b5b3d5 9from django.utils.safestring import mark_safe
6a6986bc 10from django.utils.translation import ugettext as _
11from django.utils.encoding import smart_unicode, iri_to_uri
e3c3296e 12from django.http import HttpResponseRedirect
13
6d885e0c 14from models import SourceActualite, Actualite, Discipline, Evenement, Record, ListSet, HarvestLog, Profile
23b5b3d5 15from savoirs.globals import META
6ef8ead4 16
79c398f6 17admin.site.register(SourceActualite)
92c7413b 18admin.site.register(Evenement)
6ef8ead4 19
6a6986bc 20class ListSetFilterSpec(RelatedFilterSpec):
21 """
22 Filtre custom automatiquement lié à un field nommé 'listsets'. Il a pour but de s'afficher
23 lorsqu'un server a déjà été présélectionné. Dans ce cas, il affiche une liste qui contient les
24 listsets de ce server.
25 """
26 def __init__(self, f, request, params, model, model_admin):
27 super(ListSetFilterSpec, self).__init__(f, request, params, model, model_admin)
28 self.server_name = request.GET.get('server', None)
29
30 def has_output(self):
31 return self.server_name is not None
32
6a6986bc 33FilterSpec.filter_specs.insert(0, (lambda f: f.name == 'listsets', ListSetFilterSpec))
34
23b5b3d5 35# Ces deux classes permettent d'implémenter la possibilité d'avoir un champs readonly_fields
36# dans l.administration.
37# Ce champs est devenu natif à partir de la version 1.2
38# http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields
39from django import forms
40class ReadOnlyWidget(forms.Widget):
41 def __init__(self, original_value, display_value):
42 self.original_value = original_value
43 self.display_value = display_value
44
45 super(ReadOnlyWidget, self).__init__()
46
47 def render(self, name, value, attrs=None):
48 if self.display_value is not None:
49 output = self.display_value
50 else:
51 output = unicode(self.original_value)
52
d972b61d 53 # pour les relations
54 try:
55 output = ", ".join([ls.name for ls in self.original_value.get_query_set()])
56 except:
57 pass
58
23b5b3d5 59 is_url = re.match('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', output)
60 if is_url:
61 output = "<a target='_blank' href='%s'>%s</a>" % (output, output)
d972b61d 62
23b5b3d5 63 return mark_safe(output)
64
65 def value_from_datadict(self, data, files, name):
66 return self.original_value
67
68class ReadOnlyAdminFields(object):
69 def get_form(self, request, obj=None):
70 form = super(ReadOnlyAdminFields, self).get_form(request, obj)
71
72 if hasattr(self, 'readonly_fields'):
73 for field_name in self.readonly_fields:
74 if field_name in form.base_fields:
75
76 if hasattr(obj, 'get_%s_display' % field_name):
77 display_value = getattr(obj, 'get_%s_display' % field_name)()
78 else:
79 display_value = None
80
81 form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value)
82 form.base_fields[field_name].required = False
83 return form
84
85
86class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
87 fields = [
88 'server',
89 'title',
90 'creator',
91 'description',
92 'modified',
93 'identifier',
94 'uri',
95 'source',
96 'contributor',
97 'publisher',
98 'type',
99 'format',
100 'language',
101 'disciplines',
102 'thematiques',
e3c3296e 103 'pays',
104 'regions',
c88d78dc 105 'validated',
23b5b3d5 106 ]
107
108 search_fields = []
109 readonly_fields = []
da9020f3 110
9692b801 111 list_filter = (
9692b801 112 'validated',
c65edab8 113 'server',
6a6986bc 114 'listsets',
9692b801 115 'pays',
116 'regions',
117 'disciplines',
118 'thematiques',
119 )
da9020f3 120 list_display = (
121 #OAI et extra AUF
122 'title',
123 'subject',
124 '_description',
125 '_uri',
126 #'server',
127 'identifier',
128 #'source',
129 'modified',
130 'creator',
23b5b3d5 131 #'contributor',
132 #'language',
133 #'publisher',
da9020f3 134 'format',
135 'type',
136
6d885e0c 137 #SEP 2 (aucune données récoltées)
138 #'alt_title',
139 #'abstract',
140 #'creation',
141 #'issued',
142 #'isbn',
143 #'orig_lang',
144 'est_complet',
145 'validated',
da9020f3 146 )
2be148fe 147 actions = ['valider_references',
148 'invalider_references',
149 'assigner_pays',
e3c3296e 150 'assigner_regions',
151 'assigner_disciplines',
152 'assigner_thematiques']
da9020f3 153
e3c3296e 154 # fonctions pour présenter l'information
23b5b3d5 155 def __init__(self, *args, **kwargs):
156 """Surcharge l'initialisation pour définir les champs de recherche dynamiquement,
157 et les champs en lecture seule uniquement."""
158 self.search_fields = META.keys()
159 self.readonly_fields = META.keys()
d972b61d 160 self.readonly_fields.append('listsets')
23b5b3d5 161 super(RecordAdmin, self).__init__(*args, **kwargs)
6d885e0c 162
163 def est_complet(self, obj):
164 """ """
165 v = obj.est_complet()
166 return '<img src="/admin_media/img/admin/icon-%s.gif" alt="%d"/>' % (('no','yes')[v], v)
167 est_complet.allow_tags = True
23b5b3d5 168
da9020f3 169 def _uri(self, obj):
170 """ """
171 return "<a target='_blank' href='%s'>%s</a>" % (obj.uri, obj.uri)
172 _uri.allow_tags = True
173
174 def _description(self, obj):
175 """ """
23b5b3d5 176 max = 140
177 if obj.description is not None and len(obj.description) > max:
178 return "%s..." % obj.description[:max]
179 else:
180 return obj.description
da9020f3 181
e3c3296e 182 # actions
2be148fe 183 def valider_references(self, request, queryset):
184 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
f554ef70 185 return HttpResponseRedirect("/admin/confirmation/%s/%s?ids=%s" % ('record', 'valider', ",".join(selected)))
2be148fe 186
187 def invalider_references(self, request, queryset):
188 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
f554ef70 189 return HttpResponseRedirect("/admin/confirmation/%s/%s/?ids=%s" % ('record', 'invalider', ",".join(selected)))
2be148fe 190
e3c3296e 191 def assigner_pays(self, request, queryset):
192 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
193 return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('pays', ",".join(selected)))
194
195 def assigner_regions(self, request, queryset):
196 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
197 return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('regions', ",".join(selected)))
198
199 def assigner_thematiques(self, request, queryset):
200 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
201 return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('thematiques', ",".join(selected)))
202
203 def assigner_disciplines(self, request, queryset):
204 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
205 return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('disciplines', ",".join(selected)))
206
da9020f3 207admin.site.register(Record, RecordAdmin)
208
d972b61d 209class ListSetAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
9eda5d6c 210 fields = ['spec', 'name', 'server', 'validated' ]
d972b61d 211 list_display = fields
212 readonly_fields = ['spec', 'name', 'server',]
213 list_filter = ('server',)
214
215admin.site.register(ListSet, ListSetAdmin)
216
23b5b3d5 217class HarvestLogAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
a85ba76e 218 fields = ['context', 'name', 'added', 'updated', 'processed', 'record']
23b5b3d5 219 list_display = fields + ['date']
220 admin_order_fields = ['date']
221 search_fields = fields
222 readonly_fields = fields
223 list_filter = ('context',)
224
225admin.site.register(HarvestLog, HarvestLogAdmin)
6d885e0c 226
227class ProfileInline(admin.TabularInline):
228 model = Profile
229 fk_name = 'user'
230 max_num = 1
231
232class UserProfileAdmin(UserAdmin):
233 inlines = [ProfileInline, ]
234
235admin.site.unregister(User)
236admin.site.register(User, UserProfileAdmin)
237
f554ef70 238class ActualiteAdmin(admin.ModelAdmin):
239 list_filter = ('visible',)
ccbc4363 240 list_display = ('titre', 'source', 'date', 'visible')
f554ef70 241 actions = ['rendre_visible', 'rendre_invisible']
242
243 # actions
244 def rendre_visible(self, request, queryset):
245 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
246 return HttpResponseRedirect("/admin/confirmation/%s/%s?ids=%s" % ('actualite', 'visible', ",".join(selected)))
247
248 def rendre_invisible(self, request, queryset):
249 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
250 return HttpResponseRedirect("/admin/confirmation/%s/%s?ids=%s" % ('actualite', 'invisible', ",".join(selected)))
251
252admin.site.register(Actualite, ActualiteAdmin)