quick comment feature for reports and stuff
This commit is contained in:
parent
b19c001ad1
commit
6a91631f9b
6 changed files with 131 additions and 7 deletions
39
src/c3nav/mapdata/migrations/0081_auto_20191225_1015.py
Normal file
39
src/c3nav/mapdata/migrations/0081_auto_20191225_1015.py
Normal 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'),
|
||||
),
|
||||
]
|
|
@ -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', )
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue