diff --git a/chcemvediet/apps/inforequests/admin.py b/chcemvediet/apps/inforequests/admin.py index bb40c40b7..ed55c1425 100644 --- a/chcemvediet/apps/inforequests/admin.py +++ b/chcemvediet/apps/inforequests/admin.py @@ -14,7 +14,7 @@ ReadOnlyAdminInlineMixin, BulkDeleteAdminMixin) from chcemvediet.apps.inforequests.constants import ADMIN_EXTEND_SNOOZE_BY_DAYS -from .models import Inforequest, InforequestDraft, InforequestEmail, Branch, Action +from .models import Inforequest, InforequestDraft, InforequestEmail, Branch, Action, Feedback class DeleteNestedInforequestEmailAdminMixin(BulkDeleteAdminMixin, admin.ModelAdmin): @@ -463,3 +463,41 @@ def delete_model(self, request, obj): super(ActionAdmin, self).delete_model(request, obj) if request.POST.get(u'snooze') and self.can_snooze_previous_action(obj): self.snooze_action(obj.previous_action) + + +@admin.register(Feedback, site=admin.site) +class FeedbackAdmin(admin.ModelAdmin): + date_hierarchy = u'created' + list_display = [ + u'id', + decorate( + lambda o: admin_obj_format(o.inforequest), + short_description=u'Inforequest', + admin_order_field=u'inforequest' + ), + u'created', + u'content', + u'rating' + ] + list_filter = [ + u'created', + u'rating' + ] + ordering = [ + u'-created', + u'-id', + u'inforequest__id' + ] + exclude = [ + ] + readonly_fields = [ + u'inforequest', + u'content', + u'created', + u'rating' + ] + raw_id_fields = [ + u'inforequest' + ] + + diff --git a/chcemvediet/apps/inforequests/forms/__init__.py b/chcemvediet/apps/inforequests/forms/__init__.py index e96fc44a3..202534825 100644 --- a/chcemvediet/apps/inforequests/forms/__init__.py +++ b/chcemvediet/apps/inforequests/forms/__init__.py @@ -8,3 +8,4 @@ from .clarification_response import ClarificationResponseWizard from .appeal import AppealWizard from .action import SnoozeForm +from .feedback_action import FeedbackActionWizard diff --git a/chcemvediet/apps/inforequests/forms/feedback_action.py b/chcemvediet/apps/inforequests/forms/feedback_action.py new file mode 100644 index 000000000..7b5da81fe --- /dev/null +++ b/chcemvediet/apps/inforequests/forms/feedback_action.py @@ -0,0 +1,83 @@ +# vim: expandtab +# -*- coding: utf-8 -*- + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from chcemvediet.apps.inforequests.models import Feedback +from poleno.utils.urls import reverse +from chcemvediet.apps.wizards.wizard import Bottom, Step, Wizard + + +class FeedbackActionStep(Step): + template = u'inforequests/feedback_action/wizard.html' + form_template = u'main/forms/form_horizontal.html' + + +class FeedbackContent(FeedbackActionStep): + label = u'label free text feedback' + text_template = u'inforequests/feedback_action/texts/content.html' + global_fields = [u'content'] + post_step_class = Bottom + + def add_fields(self): + super(FeedbackContent, self).add_fields() + + self.fields[u'content'] = forms.CharField( + label=_(u'inforequests:feedback_action:FeedbackContent:content:label'), + required=False, + widget=forms.Textarea(attrs={ + u'placeholder': + _(u'inforequests:feedback_action:FeedbackContent:content:placeholder'), + u'class': u'pln-autosize', + u'cols': u'', u'rows': u'' + }) + ) + + +class FeedbackRating(FeedbackActionStep): + label = u'' + text_template = u'inforequests/feedback_action/texts/rating.html' + global_fields = [u'rating'] + post_step_class = FeedbackContent + + def add_fields(self): + super(FeedbackRating, self).add_fields() + self.fields[u'rating'] = forms.TypedChoiceField( + label=u' ', + coerce=int, + choices=Feedback.RATING_LEVELS._choices, + widget=forms.RadioSelect(), + ) + + +class FeedbackActionWizard(Wizard): + first_step_class = FeedbackRating + + def __init__(self, request, index, inforequest): + self.inforequest = inforequest + super(FeedbackActionWizard, self).__init__(request, index) + + def get_instance_id(self): + return u'{}-{}'.format(self.__class__.__name__, self.inforequest.pk) + + def get_step_url(self, step, anchor=u''): + return reverse(u'inforequests:feedback_action', + kwargs=dict(inforequest=self.inforequest, step=step)) + anchor + + def context(self, extra=None): + res = super(FeedbackActionWizard, self).context(extra) + res.update({ + u'inforequest': self.inforequest + }) + return res + + def finish(self): + feedback = Feedback( + inforequest=self.inforequest, + content=self.values[u'content'], + rating=self.values[u'rating'] + ) + feedback.save() + + return self.inforequest.get_absolute_url() diff --git a/chcemvediet/apps/inforequests/migrations/0023_auto_20231201_1635.py b/chcemvediet/apps/inforequests/migrations/0023_auto_20231201_1635.py new file mode 100644 index 000000000..3aee92134 --- /dev/null +++ b/chcemvediet/apps/inforequests/migrations/0023_auto_20231201_1635.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import poleno.utils.date +import poleno.utils.misc + + +class Migration(migrations.Migration): + + dependencies = [ + ('inforequests', '0022_inforequest_published'), + ] + + operations = [ + migrations.CreateModel( + name='Feedback', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('content', models.TextField(blank=True)), + ('created', models.DateTimeField(default=poleno.utils.date.utc_now)), + ('inforequest', models.ForeignKey(to='inforequests.Inforequest', db_index=False)), + ], + options={ + 'verbose_name_plural': 'Feedback', + }, + bases=(poleno.utils.misc.FormatMixin, models.Model), + ), + migrations.AlterIndexTogether( + name='feedback', + index_together=set([('created', 'id')]), + ), + ] diff --git a/chcemvediet/apps/inforequests/migrations/0024_feedback_rating.py b/chcemvediet/apps/inforequests/migrations/0024_feedback_rating.py new file mode 100644 index 000000000..4b8011b50 --- /dev/null +++ b/chcemvediet/apps/inforequests/migrations/0024_feedback_rating.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('inforequests', '0023_auto_20231201_1635'), + ] + + operations = [ + migrations.AddField( + model_name='feedback', + name='rating', + field=models.SmallIntegerField(default=None, blank=True, choices=[(0, 'Stra\u0161n\xfd'), (1, 'Ve\u013emi zl\xfd'), (2, 'Zl\xfd'), (3, 'Priemern\xfd'), (4, 'Dobr\xfd'), (5, 'Ve\u013emi dobr\xfd'), (6, 'Vynikaj\xfaci'), (7, 'Mimoriadny')]), + preserve_default=True, + ), + ] diff --git a/chcemvediet/apps/inforequests/models/__init__.py b/chcemvediet/apps/inforequests/models/__init__.py index 9b19d5f2a..f86d88b3a 100644 --- a/chcemvediet/apps/inforequests/models/__init__.py +++ b/chcemvediet/apps/inforequests/models/__init__.py @@ -6,3 +6,4 @@ from .inforequestemail import InforequestEmail from .branch import Branch from .action import Action +from .feedback import Feedback diff --git a/chcemvediet/apps/inforequests/models/feedback.py b/chcemvediet/apps/inforequests/models/feedback.py new file mode 100644 index 000000000..ae74a65c9 --- /dev/null +++ b/chcemvediet/apps/inforequests/models/feedback.py @@ -0,0 +1,48 @@ +# vim: expandtab +# -*- coding: utf-8 -*- +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from poleno.utils.date import utc_now +from poleno.utils.misc import FormatMixin +from poleno.utils.models import FieldChoices, QuerySet + + +class FeedbackQuerySet(QuerySet): + def order_by_pk(self): + return self.order_by(u'pk') + + +class Feedback(FormatMixin, models.Model): + # NOT NULL + inforequest = models.ForeignKey(u'Inforequest', db_index=False) + + # May be empty + content = models.TextField(blank=True) + + # NOT NULL + created = models.DateTimeField(default=utc_now) + + RATING_LEVELS = FieldChoices( + (u'ATROCIOUS', 0, _(u'inforequests:Feedback:rating:ATROCIOUS')), + (u'VERY POOR', 1, _(u'inforequests:Feedback:rating:VERY_POOR')), + (u'POOR', 2, _(u'inforequests:Feedback:rating:POOR')), + (u'MEDIOCRE', 3, _(u'inforequests:Feedback:rating:MEDIOCRE')), + (u'GOOD', 4, _(u'inforequests:Feedback:rating:GOOD')), + (u'VERY GOOD', 5, _(u'inforequests:Feedback:rating:VERY_GOOD')), + (u'EXCELLENT', 6, _(u'inforequests:Feedback:rating:EXCELLENT')), + ) + + rating = models.SmallIntegerField(choices=RATING_LEVELS._choices, blank=True, default=None) + + # Indexes: + # -- inforequest: ForeignKey + # -- created, id: index_together + + objects = FeedbackQuerySet.as_manager() + + class Meta: + verbose_name_plural = u'Feedback' + index_together = [ + [u'created', u'id'], + ] diff --git a/chcemvediet/apps/inforequests/templates/inforequests/detail/detail.html b/chcemvediet/apps/inforequests/templates/inforequests/detail/detail.html index 89a517a75..e08da2acf 100644 --- a/chcemvediet/apps/inforequests/templates/inforequests/detail/detail.html +++ b/chcemvediet/apps/inforequests/templates/inforequests/detail/detail.html @@ -17,4 +17,5 @@

{% trans 'inforequests:detail:heading' %}

{% include "inforequests/detail/request.html" %} {% include "inforequests/detail/response.html" %} {% include "inforequests/detail/branch/main.html" %} + {% include "inforequests/detail/feedback.html" %} {% endblock %} diff --git a/chcemvediet/apps/inforequests/templates/inforequests/detail/feedback.html b/chcemvediet/apps/inforequests/templates/inforequests/detail/feedback.html new file mode 100644 index 000000000..e5ff32d5b --- /dev/null +++ b/chcemvediet/apps/inforequests/templates/inforequests/detail/feedback.html @@ -0,0 +1,31 @@ +{# vim: set filetype=htmldjango shiftwidth=2 :#} +{% load trans from i18n %} +{% load url from poleno.utils %} + +{% comment %} + % + % Context: + % -- inforequest: chcemvediet.apps.inforequests.models.Inforequest + % +{% endcomment %} + +
+
+ + + + +
+
+ {% trans 'inforequests:detail:feedback:heading' %} +
+
+
+ {% include "inforequests/detail/texts/feedback.html" %} + + +   + {% trans 'inforequests:detail:feedback:button' %} + +
diff --git a/chcemvediet/apps/inforequests/templates/inforequests/detail/texts/feedback.html b/chcemvediet/apps/inforequests/templates/inforequests/detail/texts/feedback.html new file mode 100644 index 000000000..d6f2ad666 --- /dev/null +++ b/chcemvediet/apps/inforequests/templates/inforequests/detail/texts/feedback.html @@ -0,0 +1,12 @@ +{# vim: set filetype=htmldjango shiftwidth=2 :#} + +{% comment %} +% +% Context: +% -- inforequest: chcemvediet.apps.inforequests.models.Inforequest +% +{% endcomment %} + +

+ Chceme zlepšovať portál Chcemvedieť.sk a preto nás zaujíma váš názor. Pomohol vám portál pri odosielaní a prijímaní žiadostí? Boli ste spokojní s poskytovanými funkcionalitami? Alebo naopak, boli ste s niečim nespokojní? Máte nápady na zlepšenie a radi by ste sa o ne podelili? Budeme radi, ak nám dáte spätnú väzbu a pomôžete nám portál zlepšovať. +

diff --git a/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/content.html b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/content.html new file mode 100644 index 000000000..0e10b7f02 --- /dev/null +++ b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/content.html @@ -0,0 +1,18 @@ +{# vim: set filetype=htmldjango shiftwidth=2 :#} + +{% comment %} +% +% Context: +% -- wizard: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackActionWizard +% -- step: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackContent +% -- inforequest: chcemvediet.apps.inforequests.models.Inforequest +% +{% endcomment %} + + +

Ako by ste zhodnotili portál?

+

+ Našim záujmom je zlepšovanie portálu a jeho funkcionalít. Zaujíma nás nie len toto, + s čím ste spokojní a ktoré funkcionality portálu vám pomáhajú, ale aj to, kde si myslíte, že + je treba nájsť zlepšenia. +

diff --git a/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/rating.html b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/rating.html new file mode 100644 index 000000000..0e10b7f02 --- /dev/null +++ b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/texts/rating.html @@ -0,0 +1,18 @@ +{# vim: set filetype=htmldjango shiftwidth=2 :#} + +{% comment %} +% +% Context: +% -- wizard: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackActionWizard +% -- step: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackContent +% -- inforequest: chcemvediet.apps.inforequests.models.Inforequest +% +{% endcomment %} + + +

Ako by ste zhodnotili portál?

+

+ Našim záujmom je zlepšovanie portálu a jeho funkcionalít. Zaujíma nás nie len toto, + s čím ste spokojní a ktoré funkcionality portálu vám pomáhajú, ale aj to, kde si myslíte, že + je treba nájsť zlepšenia. +

diff --git a/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/wizard.html b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/wizard.html new file mode 100644 index 000000000..e8d62751a --- /dev/null +++ b/chcemvediet/apps/inforequests/templates/inforequests/feedback_action/wizard.html @@ -0,0 +1,37 @@ +{# vim: set filetype=htmldjango shiftwidth=2 :#} +{% extends step.base_template %} +{% load trans from i18n %} + +{% comment %} +% +% Context: +% -- wizard: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackActionWizard +% -- step: chcemvediet.apps.inforequests.forms.feedback_action.FeedbackActionStep +% -- inforequest: chcemvediet.apps.inforequests.models.Inforequest +% +{% endcomment %} + +{% block title %} + {% trans 'inforequests:feedback_action:title' %} + | {{ block.super }} +{% endblock %} + +{% block header-heading %} + {% trans 'inforequests:feedback_action:heading' %} +{% endblock %} + +{% block footer-cancel-href %}{{ inforequest.get_absolute_url }}{% endblock %} + +{% block footer-finish-label %} + +   + {% trans 'inforequests:feedback_action:submit' %} +{% endblock %} + +{% block body-plus-footer %} +
+
+ {{ block.super }} +
+
+{% endblock %} diff --git a/chcemvediet/apps/inforequests/tests/test_models/test_feedback.py b/chcemvediet/apps/inforequests/tests/test_models/test_feedback.py new file mode 100644 index 000000000..7ea206483 --- /dev/null +++ b/chcemvediet/apps/inforequests/tests/test_models/test_feedback.py @@ -0,0 +1,44 @@ +# vim: expandtab +# -*- coding: utf-8 -*- + +import datetime +import random + +from django.db import IntegrityError +from django.test import TestCase + +from poleno.utils.date import local_datetime_from_local, utc_now + +from .. import InforequestsTestCaseMixin +from ...models import Feedback + + +class FeedbackTest(InforequestsTestCaseMixin, TestCase): + def test_inforequest_field(self): + inforequest = self._create_inforequest(applicant=self.user1) + feedback = self._create_feedback(inforequest=inforequest) + self.assertEqual(feedback.inforequest, inforequest) + + def test_inforequest_field_may_not_be_null(self): + with self.assertRaisesMessage(IntegrityError, u'NOT NULL constraint failed: inforequests_feedback.inforequest_id'): + self._create_feedback(omit=[u'inforequest']) + + def test_content_field(self): + feedback = self._create_feedback(content=u'Content') + self.assertEqual(feedback.content, u'Content') + + def test_created_field(self): + dt = local_datetime_from_local(u'2023-12-01 09:20:00.223445') + feedback = self._create_feedback(created=dt) + self.assertEqual(feedback.created, dt) + + def test_created_field_default_value_if_omitted(self): + feedback = self._create_feedback(omit=[u'created']) + self.assertAlmostEqual(feedback.created, utc_now(), delta=datetime.timedelta(milliseconds=100)) + + def test_order_by_pk_query_method(self): + feedback = [self._create_feedback() for _ in range(20)] + sample = random.sample(feedback, 10) + result = Feedback.objects.filter(pk__in=(d.pk for d in sample)).order_by_pk().reverse() + self.assertEqual(list(result), sorted(sample, key=lambda d: -d.pk)) + diff --git a/chcemvediet/apps/inforequests/urls.py b/chcemvediet/apps/inforequests/urls.py index 580d422b6..34cfd51ae 100644 --- a/chcemvediet/apps/inforequests/urls.py +++ b/chcemvediet/apps/inforequests/urls.py @@ -31,6 +31,7 @@ u'snooze': lazy_concat(_(u'inforequests:urls:snooze'), u'/'), u'attachments': lazy_concat(_(u'inforequests:urls:attachments'), u'/'), u'attachment_finalizations': lazy_concat(_(u'inforequests:urls:attachment_finalizations'), u'/'), + u'feedback_action': lazy_concat(_(u'inforequests:urls:feedback_action'), u'/') } urlpatterns = patterns(u'', @@ -44,6 +45,7 @@ url(lazy_format(r'^{inforequest_slug_pk}{clarification_response}{branch_pk}{step_idx?}$', **parts), views.clarification_response, name=u'clarification_response'), url(lazy_format(r'^{inforequest_slug_pk}{appeal}{branch_pk}{step_idx?}$', **parts), views.appeal, name=u'appeal'), url(lazy_format(r'^{inforequest_slug_pk}{snooze}{branch_pk}{action_pk}$', **parts), views.snooze, name=u'snooze'), + url(lazy_format(r'^{inforequest_slug_pk}{feedback_action}{step_idx?}$', **parts), views.feedback_action, name=u'feedback_action'), url(lazy_format(r'^{attachments}$', **parts), views.attachment_upload, name=u'upload_attachment'), url(lazy_format(r'^{attachments}{attachment_pk}$', **parts), views.attachment_download, name=u'download_attachment'), url(lazy_format(r'^{attachment_finalizations}{attachment_finalization_pk}$', **parts), views.attachment_finalization_download, name=u'download_attachment_finalization'), @@ -65,6 +67,7 @@ def draft_adaptor(draft): @reverse_adaptor(u'inforequests:detail', u'inforequest') @reverse_adaptor(u'inforequests:obligee_action', u'inforequest') +@reverse_adaptor(u'inforequests:feedback_action', u'inforequest') def inforequest_adaptor_slug_and_pk(inforequest): return dict( inforequest_slug=inforequest.slug, @@ -107,6 +110,7 @@ def attachment_finalization_adaptor(attachment_finalization): return dict(attachment_finalization_pk=attachment_finalization.pk) @reverse_adaptor(u'inforequests:obligee_action', u'step') +@reverse_adaptor(u'inforequests:feedback_action', u'step') @reverse_adaptor(u'inforequests:clarification_response', u'step') @reverse_adaptor(u'inforequests:appeal', u'step') def step_adaptor(step): diff --git a/chcemvediet/apps/inforequests/views/__init__.py b/chcemvediet/apps/inforequests/views/__init__.py index 299bd1d6a..ffc04bed4 100644 --- a/chcemvediet/apps/inforequests/views/__init__.py +++ b/chcemvediet/apps/inforequests/views/__init__.py @@ -8,6 +8,7 @@ from .inforequest import inforequest_delete_draft from .inforequest import obligee_action_dispatcher from .action import obligee_action +from .action import feedback_action from .action import clarification_response from .action import appeal from .action import snooze diff --git a/chcemvediet/apps/inforequests/views/action.py b/chcemvediet/apps/inforequests/views/action.py index 9c5bcf064..9f4ce409c 100644 --- a/chcemvediet/apps/inforequests/views/action.py +++ b/chcemvediet/apps/inforequests/views/action.py @@ -7,6 +7,7 @@ from poleno.utils.urls import reverse from poleno.utils.views import require_ajax, login_required from chcemvediet.apps.wizards.views import wizard_view +from chcemvediet.apps.inforequests.forms import FeedbackActionWizard from chcemvediet.apps.inforequests.forms import SnoozeForm from chcemvediet.apps.inforequests.forms import AppealWizard, ClarificationResponseWizard from chcemvediet.apps.inforequests.forms import ObligeeActionWizard @@ -15,6 +16,20 @@ from .shortcuts import render_form, json_form, json_success +@require_http_methods([u'HEAD', u'GET', u'POST']) +@transaction.atomic +@login_required(raise_exception=True) +def feedback_action(request, inforequest_slug, inforequest_pk, step_idx=None): + inforequest = (Inforequest.objects + .not_closed().owned_by(request.user).get_or_404(pk=inforequest_pk)) + + if inforequest_slug != inforequest.slug: + return HttpResponseRedirect(reverse(u'inforequests:feedback_action', + kwargs=dict(inforequest=inforequest, step_idx=step_idx))) + + return wizard_view(FeedbackActionWizard, request, step_idx, inforequest) + + @require_http_methods([u'HEAD', u'GET', u'POST']) @transaction.atomic @login_required(raise_exception=True) diff --git a/chcemvediet/locale/sk/LC_MESSAGES/django.po b/chcemvediet/locale/sk/LC_MESSAGES/django.po index 07586d3dc..3398c728f 100644 --- a/chcemvediet/locale/sk/LC_MESSAGES/django.po +++ b/chcemvediet/locale/sk/LC_MESSAGES/django.po @@ -365,6 +365,21 @@ msgstr "Prílohy" msgid "inforequests:InforequestForm:attachments:help_text" msgstr "Priložiť môžete najviac 20 príloh s celkovou velkosťou najviac 15 MB." +msgid "inforequests:feedback_action:FeedbackContent:content:label" +msgstr "Správa pre nás" + +msgid "inforequests:feedback_action:FeedbackContent:content:placeholder" +msgstr "Správa pre nás" + +msgid "inforequests:feedback_action:title" +msgstr "Spätná väzba" + +msgid "inforequests:feedback_action:heading" +msgstr "Spätná väzba" + +msgid "inforequests:feedback_action:submit" +msgstr "Odoslať spätnú väzbu" + msgid "inforequests:obligee_action:Categorized:label" msgstr "Zaradené" @@ -704,6 +719,27 @@ msgstr "Neúplné sprístupnenie informácie bez vydania rozhodnutia" msgid "inforequests:Action:type:DISCLOSURE:FULL" msgstr "Úplne sprístupnenie informácie" +msgid "inforequests:Feedback:rating:ATROCIOUS" +msgstr "Strašný: S portálom som mal závažný problém." + +msgid "inforequests:Feedback:rating:VERY_POOR" +msgstr "Veľmi zlý: Portál mi vadil, spomaľoval ma, alebo som musel prekonať niečo nelogické." + +msgid "inforequests:Feedback:rating:POOR" +msgstr "Zlý: Podarilo sa mi urobiť čo som chcel, ale nevidím v portáli zásadný prínos." + +msgid "inforequests:Feedback:rating:MEDIOCRE" +msgstr "Priemerný: Portál som použil, ešte uvidím." + +msgid "inforequests:Feedback:rating:GOOD" +msgstr "Dobrý: portál mi pomohol, vedel by som si predstaviť zlepšenie." + +msgid "inforequests:Feedback:rating:VERY_GOOD" +msgstr "Veľmi dobrý: portál mi veľmi pomohol, nemám žiadny nápad na zlepšenie." + +msgid "inforequests:Feedback:rating:EXCELLENT" +msgstr "Vynikajúci: Portál mi umožnil čo by som sám nezvládol/sama nezvládla. Zrozumiteľne ma viedol celým procesom." + msgid "inforequests:Inforequest:fallback_slug" msgstr "ziadost" @@ -878,6 +914,12 @@ msgstr "Reagovať na e-mail" msgid "inforequests:detail:response:smail:button" msgstr "Prišla mi pošta" +msgid "inforequests:detail:feedback:button" +msgstr "Poskytnúť spätnú väzbu" + +msgid "inforequests:detail:feedback:heading" +msgstr "Spätná väzba" + msgid "inforequests:index:title" msgstr "Zverejnené infožiadosti" @@ -1052,6 +1094,9 @@ msgstr "prilohy" msgid "inforequests:urls:attachment_finalizations" msgstr "prilohy-anonymizovane" +msgid "inforequests:urls:feedback_action" +msgstr "spatna-vazba" + msgid "obligees:ObligeeField:error:invalid_obligee" msgstr "Neplatný názov inštitúcie, zvoľte z menu." diff --git a/chcemvediet/static/main/css/bars.sass b/chcemvediet/static/main/css/bars.sass index 3bfb909ca..ea78b64c8 100644 --- a/chcemvediet/static/main/css/bars.sass +++ b/chcemvediet/static/main/css/bars.sass @@ -53,3 +53,16 @@ .chv-bar-control .chv-icon color: $chv-color-red-l + +.chv-bar-green + color: $chv-color-green + background-color: $chv-color-green-w + .chv-bar-icon + background-color: $chv-color-green-l + .chv-icon + color: $chv-color-white + .chv-icon.chv-icon-inv + color: $chv-color-green-l !important + .chv-bar-control + .chv-icon + color: $chv-color-green-l diff --git a/chcemvediet/tests/__init__.py b/chcemvediet/tests/__init__.py index 1c399e149..8ca1952ad 100644 --- a/chcemvediet/tests/__init__.py +++ b/chcemvediet/tests/__init__.py @@ -17,7 +17,7 @@ from poleno.utils.date import local_today, utc_now from ..apps.geounits.models import Region, District, Municipality, Neighbourhood -from ..apps.inforequests.models import Branch, Inforequest, InforequestEmail, InforequestDraft, Action +from ..apps.inforequests.models import Branch, Feedback, Inforequest, InforequestEmail, InforequestDraft, Action from ..apps.obligees.models import Obligee, ObligeeTag, ObligeeGroup, ObligeeAlias @@ -302,5 +302,12 @@ def _create_action(self, **kwargs): u'last_deadline_reminder': None, }) + def _create_feedback(self, **kwargs): + return self._call_with_defaults(Feedback.objects.create, kwargs, { + u'inforequest': self.inforequest, + u'content': u'Default Testing Content', + u'created': utc_now(), + }) + def _render(self, template, **context): return Template(template).render(Context(context))