allow direct proposing of changesets as well as direct commiting

This commit is contained in:
Laura Klünder 2024-12-02 11:43:35 +01:00
parent f9e832b24a
commit 435a271eab
3 changed files with 54 additions and 4 deletions

View file

@ -40,7 +40,7 @@ class ChangeSet(models.Model):
state = models.CharField(max_length=20, db_index=True, choices=STATES, default='unproposed')
author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, verbose_name=_('Author'))
title = models.CharField(max_length=100, default='', verbose_name=_('Title'))
description = models.TextField(max_length=1000, default='', verbose_name=_('Description'))
description = models.TextField(max_length=1000, default='', verbose_name=_('Description'), blank=True)
assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT,
related_name='assigned_changesets', verbose_name=_('assigned to'))
map_update = models.OneToOneField(MapUpdate, null=True, related_name='changeset',
@ -172,6 +172,9 @@ class ChangeSet(models.Model):
def can_unpropose(self, request):
return self.author_id == request.user.pk and self.state in ('proposed', 'reproposed')
def can_commit(self, request):
return self.can_edit(request) and not self.proposed and self.changes and self.can_review(request)
def has_space_access_on_all_objects(self, request, force=False):
# todo: reimplement this
if not request.user.is_authenticated:

View file

@ -18,6 +18,9 @@
{% csrf_token %}
{% bootstrap_messages %}
{% bootstrap_form form %}
{% if action %}
<input type="hidden" name="{{ action }}" value="1">
{% endif %}
{% buttons %}
<a href="{% url 'editor.changesets.detail' pk=changeset.pk %}" class="btn btn-default">{% trans 'Back' %}</a>

View file

@ -70,9 +70,22 @@ def changeset_detail(request, pk):
return redirect(reverse('editor.login') + '?r=' + request.path)
with changeset.lock_to_edit(request) as changeset:
if not changeset.title or not changeset.description:
messages.warning(request, _('You need to add a title an a description to propose this change set.'))
return redirect(reverse('editor.changesets.edit', kwargs={'pk': changeset.pk}))
if not changeset.title:
form = ChangeSetForm(instance=changeset, data=request.POST)
if not form.is_valid():
form = ChangeSetForm(instance=changeset)
messages.warning(request, _('You need to add a title to propose this change set.'))
return render(request, 'editor/changeset_edit.html', {
'changeset': changeset,
'action': 'propose',
'form': form,
})
changeset = form.instance
update = changeset.updates.create(user=request.user,
title=changeset.title, description=changeset.description)
changeset.last_update = update
changeset.save()
if changeset.can_propose(request):
changeset.propose(request.user)
@ -82,6 +95,37 @@ def changeset_detail(request, pk):
return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk}))
elif request.POST.get('commit') == '1':
if not request.user.is_authenticated:
messages.info(request, _('You need to log in to apply changes.'))
return redirect(reverse('editor.login') + '?r=' + request.path)
with changeset.lock_to_edit(request) as changeset:
if not changeset.title:
form = ChangeSetForm(instance=changeset, data=request.POST)
if not form.is_valid():
form = ChangeSetForm(instance=changeset)
messages.warning(request, _('You need to add a title to apply this change set.'))
return render(request, 'editor/changeset_edit.html', {
'changeset': changeset,
'action': 'commit',
'form': form,
})
changeset = form.instance
update = changeset.updates.create(user=request.user,
title=changeset.title, description=changeset.description)
changeset.last_update = update
changeset.save()
if changeset.can_commit(request):
changeset.apply(request.user)
messages.success(request, _('You applied your changes.'))
else:
messages.error(request, _('You cannot apply this change set.'))
return redirect(reverse('editor.changesets.detail', kwargs={'pk': changeset.pk}))
elif request.POST.get('unpropose') == '1':
with changeset.lock_to_edit(request) as changeset:
if changeset.can_unpropose(request):