From a16696a9414c8f5c02fa2ba147721f78504bc186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 16 May 2017 14:10:50 +0200 Subject: [PATCH] editor: restoring editing functionality (for sections for now) --- src/c3nav/editor/forms.py | 20 +-- src/c3nav/editor/templates/editor/delete.html | 6 +- src/c3nav/editor/templates/editor/edit.html | 21 ++- .../templates/editor/fragment_sections.html | 4 +- src/c3nav/editor/templates/editor/index.html | 2 +- src/c3nav/editor/templates/editor/map.html | 4 +- .../templates/editor/mapitem_success.html | 2 - .../editor/templates/editor/mapitems.html | 45 ------ .../editor/templates/editor/mapitemtypes.html | 19 --- .../editor/templates/editor/redirect.html | 2 +- .../editor/templates/editor/section.html | 2 +- src/c3nav/editor/urls.py | 11 +- src/c3nav/editor/views.py | 153 ++++++------------ 13 files changed, 84 insertions(+), 207 deletions(-) delete mode 100644 src/c3nav/editor/templates/editor/mapitem_success.html delete mode 100644 src/c3nav/editor/templates/editor/mapitems.html delete mode 100644 src/c3nav/editor/templates/editor/mapitemtypes.html diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 706a08d3..31f1033f 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -1,5 +1,4 @@ import json -import time from collections import OrderedDict from django.conf import settings @@ -15,21 +14,10 @@ class MapitemFormMixin(ModelForm): super().__init__(*args, **kwargs) creating = not self.instance.pk - # disable name on non-direct editing - if not creating and not settings.DIRECT_EDITING: - self.fields['name'].disabled = True - - if creating: - self.fields['name'].initial = hex(int(time.time()*1000000))[2:] - if 'section' in self.fields: # hide section widget self.fields['section'].widget = HiddenInput() - if 'groups' in self.fields: - # set field_name - self.fields['groups'].to_field_name = 'name' - if 'geometry' in self.fields: # hide geometry widget self.fields['geometry'].widget = HiddenInput() @@ -65,18 +53,18 @@ class MapitemFormMixin(ModelForm): super().clean() -def create_editor_form(mapitemtype): +def create_editor_form(editor_model): possible_fields = ['section', 'space', 'name', 'public', 'altitude', 'geometry', 'width', 'groups', 'color', 'location_type', 'can_search', 'can_describe', 'routing_inclusion', 'compiled_room', 'bssids', 'category', 'level'] - existing_fields = [field.name for field in mapitemtype._meta.get_fields() if field.name in possible_fields] + existing_fields = [field.name for field in editor_model._meta.get_fields() if field.name in possible_fields] class EditorForm(MapitemFormMixin, ModelForm): class Meta: - model = mapitemtype + model = editor_model fields = existing_fields - mapitemtype.EditorForm = EditorForm + editor_model.EditorForm = EditorForm def create_editor_forms(): diff --git a/src/c3nav/editor/templates/editor/delete.html b/src/c3nav/editor/templates/editor/delete.html index 96cfe913..41c5cfaf 100644 --- a/src/c3nav/editor/templates/editor/delete.html +++ b/src/c3nav/editor/templates/editor/delete.html @@ -1,11 +1,11 @@ {% load bootstrap3 %} -

Delete {{ mapitem_type.title }}

+

Delete {{ model_title }}

{% csrf_token %} -

Please confirm deleting: {{ name }}

+

Please confirm deleting: {{ title }}

- + {% buttons %} diff --git a/src/c3nav/editor/templates/editor/edit.html b/src/c3nav/editor/templates/editor/edit.html index 45980968..19d77f1a 100644 --- a/src/c3nav/editor/templates/editor/edit.html +++ b/src/c3nav/editor/templates/editor/edit.html @@ -1,21 +1,30 @@ {% load bootstrap3 %} +{% load i18n %} -

{% if new %}New{% else %}Edit{% endif %} {{ title }}

- +{% include 'editor/fragment_sections.html' %} + +
+ Cancel + +{% if new %} +

{% blocktrans %}New {{ model_title }}{% endblocktrans %}

+{% else %} +

{% blocktrans %}Edit {{ model_title }}{% endblocktrans %}

+{% endif %} + {% csrf_token %} {% bootstrap_form form %} {% buttons %} {% if not new %} {% endif %} - + Cancel {% endbuttons %} diff --git a/src/c3nav/editor/templates/editor/fragment_sections.html b/src/c3nav/editor/templates/editor/fragment_sections.html index 6cd5f36c..d25cedb7 100644 --- a/src/c3nav/editor/templates/editor/fragment_sections.html +++ b/src/c3nav/editor/templates/editor/fragment_sections.html @@ -2,12 +2,12 @@ {% elif section %} {% endif %} diff --git a/src/c3nav/editor/templates/editor/index.html b/src/c3nav/editor/templates/editor/index.html index 07fe61d9..5054ed7f 100644 --- a/src/c3nav/editor/templates/editor/index.html +++ b/src/c3nav/editor/templates/editor/index.html @@ -4,7 +4,7 @@

{% trans 'Sections' %}

{% for s in sections %} - + {{ s.title }} {% endfor %} diff --git a/src/c3nav/editor/templates/editor/map.html b/src/c3nav/editor/templates/editor/map.html index 9b55f097..3b57ee70 100644 --- a/src/c3nav/editor/templates/editor/map.html +++ b/src/c3nav/editor/templates/editor/map.html @@ -13,8 +13,6 @@ {% block content %}
{% endblock %} diff --git a/src/c3nav/editor/templates/editor/mapitem_success.html b/src/c3nav/editor/templates/editor/mapitem_success.html deleted file mode 100644 index 9621f6a4..00000000 --- a/src/c3nav/editor/templates/editor/mapitem_success.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load static %} - diff --git a/src/c3nav/editor/templates/editor/mapitems.html b/src/c3nav/editor/templates/editor/mapitems.html deleted file mode 100644 index e2c9b03c..00000000 --- a/src/c3nav/editor/templates/editor/mapitems.html +++ /dev/null @@ -1,45 +0,0 @@ -{% load bootstrap3 %} - -Add new -

{{ title }}{% if has_level %} on level {{ level }}{% endif %}

- - - - {% for item in items %} - {% if forloop.counter0|divisibleby:10 %} - - - - - {% endif %} - - - {% if has_elevator %} - - - - {% endif %} - {% if has_levels %} - - {% endif %} - {% if has_altitude %} - - {% endif %} - {% if has_intermediate %} - - {% endif %} - - - {% endfor %} - - - - - -
« Back
{% if item.title != item.name %}{{ item.title }} {{ item.name }}{% else %}{{ item.name }}{% endif %}{{ item.elevator }}{{ item.button }}{% if item.override_altitude %}{{ item.override_altitude }} m{% endif %}{% for level in item.levels.all %}{% if not forloop.first %}, {% endif %}{{ level.name }}{% endfor %}{{ item.altitude }} m{% if item.intermediate %}intermediate{% endif %}Edit
« Back
- -{% if has_level %} - -{% else %} - -{% endif %} diff --git a/src/c3nav/editor/templates/editor/mapitemtypes.html b/src/c3nav/editor/templates/editor/mapitemtypes.html deleted file mode 100644 index 3989e314..00000000 --- a/src/c3nav/editor/templates/editor/mapitemtypes.html +++ /dev/null @@ -1,19 +0,0 @@ -{% load bootstrap3 %} - -

Mapitem types

- -
- {% for mapitemtype in mapitemtypes %} - {% if mapitemtype.has_level %} - {% url 'editor.mapitems.level' mapitem_type=mapitemtype.name level=level as list_url %} - {% else %} - {% url 'editor.mapitems' mapitem_type=mapitemtype.name as list_url %} - {% endif %} - - {% if mapitemtype.has_level %}{{ mapitemtype.count }}{% endif %} - {{ mapitemtype.title }} - - {% endfor %} -
- - diff --git a/src/c3nav/editor/templates/editor/redirect.html b/src/c3nav/editor/templates/editor/redirect.html index 04ebb11f..35570918 100644 --- a/src/c3nav/editor/templates/editor/redirect.html +++ b/src/c3nav/editor/templates/editor/redirect.html @@ -1 +1 @@ - + diff --git a/src/c3nav/editor/templates/editor/section.html b/src/c3nav/editor/templates/editor/section.html index 9bbca2db..de91a28b 100644 --- a/src/c3nav/editor/templates/editor/section.html +++ b/src/c3nav/editor/templates/editor/section.html @@ -2,7 +2,7 @@ {% load i18n %} {% include 'editor/fragment_sections.html' %} -{% trans 'Edit Section' %} +{% trans 'Edit Section' %}

{{ section.title }}

« {% trans 'Back to overview' %} diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index 48cb29b9..82c8828b 100644 --- a/src/c3nav/editor/urls.py +++ b/src/c3nav/editor/urls.py @@ -1,14 +1,9 @@ from django.conf.urls import url -from c3nav.editor.views import edit_mapitem, list_mapitems, list_mapitemtypes, main_index, section_detail +from c3nav.editor.views import edit, main_index, section_detail urlpatterns = [ url(r'^$', main_index, name='editor.index'), - url(r'^sections/(?P

[0-9]+)/$', section_detail, name='editor.section'), - url(r'^sections/(?P
[0-9]+)/edit$', section_detail, name='editor.section.edit'), - url(r'^mapitemtypes/(?P[^/]+)/$', list_mapitemtypes, name='editor.mapitemtypes'), - url(r'^mapitems/(?P[^/]+)/list/$', list_mapitems, name='editor.mapitems'), - url(r'^mapitems/(?P[^/]+)/list/(?P[0-9]+)/$', list_mapitems, name='editor.mapitems.level'), - url(r'^mapitems/(?P[^/]+)/add/$', edit_mapitem, name='editor.mapitems.add'), - url(r'^mapitems/(?P[^/]+)/edit/(?P[^/]+)/$', edit_mapitem, name='editor.mapitems.edit'), + url(r'^sections/(?P[0-9]+)/$', section_detail, name='editor.section'), + url(r'^sections/(?P[0-9]+)/edit$', edit, name='editor.section.edit', kwargs={'model': 'Section'}), ] diff --git a/src/c3nav/editor/views.py b/src/c3nav/editor/views.py index 77097d20..11291f8c 100644 --- a/src/c3nav/editor/views.py +++ b/src/c3nav/editor/views.py @@ -2,8 +2,7 @@ from functools import wraps from django.conf import settings from django.core.exceptions import PermissionDenied -from django.http.response import Http404 -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import get_object_or_404, render from django.urls import reverse from django.views.decorators.cache import never_cache @@ -21,142 +20,96 @@ def sidebar_view(func): @sidebar_view -def main_index(request, section=None): +def main_index(request): return render(request, 'editor/index.html', { 'sections': Section.objects.all(), }) @sidebar_view -def section_detail(request, section): - section = get_object_or_404(Section, pk=section) +def section_detail(request, pk): + pk = get_object_or_404(Section, pk=pk) return render(request, 'editor/section.html', { 'sections': Section.objects.all(), - 'section': section, + 'section': pk, 'section_url': 'editor.section', }) -def list_mapitemtypes(request, section): - section = get_object_or_404(Section, pk=section) +@sidebar_view +def edit(request, pk=None, model=None): + model = EDITOR_FORM_MODELS[model] - def get_item_count(mapitemtype): - if hasattr(mapitemtype, 'section'): - return filter_queryset_by_access(request, mapitemtype.objects.filter(section=section)).count() - return 0 - - return render(request, 'editor/mapitemtypes.html', { - 'section': section, - 'mapitemtypes': [ - { - 'name': name, - 'title': mapitemtype._meta.verbose_name_plural, - 'has_section': hasattr(mapitemtype, 'section'), - 'count': get_item_count(mapitemtype), - } for name, mapitemtype in EDITOR_FORM_MODELS.items() - ], - }) - - -def list_mapitems(request, mapitem_type, section=None): - mapitemtype = EDITOR_FORM_MODELS.get(mapitem_type) - if mapitemtype is None: - raise Http404('Unknown mapitemtype.') - - has_section = hasattr(mapitemtype, 'section') - if has_section and section is None: - raise Http404('Missing section.') - elif not has_section and section is not None: - return redirect('editor.mapitems', mapitem_type=mapitem_type) - - queryset = mapitemtype.objects.all().order_by('name') - - if section is not None: - section = get_object_or_404(Section, section) - if hasattr(mapitemtype, 'section'): - queryset = queryset.filter(section=section) - - queryset = filter_queryset_by_access(request, queryset) - - if issubclass(mapitemtype, AreaLocation): - queryset = sorted(queryset, key=AreaLocation.get_sort_key) - - return render(request, 'editor/mapitems.html', { - 'mapitem_type': mapitem_type, - 'title': mapitemtype._meta.verbose_name_plural, - 'has_section': section is not None, - 'has_altitude': hasattr(mapitemtype, 'altitude'), - 'section': section.id, - 'items': queryset, - }) - - -def edit_mapitem(request, mapitem_type, name=None): - mapitemtype = EDITOR_FORM_MODELS.get(mapitem_type) - if mapitemtype is None: - raise Http404() - - mapitem = None - if name is not None: + obj = None + if pk is not None: # Edit existing map item - mapitem = get_object_or_404(mapitemtype, name=name) - if not can_access(request, mapitem): + obj = get_object_or_404(model, pk=pk) + if False: # todo can access raise PermissionDenied - new = mapitem is None - orig_name = mapitem.name if mapitem is not None else None + new = obj is None + # noinspection PyProtectedMember + ctx = { + 'path': request.path, + 'pk': pk, + 'model_title': model._meta.verbose_name, + 'model_name': model.__name__.lower(), + 'new': new, + 'title': obj.title if obj else None, + } + + if isinstance(obj, Section): + ctx.update({ + 'section': obj, + 'back_url': reverse('editor.index') if new else reverse('editor.section', kwargs={'pk': pk}), + }) + elif hasattr(obj, 'section'): + ctx.update({ + 'section': obj.section, + 'back_url': reverse('editor.space', kwargs={'pk': pk}), + }) + elif hasattr(obj, 'space'): + ctx.update({ + 'section': obj.space.section, + 'back_url': reverse('editor.space', kwargs={'pk': obj.space.pk}), + }) if request.method == 'POST': - if mapitem is not None and request.POST.get('delete') == '1': + if obj is not None and request.POST.get('delete') == '1': # Delete this mapitem! if request.POST.get('delete_confirm') == '1': if not settings.DIRECT_EDITING: # todo: suggest changes raise NotImplementedError + # obj.delete() + return render(request, 'editor/redirect.html', ctx) + return render(request, 'editor/delete.html', ctx) - mapitem.delete() - return render(request, 'editor/mapitem_success.html', { - 'mapitem_type': mapitem_type - }) - - return render(request, 'editor/mapitem_delete.html', { - 'name': mapitem.name, - 'mapitem_type': mapitem_type, - 'path': request.path - }) - - form = mapitemtype.EditorForm(instance=mapitem, data=request.POST, request=request) + form = model.EditorForm(instance=obj, data=request.POST, request=request) if form.is_valid(): - # Update/create mapitem - mapitem = form.save(commit=False) + # Update/create objects + obj = form.save(commit=False) if form.titles is not None: - mapitem.titles = {} + obj.titles = {} for language, title in form.titles.items(): if title: - mapitem.titles[language] = title + obj.titles[language] = title if not settings.DIRECT_EDITING: # todo: suggest changes raise NotImplementedError - mapitem.save() + obj.save() form.save_m2m() - return render(request, 'editor/mapitem_success.html', { - 'mapitem_type': mapitem_type - }) + return render(request, 'editor/redirect.html', ctx) else: - form = mapitemtype.EditorForm(instance=mapitem, request=request) + form = model.EditorForm(instance=obj, request=request) - return render(request, 'editor/mapitem.html', { + ctx.update({ 'form': form, - 'mapitem_type': mapitem_type, - 'title': mapitemtype._meta.verbose_name, - 'has_geometry': hasattr(mapitemtype, 'geometry'), - 'name': orig_name, - 'geomtype': getattr(mapitemtype, 'geomtype', None), - 'path': request.path, - 'new': new }) + + return render(request, 'editor/edit.html', ctx)