diff options
Diffstat (limited to 'chimere/admin.py')
| -rw-r--r-- | chimere/admin.py | 156 | 
1 files changed, 81 insertions, 75 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 2672306..60d1141 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -25,8 +25,7 @@ import datetime  from django import forms  from django.conf import settings  from django.contrib import admin, messages -from django.contrib.auth.models import User, Group -from django.contrib.auth.admin import GroupAdmin +from django.contrib.admin import SimpleListFilter  from django.core.exceptions import ObjectDoesNotExist  from django.db.models import Q  from django.http import HttpResponse, HttpResponseRedirect @@ -38,30 +37,18 @@ try:  except ImportError:      pass -from chimere.forms import MarkerAdminForm, RouteAdminForm, MapAdminForm,\ +from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\       NewsAdminForm, CategoryAdminForm, ImporterAdminForm, OSMForm, \       PageAdminForm, PictureFileAdminForm, MultimediaFileAdminForm +from chimere import models  from chimere.models import Category, Icon, SubCategory, Marker, \ -     PropertyModel, News, Route, Map, ColorTheme, Color, \ -     MultimediaFile, PictureFile, Importer, Layer, MapLayers,\ -     PropertyModelChoice, MultimediaExtension, Page, MapUsers, MapGroups,\ -     get_maps_for_user, get_users_by_map, ImporterKeyCategories +     PropertyModel, News, Route, Area, ColorTheme, Color, \ +     MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ +     PropertyModelChoice, MultimediaExtension, Page,\ +     get_areas_for_user, get_users_by_area, ImporterKeyCategories  from chimere.utils import unicode_normalize, ShapefileManager, KMLManager,\                            CSVManager -admin.site.unregister(Group) - -class UserInline(admin.StackedInline): -    model = User.groups.through -    verbose_name = _(u'User') -    verbose_name_plural = _(u'User') -    extra = 1 - -class GroupAdmin(GroupAdmin): -    inlines = [ UserInline, ] - -admin.site.register(Group, GroupAdmin) -  def disable(modeladmin, request, queryset):      for item in queryset:          item.status = 'D' @@ -99,18 +86,14 @@ def export_to_shapefile(modeladmin, request, queryset):      return response  export_to_shapefile.short_description = _(u"Export to Shapefile") -def _export_to_csv(cols=[]): -    def func(modeladmin, request, queryset): -        u""" -        Export data to CSV -        """ -        filename, result = CSVManager.export(queryset, cols=cols) -        response = HttpResponse(result, mimetype='text/csv') -        response['Content-Disposition'] = 'attachment; filename=%s' % filename -        return response -    return func - -export_to_csv = _export_to_csv() +def export_to_csv(modeladmin, request, queryset): +    u""" +    Export data to CSV +    """ +    filename, result = CSVManager.export(queryset) +    response = HttpResponse(result, mimetype='text/csv') +    response['Content-Disposition'] = 'attachment; filename=%s' % filename +    return response  export_to_csv.short_description = _(u"Export to CSV")  def managed_modified(modeladmin, request, queryset): @@ -195,13 +178,53 @@ class MultimediaInline(admin.TabularInline):      ordering = ('order',)      form = MultimediaFileAdminForm +class AreaMarkerListFilter(admin.SimpleListFilter): +    title = _('area') +    parameter_name = 'area' + +    def lookups(self, request, model_admin): +        return [(area.urn, area.name) for area in models.Area.objects.all()] + +    def queryset(self, request, queryset): +        try: +            area = models.Area.objects.get(urn=self.value()) +        except models.Area.DoesNotExist: +            return queryset +        return queryset.filter(area.getIncludeMarker()) + +class AreaRouteListFilter(AreaMarkerListFilter): +    def queryset(self, request, queryset): +        try: +            area = models.Area.objects.get(urn=self.value()) +        except models.Area.DoesNotExist: +            return queryset +        return queryset.filter(area.getIncludeRoute()) + +class HasCategoriesListFilter(SimpleListFilter): +    title = _('Has categories') +    parameter_name = 'has_category' + +    def lookups(self, request, model_admin): +        return ( +            ('true', _('Yes')), +            ('false', _('No')), +        ) + +    def queryset(self, request, queryset): +        if self.value() == 'false': +            return queryset.filter(categories__isnull=True) +        elif self.value() == 'true': +            return queryset.exclude(categories__isnull=True) +        return queryset +  class MarkerAdmin(admin.ModelAdmin):      """      Specialized the Point field.      """      search_fields = ("name",)      list_display = ('name', 'status', 'start_date', 'end_date') -    list_filter = ('status', 'categories', 'start_date', 'end_date') +    list_filter = ('status', AreaMarkerListFilter, 'categories', +                   HasCategoriesListFilter, 'start_date', 'end_date')      actions = [validate, disable, managed_modified, export_to_kml,                 export_to_shapefile, export_to_csv]      exclude = ['submiter_session_key', 'import_key', 'import_version', @@ -211,7 +234,7 @@ class MarkerAdmin(admin.ModelAdmin):      form = MarkerAdminForm      fieldsets = ((None, {                      'fields': ['point', 'name', 'status', 'categories', -               'description', 'weight', 'keywords', 'start_date', 'end_date'] +                           'description', 'keywords', 'start_date', 'end_date']                    }),                   (_(u"Submitter"), {                      'classes':('collapse',), @@ -247,10 +270,10 @@ class MarkerAdmin(admin.ModelAdmin):      def queryset(self, request):          qs = self.model._default_manager.get_query_set()          if not request.user.is_superuser: -            maps = get_maps_for_user(request.user) +            areas = get_areas_for_user(request.user)              contained = Q() -            for map in maps: -                contained = contained | map.getIncludeMarker() +            for area in areas: +                contained = contained | area.getIncludeMarker()              qs = qs.filter(contained)          ordering = self.ordering or ()          if ordering: @@ -280,7 +303,7 @@ class RouteAdmin(MarkerAdmin):      """      search_fields = ("name",)      list_display = ('name', 'status') -    list_filter = ('status', 'categories') +    list_filter = ('status', AreaRouteListFilter, 'categories')      exclude = ['height', 'width']      form = RouteAdminForm      readonly_fields = ('associated_file', 'ref_item', 'has_associated_marker') @@ -312,10 +335,10 @@ class RouteAdmin(MarkerAdmin):      def queryset(self, request):          qs = self.model._default_manager.get_query_set()          if not request.user.is_superuser: -            maps = get_maps_for_user(request.user) +            areas = get_areas_for_user(request.user)              contained = Q() -            for map in maps: -                contained = contained | map.getIncludeRoute() +            for area in areas: +                contained = contained | area.getIncludeRoute()              qs = qs.filter(contained)          ordering = self.ordering or ()          if ordering: @@ -330,24 +353,16 @@ class RouteAdmin(MarkerAdmin):                                  Route.objects.filter(pk=item_id))  class LayerInline(admin.TabularInline): -    model = MapLayers -    extra = 1 - -class UserInline(admin.TabularInline): -    model = MapUsers -    extra = 1 - -class GroupInline(admin.TabularInline): -    model = MapGroups +    model = AreaLayers      extra = 1 -class MapAdmin(admin.ModelAdmin): +class AreaAdmin(admin.ModelAdmin):      """ -    Specialized the map field. +    Specialized the area field.      """ -    form = MapAdminForm +    form = AreaAdminForm      exclude = ['upper_left_corner', 'lower_right_corner'] -    inlines = [UserInline, GroupInline, LayerInline] +    inlines = [LayerInline]      list_display = ['name', 'order', 'available', 'default']  def importing(modeladmin, request, queryset): @@ -422,6 +437,7 @@ class ImporterAdmin(admin.ModelAdmin):      readonly_fields = ('state',)      actions = [importing, cancel_import, export_to_osm, cancel_export]      inlines = [ImporterKeyInline] +admin.site.register(Importer, ImporterAdmin)  class PageAdmin(admin.ModelAdmin):      """ @@ -466,25 +482,15 @@ class PropertyModelChoiceInline(admin.TabularInline):  class PropertyModelAdmin(admin.ModelAdmin):      inlines = [PropertyModelChoiceInline] -# only register if not yet registered: this mecanism allow to specialized admin -# in projects -registered_models = admin.site._registry.keys() -for model, modeladmin in ((Importer, ImporterAdmin), -                          (Page, PageAdmin), -                          (News, NewsAdmin), -                          (Category, CategoryAdmin), -                          (Icon, IconAdmin), -                          (Marker, MarkerAdmin), -                          (Route, RouteAdmin), -                          (Map, MapAdmin), -                          (ColorTheme, ColorThemeAdmin), -                          (Layer, None)): -    if model not in registered_models: -        if modeladmin: -            admin.site.register(model, modeladmin) -        else: -            admin.site.register(model) - -if PropertyModel not in registered_models and \ -   not settings.CHIMERE_HIDE_PROPERTYMODEL: +# register of differents database fields +admin.site.register(Page, PageAdmin) +admin.site.register(News, NewsAdmin) +admin.site.register(Category, CategoryAdmin) +admin.site.register(Icon, IconAdmin) +admin.site.register(Marker, MarkerAdmin) +admin.site.register(Route, RouteAdmin) +if not settings.CHIMERE_HIDE_PROPERTYMODEL:      admin.site.register(PropertyModel, PropertyModelAdmin) +admin.site.register(Area, AreaAdmin) +admin.site.register(ColorTheme, ColorThemeAdmin) +admin.site.register(Layer)  | 
