show or delete current changeset
This commit is contained in:
parent
cba7feb29f
commit
4cae5252de
7 changed files with 65 additions and 10 deletions
|
@ -6,6 +6,7 @@ from django.conf import settings
|
||||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.translation import ungettext_lazy
|
from django.utils.translation import ungettext_lazy
|
||||||
|
@ -75,10 +76,17 @@ class ChangeSet(models.Model):
|
||||||
new_changeset.default_author = request.user
|
new_changeset.default_author = request.user
|
||||||
return new_changeset
|
return new_changeset
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('editor.changesets.detail', kwargs={'pk': self.pk})
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def undeleted_changes_count(self):
|
def undeleted_changes_count(self):
|
||||||
return len([True for change in self.changes.all() if change.deletes_change_id is None])
|
return len([True for change in self.changes.all() if change.deletes_change_id is None])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def title(self):
|
||||||
|
return _('Changeset #%d') % self.pk
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def count_display(self):
|
def count_display(self):
|
||||||
return ungettext_lazy('%(num)d Change', '%(num)d Changes', 'num') % {'num': self.undeleted_changes_count}
|
return ungettext_lazy('%(num)d Change', '%(num)d Changes', 'num') % {'num': self.undeleted_changes_count}
|
||||||
|
@ -86,7 +94,7 @@ class ChangeSet(models.Model):
|
||||||
def wrap(self, obj, author=None):
|
def wrap(self, obj, author=None):
|
||||||
if author is None:
|
if author is None:
|
||||||
author = self.default_author
|
author = self.default_author
|
||||||
if not author.is_authenticated():
|
if author is not None and not author.is_authenticated():
|
||||||
author = None
|
author = None
|
||||||
if isinstance(obj, str):
|
if isinstance(obj, str):
|
||||||
return ModelWrapper(self, apps.get_model('mapdata', obj), author)
|
return ModelWrapper(self, apps.get_model('mapdata', obj), author)
|
||||||
|
@ -155,6 +163,7 @@ class Change(models.Model):
|
||||||
verbose_name = _('Change')
|
verbose_name = _('Change')
|
||||||
verbose_name_plural = _('Changes')
|
verbose_name_plural = _('Changes')
|
||||||
default_related_name = 'changes'
|
default_related_name = 'changes'
|
||||||
|
ordering = ['created', 'pk']
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
@ -180,14 +189,14 @@ class Change(models.Model):
|
||||||
self.model_name = value.__name__
|
self.model_name = value.__name__
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def obj(self) -> models.Model:
|
def obj(self) -> ModelInstanceWrapper:
|
||||||
if self._set_object is not None:
|
if self._set_object is not None:
|
||||||
return self._set_object
|
return self._set_object
|
||||||
|
|
||||||
if self.existing_object_pk is not None:
|
if self.existing_object_pk is not None:
|
||||||
if self.created_object is not None:
|
if self.created_object is not None:
|
||||||
raise TypeError('existing_object_pk and created_object can not both be set.')
|
raise TypeError('existing_object_pk and created_object can not both be set.')
|
||||||
self._set_object = self.model_class.objects.get(pk=self.existing_object_pk)
|
self._set_object = self.changeset.wrap(self.model_class.objects.get(pk=self.existing_object_pk))
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
return self._set_object
|
return self._set_object
|
||||||
elif self.created_object is not None:
|
elif self.created_object is not None:
|
||||||
|
|
|
@ -143,9 +143,9 @@ editor = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var changeset = content.find('span[data-changeset]');
|
var changeset = content.find('a[data-changeset]');
|
||||||
if (changeset.length) {
|
if (changeset.length) {
|
||||||
$('.changeset a').text(changeset.text());
|
$('.changeset a').text(changeset.text()).attr('href', changeset.attr('href'));
|
||||||
}
|
}
|
||||||
|
|
||||||
var geometry_url = content.find('[data-geometry-url]');
|
var geometry_url = content.find('[data-geometry-url]');
|
||||||
|
|
21
src/c3nav/editor/templates/editor/changeset.html
Normal file
21
src/c3nav/editor/templates/editor/changeset.html
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% include 'editor/fragment_levels.html' %}
|
||||||
|
|
||||||
|
<h3>{{ changeset.title }}</h3>
|
||||||
|
|
||||||
|
<form action="{{ path }}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" class="btn btn-danger btn-sm" name="delete" value="1">{% trans 'Delete' %}</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<table class="table table-condensed">
|
||||||
|
<tbody>
|
||||||
|
{% for change in changeset.changes.all %}
|
||||||
|
<tr data-pk="{{ item.pk }}">
|
||||||
|
<td>{{ change|stringformat:'r' }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
|
@ -4,7 +4,7 @@
|
||||||
{% include 'editor/fragment_levels.html' %}
|
{% include 'editor/fragment_levels.html' %}
|
||||||
|
|
||||||
<a class="btn btn-default btn-sm pull-right" accesskey="n" href="{{ create_url }}">
|
<a class="btn btn-default btn-sm pull-right" accesskey="n" href="{{ create_url }}">
|
||||||
{% blocktrans %}New {{ model_title }}{% endblocktrans %}
|
{% blocktrans %}DeleteNew {{ model_title }}{% endblocktrans %}
|
||||||
</a>
|
</a>
|
||||||
<h3>
|
<h3>
|
||||||
{% blocktrans %}{{ model_title_plural }}{% endblocktrans %}
|
{% blocktrans %}{{ model_title_plural }}{% endblocktrans %}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<div id="noscript">{% trans 'Without Javascript' %}</div>
|
<div id="noscript">{% trans 'Without Javascript' %}</div>
|
||||||
</noscript>
|
</noscript>
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
<li class="changeset"><a href="#">{{ request.changeset.count_display }}</a></li>
|
<li class="changeset"><a href="{{ request.changeset.get_absolute_url }}">{{ request.changeset.count_display }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
from c3nav.editor.views import edit, level_detail, list_objects, main_index, space_detail
|
from c3nav.editor.views import changeset_detail, edit, level_detail, list_objects, main_index, space_detail
|
||||||
|
|
||||||
|
|
||||||
def add_editor_urls(model_name, parent_model_name=None, with_list=True, explicit_edit=False):
|
def add_editor_urls(model_name, parent_model_name=None, with_list=True, explicit_edit=False):
|
||||||
|
@ -34,6 +34,7 @@ urlpatterns = [
|
||||||
url(r'^levels/(?P<level>[0-9]+)/spaces/(?P<pk>[0-9]+)/$', space_detail, name='editor.spaces.detail'),
|
url(r'^levels/(?P<level>[0-9]+)/spaces/(?P<pk>[0-9]+)/$', space_detail, name='editor.spaces.detail'),
|
||||||
url(r'^levels/(?P<on_top_of>[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create',
|
url(r'^levels/(?P<on_top_of>[0-9]+)/levels_on_top/create$', edit, name='editor.levels_on_top.create',
|
||||||
kwargs={'model': 'Level'}),
|
kwargs={'model': 'Level'}),
|
||||||
|
url(r'^changesets/(?P<pk>[0-9]+)/$', changeset_detail, name='editor.changesets.detail'),
|
||||||
]
|
]
|
||||||
urlpatterns.extend(add_editor_urls('Level', with_list=False, explicit_edit=True))
|
urlpatterns.extend(add_editor_urls('Level', with_list=False, explicit_edit=True))
|
||||||
urlpatterns.extend(add_editor_urls('LocationGroup'))
|
urlpatterns.extend(add_editor_urls('LocationGroup'))
|
||||||
|
|
|
@ -22,7 +22,8 @@ def sidebar_view(func):
|
||||||
if request.is_ajax() or 'ajax' in request.GET:
|
if request.is_ajax() or 'ajax' in request.GET:
|
||||||
if isinstance(response, HttpResponseRedirect):
|
if isinstance(response, HttpResponseRedirect):
|
||||||
return render(request, 'editor/redirect.html', {'target': response['location']})
|
return render(request, 'editor/redirect.html', {'target': response['location']})
|
||||||
response.write('<span data-changeset>%s</span>' % escape(request.changeset.count_display))
|
response.write('<a data-changeset href="%s">%s</a>' % (request.changeset.get_absolute_url(),
|
||||||
|
escape(request.changeset.count_display)))
|
||||||
return response
|
return response
|
||||||
return render(request, 'editor/map.html', {'content': response.content})
|
return render(request, 'editor/map.html', {'content': response.content})
|
||||||
return never_cache(with_ajax_check)
|
return never_cache(with_ajax_check)
|
||||||
|
@ -250,7 +251,6 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals
|
||||||
Level = request.changeset.wrap('Level')
|
Level = request.changeset.wrap('Level')
|
||||||
Space = request.changeset.wrap('Space')
|
Space = request.changeset.wrap('Space')
|
||||||
|
|
||||||
# noinspection PyProtectedMember
|
|
||||||
ctx = {
|
ctx = {
|
||||||
'path': request.path,
|
'path': request.path,
|
||||||
'model_name': model.__name__.lower(),
|
'model_name': model.__name__.lower(),
|
||||||
|
@ -302,3 +302,27 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals
|
||||||
})
|
})
|
||||||
|
|
||||||
return render(request, 'editor/list.html', ctx)
|
return render(request, 'editor/list.html', ctx)
|
||||||
|
|
||||||
|
|
||||||
|
@sidebar_view
|
||||||
|
def changeset_detail(request, pk):
|
||||||
|
changeset = get_object_or_404(ChangeSet.qs_for_request(request), pk=pk)
|
||||||
|
|
||||||
|
ctx = {
|
||||||
|
'pk': pk,
|
||||||
|
'changeset': changeset,
|
||||||
|
}
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
if request.POST.get('delete') == '1':
|
||||||
|
if request.POST.get('delete_confirm') == '1':
|
||||||
|
changeset.delete()
|
||||||
|
return redirect(reverse('editor.index'))
|
||||||
|
|
||||||
|
ctx.update({
|
||||||
|
'model_title': ChangeSet._meta.verbose_name,
|
||||||
|
'obj_title': changeset.title,
|
||||||
|
})
|
||||||
|
return render(request, 'editor/delete.html', ctx)
|
||||||
|
|
||||||
|
return render(request, 'editor/changeset.html', ctx)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue