summaryrefslogtreecommitdiff
path: root/chimere/admin.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/admin.py')
-rw-r--r--chimere/admin.py129
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)