diff options
Diffstat (limited to 'chimere/admin.py')
-rw-r--r-- | chimere/admin.py | 208 |
1 files changed, 130 insertions, 78 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 66816bc..ce1f2b9 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -20,6 +20,9 @@ """ Settings for administration pages """ + +from copy import deepcopy + from django.conf import settings from django.contrib import admin, messages from django.contrib.admin import SimpleListFilter @@ -37,17 +40,17 @@ except ImportError: pass from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\ - NewsAdminForm, CategoryAdminForm, ImporterAdminForm, OSMForm, \ - PageAdminForm, PictureFileAdminForm, MultimediaFileAdminForm + NewsAdminForm, CategoryAdminForm, ImporterAdminForm, OSMForm, \ + PageAdminForm, PictureFileAdminForm, MultimediaFileAdminForm, \ + PolygonAdminForm from chimere import models from chimere.models import Category, Icon, SubCategory, Marker, \ - PropertyModel, News, Route, Area, ColorTheme, Color, \ - MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ - PropertyModelChoice, MultimediaExtension, Page,\ - get_areas_for_user, get_users_by_area, ImporterKeyCategories,\ - SubCategoryUserLimit -from chimere.utils import unicode_normalize, ShapefileManager, KMLManager,\ - CSVManager + PropertyModel, News, Route, Area, ColorTheme, Color, \ + MultimediaFile, PictureFile, Importer, Layer, AreaLayers,\ + PropertyModelChoice, Page, get_areas_for_user, \ + ImporterKeyCategories, SubCategoryUserLimit +from chimere.utils import ShapefileManager, KMLManager, CSVManager + def disable(modeladmin, request, queryset): for item in queryset: @@ -55,23 +58,26 @@ def disable(modeladmin, request, queryset): item.save() disable.short_description = _(u"Disable") + def validate(modeladmin, request, queryset): for item in queryset: item.status = 'A' item.save() validate.short_description = _(u"Validate") + def export_to_kml(modeladmin, request, queryset): u""" Export data to KML """ filename, result = KMLManager.export(queryset) response = HttpResponse(result, - mimetype='application/vnd.google-earth.kml+xml') + mimetype='application/vnd.google-earth.kml+xml') response['Content-Disposition'] = 'attachment; filename=%s' % filename return response export_to_kml.short_description = _(u"Export to KML") + def export_to_shapefile(modeladmin, request, queryset): u""" Export data to Shapefile @@ -86,6 +92,7 @@ def export_to_shapefile(modeladmin, request, queryset): return response export_to_shapefile.short_description = _(u"Export to Shapefile") + def export_to_csv(modeladmin, request, queryset): u""" Export data to CSV @@ -96,6 +103,7 @@ def export_to_csv(modeladmin, request, queryset): return response export_to_csv.short_description = _(u"Export to CSV") + def managed_modified(modeladmin, request, queryset): # not very clean... There is must be a better way to do that redirect_url = request.get_full_path().split('admin_modification')[0] @@ -108,8 +116,8 @@ def managed_modified(modeladmin, request, queryset): item = queryset.all()[0] if not item.ref_item or item.ref_item == item: try: - item = modeladmin.model.objects.filter(ref_item=item - ).exclude(pk=item.pk).all()[0] + item = modeladmin.model.objects.filter(ref_item=item)\ + .exclude(pk=item.pk).all()[0] except IndexError: messages.error(request, _(u"No modified item associated " u"to the selected item.")) @@ -160,7 +168,7 @@ def managed_modified(modeladmin, request, queryset): messages.success(request, _(u"Modified item traited.")) return HttpResponseRedirect(redirect_url) return render_to_response('admin/chimere/managed_modified.html', - {'item':item, 'item_ref':item_ref}, + {'item': item, 'item_ref': item_ref}, context_instance=RequestContext(request)) managed_modified.short_description = _(u"Managed modified items") @@ -218,6 +226,15 @@ class AreaRouteListFilter(AreaMarkerListFilter): return queryset.filter(area.getIncludeRoute()) +class AreaPolygonListFilter(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.getIncludePolygon()) + + class HasCategoriesListFilter(SimpleListFilter): title = _('Has categories') parameter_name = 'has_category' @@ -271,6 +288,38 @@ def moderator_right(user, qs, geo_type='marker'): limited_for_user__user=user).all()) return qs +MARKER_FIELDSETS = [ + [None, { + 'fields': ['point', 'name', 'status', 'categories', 'description', + 'keywords', 'start_date', 'end_date'] + }], + [_(u"Submitter"), { + 'classes': ('collapse',), + 'fields': ('submiter_name', 'submiter_email', 'submiter_comment') + }], + [_(u"Import"), { + 'classes': ('collapse',), + 'fields': ('not_for_osm', 'modified_since_import', 'import_source', + 'origin', 'license') + }], + [_(u"Associated items"), { + 'classes': ('collapse',), + 'fields': ['ref_item', 'route'] + }] +] + +ROUTE_FIELDSETS = deepcopy(MARKER_FIELDSETS) +ROUTE_FIELDSETS[0][1]['fields'][0] = 'route' +ROUTE_FIELDSETS[0][1]['fields'].pop(ROUTE_FIELDSETS[0][1]['fields'].index( + 'description')) +ROUTE_FIELDSETS[3][1]['fields'] = ('ref_item', 'associated_file', + 'has_associated_marker') +POLYGON_FIELDSETS = deepcopy(MARKER_FIELDSETS) +POLYGON_FIELDSETS[0][1]['fields'][0] = 'polygon' +POLYGON_FIELDSETS[0][1]['fields'].pop(POLYGON_FIELDSETS[0][1]['fields'].index( + 'description')) +POLYGON_FIELDSETS.pop(3) + class MarkerAdmin(admin.ModelAdmin): """ @@ -284,28 +333,11 @@ class MarkerAdmin(admin.ModelAdmin): export_to_shapefile, export_to_csv] exclude = ['submiter_session_key', 'import_key', 'import_version', 'available_date', 'ref_item'] - readonly_fields = ['submiter_email', 'submiter_comment', 'import_source', - 'submiter_name', 'ref_item', 'modified_since_import', 'route'] + readonly_fields = [ + 'submiter_email', 'submiter_comment', 'import_source', + 'submiter_name', 'ref_item', 'modified_since_import', 'route'] form = MarkerAdminForm - fieldsets = ((None, { - 'fields': ['point', 'name', 'status', 'categories', - 'description', 'keywords', 'start_date', 'end_date'] - }), - (_(u"Submitter"), { - 'classes':('collapse',), - 'fields': ('submiter_name', 'submiter_email', - 'submiter_comment') - }), - (_(u"Import"), { - 'classes':('collapse',), - 'fields': ('not_for_osm', 'modified_since_import', - 'import_source', 'origin', 'license') - }), - (_(u"Associated items"), { - 'classes':('collapse',), - 'fields': ('ref_item', 'route',) - }), - ) + fieldsets = MARKER_FIELDSETS inlines = [MultimediaInline, PictureInline] has_properties = True @@ -315,8 +347,8 @@ class MarkerAdmin(admin.ModelAdmin): """ if self.has_properties: main_fields = self.fieldsets[0][1]['fields'] - for pm in PropertyModel.objects.filter(available=True).order_by('order' - ).all(): + for pm in PropertyModel.objects.filter(available=True)\ + .order_by('order').all(): pm_name = pm.getNamedId() if pm_name not in main_fields: main_fields.append(pm_name) @@ -334,13 +366,14 @@ class MarkerAdmin(admin.ModelAdmin): ''' Redirect to the marker modification form ''' - return managed_modified(self, request, - Marker.objects.filter(pk=item_id)) + return managed_modified( + self, request, Marker.objects.filter(pk=item_id)) def get_urls(self): from django.conf.urls.defaults import patterns, url urls = super(MarkerAdmin, self).get_urls() - my_urls = patterns('', + my_urls = patterns( + '', url(r'^admin_modification/(?P<item_id>\d+)/$', self.admin_site.admin_view(self.admin_modification), name='admin-modification'), @@ -371,26 +404,7 @@ class RouteAdmin(MarkerAdmin): readonly_fields = ('associated_file', 'ref_item', 'has_associated_marker') actions = [validate, disable, managed_modified, export_to_kml, export_to_shapefile, export_to_csv] - fieldsets = ((None, { - 'fields': ['route', 'name', 'status', 'categories', - 'start_date', 'end_date'] - }), - (_(u"Submitter"), { - 'classes':('collapse',), - 'fields': ('submiter_name', 'submiter_email', - 'submiter_comment') - }), - (_(u"Import"), { - 'classes':('collapse',), - 'fields': ('modified_since_import', 'import_source', - 'origin', 'license') - }), - (_(u"Associated items"), { - 'classes':('collapse',), - 'fields': ('ref_item', 'associated_file', - 'has_associated_marker') - }), - ) + fieldsets = ROUTE_FIELDSETS inlines = [] has_properties = False @@ -409,10 +423,29 @@ class RouteAdmin(MarkerAdmin): return managed_modified(self, request, Route.objects.filter(pk=item_id)) + +class PolygonAdmin(MarkerAdmin): + """ + Specialized the Polygon field. + """ + list_filter = ('status', AreaPolygonListFilter, 'categories') + form = PolygonAdminForm + actions = [validate, disable, managed_modified, export_to_kml, + export_to_shapefile, export_to_csv] + readonly_fields = [ + 'submiter_email', 'submiter_comment', 'import_source', + 'submiter_name', 'ref_item', 'modified_since_import'] + exclude = ['submiter_session_key', 'import_key', 'import_version', + 'ref_item'] + inlines = [] + fieldsets = POLYGON_FIELDSETS + + class LayerInline(admin.TabularInline): model = AreaLayers extra = 1 + class AreaAdmin(admin.ModelAdmin): """ Specialized the area field. @@ -422,6 +455,7 @@ class AreaAdmin(admin.ModelAdmin): inlines = [LayerInline] list_display = ['name', 'order', 'available', 'default'] + def importing(modeladmin, request, queryset): for importer in queryset: importer.state = unicode(tasks.IMPORT_MESSAGES['import_pending'][0]) @@ -429,63 +463,72 @@ def importing(modeladmin, request, queryset): tasks.importing(importer.pk) importing.short_description = _(u"Import") + def cancel_import(modeladmin, request, queryset): for importer in queryset: importer.state = tasks.IMPORT_MESSAGES['import_cancel'][0] importer.save() cancel_import.short_description = _(u"Cancel import") + def cancel_export(modeladmin, request, queryset): for importer in queryset: importer.state = tasks.IMPORT_MESSAGES['export_cancel'][0] importer.save() cancel_export.short_description = _(u"Cancel export") + def export_to_osm(modeladmin, request, queryset): if queryset.count() > 1: - messages.error(request, _(u"Can manage only one OSM export at a time.")) + messages.error(request, + _(u"Can manage only one OSM export at a time.")) return HttpResponseRedirect(request.get_full_path()) importer = queryset.all()[0] if Marker.objects.filter(categories__in=importer.categories.all(), status='I').count(): - messages.error(request, _(u"You must treat all item with the status "\ + messages.error(request, _(u"You must treat all item with the status " u"\"imported\" before exporting to OSM.")) return HttpResponseRedirect(request.get_full_path()) if importer.importer_type != 'OSM': - messages.error(request, _(u"Only OSM importer are managed for export.")) + messages.error(request, + _(u"Only OSM importer are managed for export.")) return HttpResponseRedirect(request.get_full_path()) - item_nb = Marker.objects.filter(status='A', - categories=importer.categories.all(), - not_for_osm=False, modified_since_import=True, - route=None).count() + item_nb = Marker.objects.filter( + status='A', categories=importer.categories.all(), not_for_osm=False, + modified_since_import=True, route=None).count() if not item_nb: - messages.error(request, _(u"No point of interest are concerned by this " - u"export.")) + messages.error(request, + _(u"No point of interest are concerned by this " + u"export.")) return HttpResponseRedirect(request.get_full_path()) form = None if request.method == 'POST' and ( - 'email' in request.POST or 'api' in request.POST - or 'password' in request.POST): + 'email' in request.POST or 'api' in request.POST + or 'password' in request.POST): form = OSMForm(request.POST) if form.is_valid(): - importer.state = unicode(tasks.IMPORT_MESSAGES['export_pending'][0]) + importer.state = unicode( + tasks.IMPORT_MESSAGES['export_pending'][0]) importer.save() tasks.exporting(importer.pk, form.cleaned_data) messages.success(request, _(u"Export launched.")) return HttpResponseRedirect(request.get_full_path()) else: form = OSMForm() - msg_item = _(u"%s point(s) of interest concerned by this export before "\ + msg_item = _(u"%s point(s) of interest concerned by this export before " u"bounding box filter.") % item_nb - return render_to_response('admin/chimere/osm_export.html', {'item':importer, - 'form':form, 'msg_item':msg_item}, + return render_to_response('admin/chimere/osm_export.html', + {'item': importer, 'form': form, + 'msg_item': msg_item}, context_instance=RequestContext(request)) export_to_osm.short_description = _(u"Export to osm") + class ImporterKeyInline(admin.TabularInline): model = ImporterKeyCategories extra = 1 + class ImporterAdmin(admin.ModelAdmin): form = ImporterAdminForm list_display = ('importer_type', 'display_categories', 'default_name', @@ -496,14 +539,13 @@ class ImporterAdmin(admin.ModelAdmin): inlines = [ImporterKeyInline] admin.site.register(Importer, ImporterAdmin) + class PageAdmin(admin.ModelAdmin): """ Use the TinyMCE widget for the page content """ form = PageAdminForm -class PropertyModelAdmin(admin.ModelAdmin): - list_display = ('name', 'order', 'available') class NewsAdmin(admin.ModelAdmin): """ @@ -511,10 +553,12 @@ class NewsAdmin(admin.ModelAdmin): """ form = NewsAdminForm + class SubcatInline(admin.TabularInline): model = SubCategory extra = 1 + class CategoryAdmin(admin.ModelAdmin): """ Use the TinyMCE widget for categories @@ -523,20 +567,27 @@ class CategoryAdmin(admin.ModelAdmin): inlines = [SubcatInline] list_display = ['name', 'order'] + class ColorInline(admin.TabularInline): model = Color + class ColorThemeAdmin(admin.ModelAdmin): - inlines = [ColorInline,] + inlines = [ColorInline] + class IconAdmin(admin.ModelAdmin): exclude = ['height', 'width'] list_display = ['name'] + class PropertyModelChoiceInline(admin.TabularInline): model = PropertyModelChoice extra = 1 + + class PropertyModelAdmin(admin.ModelAdmin): + list_display = ('name', 'order', 'available') inlines = [PropertyModelChoiceInline] # register of differents database fields @@ -545,7 +596,8 @@ 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) +admin.site.register(models.Route, RouteAdmin) +admin.site.register(models.Polygon, PolygonAdmin) if not settings.CHIMERE_HIDE_PROPERTYMODEL: admin.site.register(PropertyModel, PropertyModelAdmin) admin.site.register(Area, AreaAdmin) |