quick comment feature for reports and stuff

This commit is contained in:
Laura Klünder 2019-12-25 10:16:40 +01:00
parent b19c001ad1
commit 6a91631f9b
6 changed files with 131 additions and 7 deletions

View file

@ -0,0 +1,39 @@
# Generated by Django 2.2.8 on 2019-12-25 09:15
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('mapdata', '0080_auto_20191224_2203'),
]
operations = [
migrations.AlterModelOptions(
name='reportupdate',
options={'default_related_name': 'reportupdates', 'ordering': ('datetime',), 'verbose_name': 'Report update', 'verbose_name_plural': 'Report updates'},
),
migrations.AlterField(
model_name='reportupdate',
name='author',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reportupdates', to=settings.AUTH_USER_MODEL, verbose_name='author'),
),
migrations.AlterField(
model_name='reportupdate',
name='comment',
field=models.TextField(blank=True, verbose_name='comment'),
),
migrations.AlterField(
model_name='reportupdate',
name='public',
field=models.BooleanField(verbose_name='comment is public'),
),
migrations.AlterField(
model_name='reportupdate',
name='report',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='updates', to='mapdata.Report'),
),
]

View file

@ -130,6 +130,12 @@ class Report(models.Model):
Q(permissions__review_group_reports__in=self.get_affected_group_ids())
)
def request_can_review(self, request):
return (
request.user_permissions.review_all_reports or
set(request.user_permissions.review_group_ids) & set(self.get_affected_group_ids())
)
def notify_reviewers(self):
reviewers = tuple(self.get_reviewers_qs().values_list('pk', flat=True))
send_report_notification.delay(pk=self.pk,
@ -158,16 +164,17 @@ class Report(models.Model):
class ReportUpdate(models.Model):
report = models.ForeignKey(Report, on_delete=models.CASCADE)
report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name='updates')
datetime = models.DateTimeField(auto_now_add=True, verbose_name=_('datetime'))
author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT, verbose_name=_('author'))
open = models.NullBooleanField(verbose_name=_('open'))
comment = models.TextField(verbose_name=_('comment'))
comment = models.TextField(verbose_name=_('comment'), blank=True)
assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.PROTECT,
related_name='report_update_assigns', verbose_name=_('assigned to'))
public = models.BooleanField(verbose_name=_('public'))
public = models.BooleanField(verbose_name=_('comment is public'))
class Meta:
verbose_name = _('Report update')
verbose_name_plural = _('Report updates')
default_related_name = 'reportupdate'
default_related_name = 'reportupdates'
ordering = ('datetime', )

View file

@ -1,7 +1,9 @@
from django.db import transaction
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _
from c3nav.mapdata.forms import I18nModelFormMixin
from c3nav.mapdata.models.report import Report
from c3nav.mapdata.models.report import Report, ReportUpdate
class ReportIssueForm(I18nModelFormMixin, ModelForm):
@ -18,3 +20,29 @@ class ReportMissingLocationForm(I18nModelFormMixin, ModelForm):
class Meta:
model = Report
fields = ['title', 'description', 'created_title', 'created_groups']
class ReportUpdateForm(ModelForm):
def __init__(self, request, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = request
self.fields['open'].label = _('change status')
self.fields['open'].widget.choices = (
('unknown', _('don\'t change')),
('true', _('open')),
('false', _('closed')),
)
def save(self):
with transaction.atomic():
super().save()
report = self.instance.report
if self.instance.open is not None:
report.open = self.instance.open
if self.instance.assigned_to:
report.assigned_to = self.instance.assigned_to
report.save()
class Meta:
model = ReportUpdate
fields = ['open', 'comment', 'public']

View file

@ -29,7 +29,7 @@
{% trans 'You can review reports' %}
</p>
<p>
<a class="button" href="{% url 'site.report_list' filter='open' %}">{% trans 'Show reports' %}</a>
<a class="button" target="_blank" href="{% url 'site.report_list' filter='open' %}">{% trans 'Show reports' %}</a>
</p>
{% elif user_has_reports %}
<hr>

View file

@ -44,5 +44,36 @@
</p>
{% endif %}
{% endfor %}
{% for update in report.updates.all %}
{% if update_form or update.public or update.open != None %}
<hr>
<p><em>{{ update.datetime }}</em> {{ update.author.username }}</p>
{% if update.open == True %}
<p>{% trans 'Issue was opened.' %}</p>
{% elif update.open == False %}
<p>{% trans 'Issue was closed.' %}</p>
{% endif %}
{% if update.comment %}
{% if update.public or update_form %}
<blockquote>{{ update.comment|linebreaksbr }}</blockquote>
{% endif %}
{% if update.public and update_form %}
{% trans '(public)' %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if update_form %}
<hr>
<form method="post">
{% csrf_token %}
<h3>{% trans 'Update issue' %}</h3>
{{ update_form }}
<p><button type="submit">{% trans 'Submit' %}</button></p>
</form>
{% endif %}
</main>
{% endblock %}

View file

@ -29,12 +29,13 @@ from c3nav.mapdata.grid import grid
from c3nav.mapdata.models import Location, Source
from c3nav.mapdata.models.access import AccessPermissionToken
from c3nav.mapdata.models.locations import LocationRedirect, SpecificLocation
from c3nav.mapdata.models.report import Report
from c3nav.mapdata.models.report import Report, ReportUpdate
from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_location_by_slug_for_request,
levels_by_short_label_for_request)
from c3nav.mapdata.utils.user import can_access_editor, get_user_data
from c3nav.mapdata.views import set_tile_access_cookie
from c3nav.routing.models import RouteOptions
from c3nav.site.forms import ReportUpdateForm
from c3nav.site.models import Announcement, SiteUpdate
@ -455,7 +456,25 @@ def report_detail(request, pk, secret=None):
form = report.form_cls(instance=report)
can_review = report.request_can_review(request)
if can_review:
new_update = ReportUpdate(
report=report,
author=request.user,
)
if request.method == 'POST':
update_form = ReportUpdateForm(request, instance=new_update, data=request.POST)
if update_form.is_valid():
update_form.save()
messages.success(request, _('Report updated.'))
return redirect(request.path_info)
else:
update_form = ReportUpdateForm(request, instance=new_update)
else:
update_form = None
return render(request, 'site/report_detail.html', {
'report': report,
'form': form,
'update_form': update_form,
})