11from django .contrib .gis import admin
2+ from django .contrib .admin import SimpleListFilter
23from django .contrib .postgres import fields
34from django .utils .translation import gettext as _
45from django_json_widget .widgets import JSONEditorWidget
56from django .utils .html import mark_safe
67from django .contrib import messages
7- from django .forms import ModelForm
88from django .forms .widgets import Textarea , TextInput
99import requests
1010from parler .admin import TranslatableAdmin
@@ -118,7 +118,7 @@ def save_model(self, request, obj, form, change):
118118 )
119119
120120
121- class WorkspaceAdmin (admin . OSMGeoAdmin ):
121+ class WorkspaceAdmin (TranslatableAdmin ):
122122 readonly_fields = ('id' , 'created' , 'modified' , 'get_absolute_link' )
123123 fieldsets = (
124124 (_ ('Meta' ), {
@@ -127,7 +127,7 @@ class WorkspaceAdmin(admin.OSMGeoAdmin):
127127 )
128128 }),
129129 (_ ('Main' ), {
130- 'fields' : ('title' , 'description' , 'snapshots' ),
130+ 'fields' : ('group' , ' title' , 'description' , 'snapshots' ),
131131 }),
132132 (_ ('Annotations' ), {
133133 'fields' : (
@@ -138,18 +138,61 @@ class WorkspaceAdmin(admin.OSMGeoAdmin):
138138 )
139139 }),
140140 )
141- list_display = ('id' , 'title' , 'annotations_open' , 'created' , 'modified' )
142- search_fields = ['title' ]
141+ list_display = ('title' , 'group' , 'get_absolute_link' , 'mode' , 'annotations_contact_name' , 'annotations_contact_email' , 'findme_enabled' , 'annotations_open' , 'annotations_likes_enabled' , 'polygon_open' , 'polygon_likes_enabled' , 'created' , 'modified' )
142+ list_filter = ['mode' ]
143+ search_fields = ['title' , 'description' ]
143144
144145 def formfield_for_manytomany (self , db_field , request = None , ** kwargs ):
145146 if db_field .name == 'snapshots' or db_field .name == 'categories' or db_field .name == 'usergroups' :
146147 kwargs ['widget' ] = SortedFilteredSelectMultiple ()
147148 return super ().formfield_for_manytomany (db_field , request , ** kwargs )
149+
150+ def get_queryset (self , request ):
151+ qs = super ().get_queryset (request )
152+ if not request .user .is_superuser :
153+ return qs .select_related ('group' ).filter (group__in = request .user .groups .all ())
154+ return qs
148155
149156class AttachementInline (admin .TabularInline ):
150157 model = Attachement
151158
152- class AnnotationAdmin (admin .OSMGeoAdmin ):
159+ class AnnotationWorkspaceFilter (SimpleListFilter ):
160+ title = _ ('Workspace' )
161+ parameter_name = 'workspace'
162+
163+ def lookups (self , request , model_admin ):
164+ return [(x .id , x .title ) for x in Workspace .objects .all () if request .user .is_superuser or x .group in request .user .groups .all ()]
165+
166+ def queryset (self , request , queryset ):
167+ if self .value ():
168+ return queryset .filter (workspace__id = self .value ())
169+ return queryset
170+
171+ class CategoryGroupFilter (SimpleListFilter ):
172+ title = _ ('Category' )
173+ parameter_name = 'category'
174+
175+ def lookups (self , request , model_admin ):
176+ return [(x .id , f'{ x .group .name } /{ x .name } ' ) for x in Category .objects .all () if request .user .is_superuser or x .group in request .user .groups .all ()]
177+
178+ def queryset (self , request , queryset ):
179+ if self .value ():
180+ return queryset .filter (category__id = self .value ())
181+ return queryset
182+
183+ class UsergroupGroupFilter (SimpleListFilter ):
184+ title = _ ('Usergroup' )
185+ parameter_name = 'usergroup'
186+
187+ def lookups (self , request , model_admin ):
188+ return [(x .pk , f'{ x .group .name } /{ x .name } ' ) for x in Usergroup .objects .all () if request .user .is_superuser or x .group in request .user .groups .all ()]
189+
190+ def queryset (self , request , queryset ):
191+ if self .value ():
192+ return queryset .filter (usergroup__pk = self .value ())
193+ return queryset
194+
195+ class AnnotationAdmin (admin .ModelAdmin ):
153196 readonly_fields = ('id' ,'created' , 'modified' )
154197 fieldsets = (
155198 (_ ('Meta' ), {
@@ -175,9 +218,15 @@ class AnnotationAdmin(admin.OSMGeoAdmin):
175218 'workspace' ,
176219 )
177220 inlines = [ AttachementInline , ]
178- list_filter = ('workspace' , 'category' , 'kind' , 'usergroup' )
221+ list_filter = (AnnotationWorkspaceFilter , CategoryGroupFilter , 'kind' , UsergroupGroupFilter , )
179222 search_fields = ('id' , 'data' )
180223
224+ def get_queryset (self , request ):
225+ queryset = super ().get_queryset (request )
226+ if not request .user .is_superuser :
227+ return queryset .select_related ('workspace__group' ).filter (workspace__group__in = request .user .groups .all ())
228+ return queryset
229+
181230class CategoryAdminForm (TranslatableModelForm ):
182231 class Meta :
183232 model = Category
@@ -197,22 +246,28 @@ class CategoryAdmin(TranslatableAdmin): # admin.OSMGeoAdmin,
197246 readonly_fields = ('id' , 'created' , 'modified' )
198247 fieldsets = (
199248 (_ ('Meta' ), {
200- 'fields' : ('deleted' , 'hide_in_list' , 'namespace' ),
249+ 'fields' : ('deleted' , 'hide_in_list' ),
201250 }),
202251 (_ ('Category' ), {
203- 'fields' : ('name' , 'icon' , 'color' ),
252+ 'fields' : ('group' , ' name' , 'icon' , 'color' ),
204253 }),
205254 )
206255
207256 list_display = (
208257 'name' ,
209- 'namespace ' ,
258+ 'group ' ,
210259 'color' ,
211260 'hide_in_list'
212261 )
213262
214- list_filter = ('namespace' , 'hide_in_list' , 'color' )
215- search_fields = ('id' , 'translations__name' , 'namespace' )
263+ list_filter = (CategoryGroupFilter , 'hide_in_list' , 'color' )
264+ search_fields = ('id' , 'translations__name' )
265+
266+ def get_queryset (self , request ):
267+ qs = super ().get_queryset (request )
268+ if not request .user .is_superuser :
269+ return qs .select_related ('group' ).filter (group__in = request .user .groups .all ())
270+ return qs
216271
217272class UsergroupAdmin (TranslatableAdmin ): # admin.OSMGeoAdmin,
218273 readonly_fields = ('created' , 'modified' )
@@ -221,17 +276,32 @@ class UsergroupAdmin(TranslatableAdmin): # admin.OSMGeoAdmin,
221276 'fields' : ('deleted' , 'created' , 'modified' ),
222277 }),
223278 (_ ('Category' ), {
224- 'fields' : ('key' , 'name' ),
279+ 'fields' : ('group' , ' key' , 'name' ),
225280 }),
226281 )
227282
228283 list_display = (
229284 'key' ,
285+ 'group' ,
230286 'name' ,
231287 )
232288
233289 search_fields = ('id' , 'name' , 'key' )
234290
291+ def get_queryset (self , request ):
292+ qs = super ().get_queryset (request )
293+ if not request .user .is_superuser :
294+ return qs .select_related ('group' ).filter (group__in = request .user .groups .all ())
295+ return qs
296+
297+ def _has_change_permission (needed , group , user_groups ):
298+ for g in user_groups :
299+ if g == group :
300+ for p in g .permissions .all ():
301+ if p .codename == needed :
302+ return True
303+ return False
304+
235305admin .site .register (Municipality , MunicipalityAdmin )
236306admin .site .register (Snapshot , SnapshotAdmin )
237307admin .site .register (Workspace , WorkspaceAdmin )
0 commit comments