diff options
Diffstat (limited to 'chimere/admin.py')
-rw-r--r-- | chimere/admin.py | 129 |
1 files changed, 116 insertions, 13 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index ad24706..833ba9d 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -37,7 +37,7 @@ except ImportError: pass from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\ - NewsAdminForm, CategoryAdminForm, ImporterAdminForm,\ + NewsAdminForm, CategoryAdminForm, ImporterAdminForm, OSMForm, \ PageAdminForm, PictureFileAdminForm, MultimediaFileAdminForm from chimere.models import Category, Icon, SubCategory, Marker, \ PropertyModel, News, Route, Area, ColorTheme, Color, \ @@ -112,14 +112,32 @@ def managed_modified(modeladmin, request, queryset): if request.POST.get('rapprochement'): couple = [(item, item_ref)] if hasattr(item, 'associated_marker'): - couple.append((item.associated_marker, item_ref.associated_marker)) - for it, it_ref in couple: - for k in request.POST: + couple.append((item.associated_marker.all()[0], + item_ref.associated_marker.all()[0])) + updated_keys = dict(request.POST) + # clean + for k in ('action', 'rapprochement', 'index', '_selected_action'): + if k in updated_keys: + updated_keys.pop(k) + for idx, cpl in enumerate(couple): + it, it_ref = cpl + # don't copy geometry of associated items + if idx: + for k in ('route', 'point'): + if k in updated_keys: + updated_keys.pop(k) + for k in updated_keys: if not request.POST[k]: continue if hasattr(it_ref, k): - setattr(it_ref, k, getattr(it, k)) - it_ref.save() + c_value = getattr(it_ref, k) + if hasattr(c_value, 'select_related'): + c_value.clear() + for val in getattr(it, k).all(): + c_value.add(val) + else: + setattr(it_ref, k, getattr(it, k)) + it_ref.save() elif k.startswith('property_'): try: pm = PropertyModel.get(pk=int(k[len('property_'):])) @@ -132,7 +150,7 @@ def managed_modified(modeladmin, request, queryset): item.delete() messages.success(request, _(u"Modified item traited.")) return HttpResponseRedirect(request.get_full_path()) - return render_to_response('admin/managed_modified.html', + return render_to_response('admin/chimere/managed_modified.html', {'item':item, 'item_ref':item_ref}, context_instance=RequestContext(request)) managed_modified.short_description = _(u"Managed modified items") @@ -165,8 +183,39 @@ class MarkerAdmin(admin.ModelAdmin): readonly_fields = ['submiter_email', 'submiter_comment', 'import_source', 'submiter_name', 'ref_item', 'modified_since_import'] form = MarkerAdminForm + fieldsets = ((None, { + 'fields': ['point', 'name', 'status', 'categories', + 'description', '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"Advanced options"), { + 'classes':('collapse',), + 'fields': ('ref_item', 'route',) + }), + ) inlines = [MultimediaInline, PictureInline] + def __init__(self, *args, **kwargs): + """ + Manage properties in fieldsets. + """ + main_fields = self.fieldsets[0][1]['fields'] + 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) + super(MarkerAdmin, self).__init__(*args, **kwargs) + def queryset(self, request): qs = self.model._default_manager.get_query_set() if not request.user.is_superuser: @@ -192,6 +241,26 @@ class RouteAdmin(admin.ModelAdmin): readonly_fields = ('associated_file',) 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"Advanced options"), { + 'classes':('collapse',), + 'fields': ('ref_item', 'associated_file', + 'has_associated_marker') + }), + ) def queryset(self, request): qs = self.model._default_manager.get_query_set() @@ -239,11 +308,44 @@ def cancel_export(modeladmin, request, queryset): cancel_export.short_description = _(u"Cancel export") def export_to_osm(modeladmin, request, queryset): - importers = modeladmin.model.objects.filter(importer_type='OSM') - for importer in queryset: - importer.state = unicode(tasks.IMPORT_MESSAGES['export_pending'][0]) - importer.save() - tasks.exporting(importer.pk) + if queryset.count() > 1: + 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 "\ + 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.")) + 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() + if not item_nb: + 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): + form = OSMForm(request.POST) + if form.is_valid(): + 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 "\ + u"bounding box filter.") % item_nb + 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 ImporterAdmin(admin.ModelAdmin): @@ -305,7 +407,8 @@ admin.site.register(Category, CategoryAdmin) admin.site.register(Icon, IconAdmin) admin.site.register(Marker, MarkerAdmin) admin.site.register(Route, RouteAdmin) -admin.site.register(PropertyModel, PropertyModelAdmin) +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) |