diff --git a/src/c3nav/control/migrations/0008_userpermissions_reports.py b/src/c3nav/control/migrations/0008_userpermissions_reports.py index 1bd60de0..79491a0b 100644 --- a/src/c3nav/control/migrations/0008_userpermissions_reports.py +++ b/src/c3nav/control/migrations/0008_userpermissions_reports.py @@ -14,11 +14,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name='userpermissions', name='review_all_reports', - field=models.BooleanField(default=False, verbose_name='can review reports'), + field=models.BooleanField(default=False, verbose_name='can review all reports'), ), migrations.AddField( model_name='userpermissions', name='review_group_reports', - field=models.ManyToManyField(limit_choices_to={'access_restriction': None}, related_name='permissions', to='mapdata.LocationGroup', verbose_name='can review reports belonging to'), + field=models.ManyToManyField(blank=True, limit_choices_to={'access_restriction': None}, related_name='permissions', to='mapdata.LocationGroup', verbose_name='can review reports belonging to'), ), ] diff --git a/src/c3nav/control/models.py b/src/c3nav/control/models.py index e5ec2b7b..ee89555f 100644 --- a/src/c3nav/control/models.py +++ b/src/c3nav/control/models.py @@ -30,8 +30,8 @@ class UserPermissions(models.Model): grant_all_access = models.BooleanField(default=False, verbose_name=_('can grant access to everything')) grant_space_access = models.BooleanField(default=False, verbose_name=_('can grant space access')) - review_all_reports = models.BooleanField(default=False, verbose_name=_('can review reports')) - review_group_reports = models.ManyToManyField('mapdata.LocationGroup', + review_all_reports = models.BooleanField(default=False, verbose_name=_('can review all reports')) + review_group_reports = models.ManyToManyField('mapdata.LocationGroup', blank=True, limit_choices_to={'access_restriction': None}, verbose_name=_('can review reports belonging to')) @@ -59,6 +59,10 @@ class UserPermissions(models.Model): return () return tuple(self.review_group_reports.values_list('pk', flat=True)) + @cached_property + def can_review_reports(self): + return self.review_all_reports or self.review_group_ids + @classmethod @contextmanager def lock(cls, pk): @@ -84,6 +88,8 @@ class UserPermissions(models.Model): result = cls.objects.filter(pk=user.pk).first() if not result: result = cls(user=user, initial=True) + # noinspection PyStatementEffect + result.review_group_ids cache.set(cache_key, result, 900) return result diff --git a/src/c3nav/locale/de/LC_MESSAGES/django.po b/src/c3nav/locale/de/LC_MESSAGES/django.po index 192e7894..d0ace970 100644 --- a/src/c3nav/locale/de/LC_MESSAGES/django.po +++ b/src/c3nav/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-24 17:22+0100\n" +"POT-Creation-Date: 2019-12-24 18:42+0100\n" "PO-Revision-Date: 2019-12-22 00:44+0100\n" "Last-Translator: Jenny Danzmayr \n" "Language-Team: \n" @@ -42,7 +42,7 @@ msgstr "Nich angemeldet." msgid "Logout successful." msgstr "Login erfolgreich." -#: c3nav/api/models.py:14 c3nav/mapdata/models/report.py:79 +#: c3nav/api/models.py:14 c3nav/mapdata/models/report.py:84 msgid "secret" msgstr "secret" @@ -62,94 +62,94 @@ msgstr "Befugnisse" msgid "Important dates" msgstr "Wichtige Daten" -#: c3nav/control/forms.py:79 +#: c3nav/control/forms.py:83 msgid "choose permissions…" msgstr "Erlaubnsise auswählen…" -#: c3nav/control/forms.py:80 +#: c3nav/control/forms.py:84 #, python-format msgid "everything possible (%d permission)" msgid_plural "everything possible (%d permissions)" msgstr[0] "alles mögliche (%d Erlaubnis)" msgstr[1] "alles mögliche (%d Erlaubnisse)" -#: c3nav/control/forms.py:84 +#: c3nav/control/forms.py:88 msgid "Access Permission Groups" msgstr "Zugangserlaubnisgruppen" -#: c3nav/control/forms.py:88 c3nav/control/templates/control/access.html:4 -#: c3nav/control/templates/control/user.html:60 +#: c3nav/control/forms.py:92 c3nav/control/templates/control/access.html:4 +#: c3nav/control/templates/control/user.html:64 #: c3nav/mapdata/models/access.py:149 msgid "Access Permissions" msgstr "Zugangserlaubnisse" -#: c3nav/control/forms.py:97 c3nav/control/templates/control/user.html:91 -#: c3nav/control/templates/control/user.html:134 +#: c3nav/control/forms.py:101 c3nav/control/templates/control/user.html:95 +#: c3nav/control/templates/control/user.html:138 msgid "never" msgstr "nie" -#: c3nav/control/forms.py:101 +#: c3nav/control/forms.py:105 #, python-format msgid "in %d minute" msgid_plural "in %d minutes" msgstr[0] "in %d Minute" msgstr[1] "in %d Minuten" -#: c3nav/control/forms.py:105 +#: c3nav/control/forms.py:109 #, python-format msgid "in %d hour" msgid_plural "in %d hours" msgstr[0] "in %d Stunde" msgstr[1] "in %d Stunden" -#: c3nav/control/forms.py:108 +#: c3nav/control/forms.py:112 msgid "in 1½ hour" msgstr "in 1½ Stunden" -#: c3nav/control/forms.py:112 +#: c3nav/control/forms.py:116 #, python-format msgid "in %d day" msgid_plural "in %d days" msgstr[0] "in %d Tag" msgstr[1] "in %d Tagen" -#: c3nav/control/forms.py:119 +#: c3nav/control/forms.py:123 msgid "can pass on" msgstr "kann weitergeben" -#: c3nav/control/forms.py:252 +#: c3nav/control/forms.py:256 msgid "no" msgstr "nein" -#: c3nav/control/forms.py:252 +#: c3nav/control/forms.py:256 msgid "yes" msgstr "ja" -#: c3nav/control/forms.py:272 +#: c3nav/control/forms.py:276 msgid "any type" msgstr "beliebiger Typ" -#: c3nav/control/forms.py:276 c3nav/control/forms.py:280 +#: c3nav/control/forms.py:280 c3nav/control/forms.py:284 msgid "any" msgstr "beliebig" -#: c3nav/control/forms.py:276 +#: c3nav/control/forms.py:280 msgid "geometries changed" msgstr "geometrien geändert" -#: c3nav/control/forms.py:276 +#: c3nav/control/forms.py:280 msgid "no geometries changed" msgstr "keine geometrien geändert" -#: c3nav/control/forms.py:280 +#: c3nav/control/forms.py:284 msgid "processed" msgstr "verarbeitet" -#: c3nav/control/forms.py:280 +#: c3nav/control/forms.py:284 msgid "not processed" msgstr "nicht verarbeitet" -#: c3nav/control/forms.py:287 +#: c3nav/control/forms.py:291 msgid "user id" msgstr "User ID" @@ -197,23 +197,31 @@ msgstr "kann alle Zugangserlaubnisse erteilen" msgid "can grant space access" msgstr "kann Raum-Zugriffsberechtigungen erteilen" -#: c3nav/control/models.py:32 c3nav/control/templates/control/user.html:30 +#: c3nav/control/models.py:33 +msgid "can review all reports" +msgstr "kann alle Meldungen überprüfen" + +#: c3nav/control/models.py:36 +msgid "can review reports belonging to" +msgstr "can Meldungen überprüfen die zu diesen Gruppen gehören" + +#: c3nav/control/models.py:38 c3nav/control/templates/control/user.html:34 msgid "API secret" msgstr "API secret" -#: c3nav/control/models.py:35 c3nav/control/models.py:36 +#: c3nav/control/models.py:41 c3nav/control/models.py:42 msgid "User Permissions" msgstr "Benutzerbefugnisse" -#: c3nav/control/models.py:98 c3nav/control/templates/control/user.html:165 +#: c3nav/control/models.py:116 c3nav/control/templates/control/user.html:169 msgid "can edit" msgstr "kann bearbeiten" -#: c3nav/control/models.py:101 +#: c3nav/control/models.py:119 msgid "user space access" msgstr "Benutzer-Raumzugrifsberechtigung" -#: c3nav/control/models.py:102 +#: c3nav/control/models.py:120 msgid "user space accesses" msgstr "Benutzer-Raumzugrifsberechtigungen" @@ -243,7 +251,7 @@ msgid "Edit announcement" msgstr "Ankündigung bearbeiten" #: c3nav/control/templates/control/announcement.html:10 -#: c3nav/control/templates/control/user.html:17 +#: c3nav/control/templates/control/user.html:21 #: c3nav/editor/templates/editor/changeset_edit.html:25 #: c3nav/editor/templates/editor/edit.html:32 msgid "Save" @@ -259,6 +267,7 @@ msgstr "Benutzer" #: c3nav/control/templates/control/map_updates.html:59 #: c3nav/control/templates/control/users.html:15 #: c3nav/mapdata/models/base.py:43 c3nav/mapdata/utils/locations.py:308 +#: c3nav/site/templates/site/report_list.html:18 msgid "ID" msgstr "ID" @@ -325,23 +334,28 @@ msgid "Map Updates" msgstr "Kartenänderungen" #: c3nav/control/templates/control/fragment_pagination.html:5 +#: c3nav/site/templates/site/fragment_pagination.html:5 msgid "first" msgstr "erste" #: c3nav/control/templates/control/fragment_pagination.html:8 +#: c3nav/site/templates/site/fragment_pagination.html:8 msgid "previous" msgstr "vorherige" #: c3nav/control/templates/control/fragment_pagination.html:12 +#: c3nav/site/templates/site/fragment_pagination.html:12 #, python-format msgid "Page %(page_number)s of %(num_pages)s" msgstr "Seite %(page_number)s von %(num_pages)s" #: c3nav/control/templates/control/fragment_pagination.html:16 +#: c3nav/site/templates/site/fragment_pagination.html:16 msgid "next" msgstr "nächste" #: c3nav/control/templates/control/fragment_pagination.html:19 +#: c3nav/site/templates/site/fragment_pagination.html:19 msgid "last" msgstr "letzte" @@ -432,9 +446,9 @@ msgstr "" #: c3nav/control/templates/control/map_updates.html:89 #: c3nav/control/templates/control/map_updates.html:96 -#: c3nav/control/templates/control/user.html:97 -#: c3nav/control/templates/control/user.html:140 -#: c3nav/control/templates/control/user.html:173 +#: c3nav/control/templates/control/user.html:101 +#: c3nav/control/templates/control/user.html:144 +#: c3nav/control/templates/control/user.html:177 #: c3nav/mapdata/models/geometry/level.py:142 #: c3nav/mapdata/models/locations.py:122 c3nav/mapdata/models/locations.py:123 msgid "Yes" @@ -442,9 +456,9 @@ msgstr "Ja" #: c3nav/control/templates/control/map_updates.html:91 #: c3nav/control/templates/control/map_updates.html:98 -#: c3nav/control/templates/control/user.html:99 -#: c3nav/control/templates/control/user.html:142 -#: c3nav/control/templates/control/user.html:175 +#: c3nav/control/templates/control/user.html:103 +#: c3nav/control/templates/control/user.html:146 +#: c3nav/control/templates/control/user.html:179 #: c3nav/mapdata/models/geometry/level.py:142 #: c3nav/mapdata/models/locations.py:122 c3nav/mapdata/models/locations.py:123 msgid "No" @@ -458,103 +472,103 @@ msgstr "im django Admin Panel zeigen" msgid "General Permissions" msgstr "Generelle Befugnisse" -#: c3nav/control/templates/control/user.html:24 -#: c3nav/control/templates/control/user.html:111 -#: c3nav/control/templates/control/user.html:151 +#: c3nav/control/templates/control/user.html:28 +#: c3nav/control/templates/control/user.html:115 +#: c3nav/control/templates/control/user.html:155 msgid "none" msgstr "keine" -#: c3nav/control/templates/control/user.html:34 +#: c3nav/control/templates/control/user.html:38 msgid "This user has an API secret." msgstr "Dieser Benutzer hat ein API Secret." -#: c3nav/control/templates/control/user.html:36 +#: c3nav/control/templates/control/user.html:40 msgid "You have an API secret." msgstr "Du hast ein API Secret." -#: c3nav/control/templates/control/user.html:38 +#: c3nav/control/templates/control/user.html:42 msgid "You can not see it, but generate a new one." msgstr "Du kannst es nich sehen, aber ein neues generieren." -#: c3nav/control/templates/control/user.html:40 +#: c3nav/control/templates/control/user.html:44 msgid "This user has not an API secret." msgstr "Dieser Benutzer hat kein API Secret." -#: c3nav/control/templates/control/user.html:41 +#: c3nav/control/templates/control/user.html:45 msgid "You can create one." msgstr "Du kannst eins erstellen." -#: c3nav/control/templates/control/user.html:49 +#: c3nav/control/templates/control/user.html:53 msgid "Regenerate API secret" msgstr "API Secret neu generieren" -#: c3nav/control/templates/control/user.html:50 +#: c3nav/control/templates/control/user.html:54 msgid "Delete API secret" msgstr "API Secret löschen" -#: c3nav/control/templates/control/user.html:52 +#: c3nav/control/templates/control/user.html:56 msgid "Generate API secret" msgstr "API Secret generieren" -#: c3nav/control/templates/control/user.html:55 +#: c3nav/control/templates/control/user.html:59 msgid "Update API secret" msgstr "API Secret updaten" -#: c3nav/control/templates/control/user.html:64 +#: c3nav/control/templates/control/user.html:68 #, python-format msgid "for %(restriction_title)s" msgstr "für %(restriction_title)s" -#: c3nav/control/templates/control/user.html:66 +#: c3nav/control/templates/control/user.html:70 #: c3nav/editor/templates/editor/account_form.html:11 #: c3nav/site/templates/site/account_form.html:12 #: c3nav/site/templates/site/confirm.html:19 msgid "back" msgstr "zurück" -#: c3nav/control/templates/control/user.html:73 +#: c3nav/control/templates/control/user.html:77 #: c3nav/mapdata/models/access.py:77 c3nav/mapdata/models/geometry/space.py:385 -#: c3nav/mapdata/models/report.py:58 c3nav/mapdata/models/report.py:109 +#: c3nav/mapdata/models/report.py:63 c3nav/mapdata/models/report.py:150 #: c3nav/site/models.py:17 msgid "author" msgstr "Autor" -#: c3nav/control/templates/control/user.html:74 -#: c3nav/control/templates/control/user.html:122 +#: c3nav/control/templates/control/user.html:78 +#: c3nav/control/templates/control/user.html:126 #: c3nav/mapdata/models/access.py:139 msgid "expires" msgstr "läuft ab" -#: c3nav/control/templates/control/user.html:75 -#: c3nav/control/templates/control/user.html:123 +#: c3nav/control/templates/control/user.html:79 +#: c3nav/control/templates/control/user.html:127 #: c3nav/mapdata/models/access.py:82 c3nav/mapdata/models/access.py:140 msgid "can grant" msgstr "kann erteilen" -#: c3nav/control/templates/control/user.html:76 +#: c3nav/control/templates/control/user.html:80 msgid "key" msgstr "key" -#: c3nav/control/templates/control/user.html:104 -#: c3nav/control/templates/control/user.html:179 +#: c3nav/control/templates/control/user.html:108 +#: c3nav/control/templates/control/user.html:183 #: c3nav/editor/templates/editor/changeset.html:124 #: c3nav/editor/templates/editor/delete.html:17 #: c3nav/editor/templates/editor/edit.html:27 msgid "Delete" msgstr "Löschen" -#: c3nav/control/templates/control/user.html:114 -#: c3nav/control/templates/control/user.html:197 +#: c3nav/control/templates/control/user.html:118 +#: c3nav/control/templates/control/user.html:201 msgid "Add" msgstr "Hinzufügen" -#: c3nav/control/templates/control/user.html:121 +#: c3nav/control/templates/control/user.html:125 #: c3nav/mapdata/models/access.py:27 c3nav/mapdata/models/access.py:243 #: c3nav/mapdata/models/access.py:256 msgid "Access Restriction" msgstr "Zugangs­beschränkung" -#: c3nav/control/templates/control/user.html:145 +#: c3nav/control/templates/control/user.html:149 #: c3nav/editor/templates/editor/fragment_changesets.html:10 #: c3nav/editor/templates/editor/list.html:26 #: c3nav/site/templates/site/map.html:100 @@ -564,11 +578,11 @@ msgstr "Zugangs­beschränkung" msgid "Details" msgstr "Details" -#: c3nav/control/templates/control/user.html:157 +#: c3nav/control/templates/control/user.html:161 msgid "Space Access" msgstr "Raumzugriffserlaubnis" -#: c3nav/control/templates/control/user.html:164 +#: c3nav/control/templates/control/user.html:168 #: c3nav/editor/templates/editor/space.html:9 #: c3nav/mapdata/models/geometry/level.py:124 #: c3nav/mapdata/models/geometry/space.py:81 @@ -789,7 +803,7 @@ msgid "Change Set" msgstr "Änderungsset" #: c3nav/editor/models/changedobject.py:35 c3nav/editor/models/changeset.py:39 -#: c3nav/editor/views/changes.py:266 c3nav/mapdata/models/report.py:56 +#: c3nav/editor/views/changes.py:266 c3nav/mapdata/models/report.py:61 #: c3nav/site/models.py:14 c3nav/site/models.py:54 msgid "created" msgstr "erstellt" @@ -865,6 +879,7 @@ msgstr "letzte Statusänderung" #: c3nav/editor/models/changeset.py:48 c3nav/mapdata/models/base.py:64 #: c3nav/mapdata/models/graph.py:38 c3nav/mapdata/models/locations.py:256 #: c3nav/mapdata/models/locations.py:423 c3nav/mapdata/utils/locations.py:344 +#: c3nav/site/templates/site/report_list.html:19 msgid "Title" msgstr "Titel" @@ -872,8 +887,8 @@ msgstr "Titel" msgid "Description" msgstr "Beschreibung" -#: c3nav/editor/models/changeset.py:51 c3nav/mapdata/models/report.py:66 -#: c3nav/mapdata/models/report.py:113 +#: c3nav/editor/models/changeset.py:51 c3nav/mapdata/models/report.py:71 +#: c3nav/mapdata/models/report.py:154 msgid "assigned to" msgstr "zugewiesen" @@ -900,7 +915,7 @@ msgid_plural "%(num)d objects changed" msgstr[0] "%(num)d Objekt geändert" msgstr[1] "%(num)d Objekte geändert" -#: c3nav/editor/models/changesetupdate.py:12 c3nav/mapdata/models/report.py:108 +#: c3nav/editor/models/changesetupdate.py:12 c3nav/mapdata/models/report.py:149 msgid "datetime" msgstr "Zeitpunkt" @@ -1147,7 +1162,7 @@ msgid "close dialog" msgstr "Dialog schließen" #: c3nav/editor/templates/editor/fragment_nav.html:21 -#: c3nav/site/templates/site/account.html:28 +#: c3nav/site/templates/site/account.html:38 msgid "Log out" msgstr "Abmelden" @@ -1279,7 +1294,7 @@ msgid "Activate direct editing" msgstr "Direktes Bearbeiten aktivieren" #: c3nav/editor/templates/editor/user.html:54 c3nav/editor/views/account.py:85 -#: c3nav/site/templates/site/account.html:29 c3nav/site/views.py:297 +#: c3nav/site/templates/site/account.html:39 c3nav/site/views.py:297 msgid "Change password" msgstr "Passwort ändern" @@ -1681,9 +1696,10 @@ msgstr "Werte zurücksetzen" msgid "save result to the stats directory" msgstr "Ergebnis im stats-Ordner speichern" -#: c3nav/mapdata/models/access.py:23 c3nav/mapdata/models/report.py:59 -#: c3nav/mapdata/models/report.py:110 -#: c3nav/site/templates/site/report_detail.html:9 +#: c3nav/mapdata/models/access.py:23 c3nav/mapdata/models/report.py:64 +#: c3nav/mapdata/models/report.py:151 +#: c3nav/site/templates/site/report_detail.html:10 +#: c3nav/site/templates/site/report_list.html:28 msgid "open" msgstr "offen" @@ -1980,7 +1996,7 @@ msgstr "Zielraum" #: c3nav/mapdata/models/geometry/space.py:308 #: c3nav/mapdata/models/geometry/space.py:347 c3nav/mapdata/models/graph.py:48 -#: c3nav/mapdata/models/report.py:63 +#: c3nav/mapdata/models/report.py:68 msgid "description" msgstr "Beschreibung" @@ -2005,7 +2021,7 @@ msgid "Cross descriptions" msgstr "Durchschreitungsbeschreibungen" #: c3nav/mapdata/models/geometry/space.py:386 -#: c3nav/mapdata/models/report.py:111 +#: c3nav/mapdata/models/report.py:152 msgid "comment" msgstr "Kommentar" @@ -2301,92 +2317,92 @@ msgstr "Schriftgröße" msgid "Label Settings" msgstr "Labeleinstellungen" -#: c3nav/mapdata/models/report.py:52 +#: c3nav/mapdata/models/report.py:57 msgid "location issue" msgstr "Ortfehler" -#: c3nav/mapdata/models/report.py:53 +#: c3nav/mapdata/models/report.py:58 msgid "missing location" msgstr "fehlender Ort" -#: c3nav/mapdata/models/report.py:54 +#: c3nav/mapdata/models/report.py:59 msgid "route issue" msgstr "Routenfehler" -#: c3nav/mapdata/models/report.py:57 +#: c3nav/mapdata/models/report.py:62 msgid "category" msgstr "Kategorie" -#: c3nav/mapdata/models/report.py:60 +#: c3nav/mapdata/models/report.py:65 msgid "last_update" msgstr "letzte Anderung" -#: c3nav/mapdata/models/report.py:61 +#: c3nav/mapdata/models/report.py:66 msgid "title" msgstr "Titel" -#: c3nav/mapdata/models/report.py:62 +#: c3nav/mapdata/models/report.py:67 msgid "a short title for your report" msgstr "ein kurzer Titel für deine Meldung" -#: c3nav/mapdata/models/report.py:64 +#: c3nav/mapdata/models/report.py:69 msgid "tell us precisely what's wrong" msgstr "Sag uns im Detail was falsch ist" -#: c3nav/mapdata/models/report.py:68 +#: c3nav/mapdata/models/report.py:73 msgid "location" msgstr "Ort" -#: c3nav/mapdata/models/report.py:69 +#: c3nav/mapdata/models/report.py:74 msgid "coordinates" msgstr "Koordinaten" -#: c3nav/mapdata/models/report.py:70 +#: c3nav/mapdata/models/report.py:75 msgid "origin" msgstr "Start" -#: c3nav/mapdata/models/report.py:71 +#: c3nav/mapdata/models/report.py:76 msgid "destination" msgstr "Ziel" -#: c3nav/mapdata/models/report.py:72 +#: c3nav/mapdata/models/report.py:77 msgid "route options" msgstr "Routenoptionen" -#: c3nav/mapdata/models/report.py:74 +#: c3nav/mapdata/models/report.py:79 msgid "new location title" msgstr "Neuer Ortstitel" -#: c3nav/mapdata/models/report.py:75 +#: c3nav/mapdata/models/report.py:80 msgid "you have to supply a title in at least one language" msgstr "Du musst einen Titel in mindestens einer Sprache angeben" -#: c3nav/mapdata/models/report.py:76 +#: c3nav/mapdata/models/report.py:81 msgid "location groups" msgstr "Ortgruppen" -#: c3nav/mapdata/models/report.py:78 +#: c3nav/mapdata/models/report.py:83 msgid "select all groups that apply, if any" msgstr "" -#: c3nav/mapdata/models/report.py:86 -#: c3nav/site/templates/site/report_detail.html:6 +#: c3nav/mapdata/models/report.py:91 +#: c3nav/site/templates/site/report_detail.html:7 msgid "Report" msgstr "Meldung" -#: c3nav/mapdata/models/report.py:87 +#: c3nav/mapdata/models/report.py:92 msgid "Reports" msgstr "Meldungen" -#: c3nav/mapdata/models/report.py:114 +#: c3nav/mapdata/models/report.py:155 msgid "public" msgstr "öffentlich" -#: c3nav/mapdata/models/report.py:117 +#: c3nav/mapdata/models/report.py:158 msgid "Report update" msgstr "Meldungsupdate" -#: c3nav/mapdata/models/report.py:118 +#: c3nav/mapdata/models/report.py:159 msgid "Report updates" msgstr "Meldungsupdates" @@ -2762,6 +2778,14 @@ msgstr "Du bist angemeldet als %(username)s." msgid "You can access the control panel." msgstr "Du kannst das Control Panel betreten." +#: c3nav/site/templates/site/account.html:29 +msgid "You can review reports" +msgstr "Du kannst Meldungen überprüfen" + +#: c3nav/site/templates/site/account.html:32 +msgid "Show reports" +msgstr "Meldungen anzeigen" + #: c3nav/site/templates/site/fragment_report_meta.html:3 msgid "You are reporting an issue with the following location:" msgstr "Du meldest einen Fehler beim folgenden Ort:" @@ -2898,22 +2922,43 @@ msgstr "in c3nav öffnen" msgid "Submit" msgstr "Absenden" -#: c3nav/site/templates/site/report_detail.html:11 +#: c3nav/site/templates/site/report_detail.html:12 +#: c3nav/site/templates/site/report_list.html:30 msgid "closed" msgstr "geschlossen" -#: c3nav/site/templates/site/report_detail.html:15 -msgid "anonymous submission" -msgstr "anonyme Meldung" - -#: c3nav/site/templates/site/report_detail.html:17 +#: c3nav/site/templates/site/report_detail.html:16 msgid "by" msgstr "von" +#: c3nav/site/templates/site/report_detail.html:18 +msgid "anonymous submission" +msgstr "anonyme Meldung" + #: c3nav/site/templates/site/report_detail.html:35 msgid "(none)" msgstr "(keine)" +#: c3nav/site/templates/site/report_list.html:8 +msgid "Open reports" +msgstr "Offene Meldungen" + +#: c3nav/site/templates/site/report_list.html:9 +msgid "show all reports" +msgstr "alle Meldungen anzeigen" + +#: c3nav/site/templates/site/report_list.html:11 +msgid "All reports" +msgstr "Alle Meldungen" + +#: c3nav/site/templates/site/report_list.html:12 +msgid "show open reports" +msgstr "offene Meldungen anzeigen" + +#: c3nav/site/templates/site/report_list.html:20 +msgid "State" +msgstr "Status" + #: c3nav/site/views.py:76 c3nav/site/views.py:323 msgid "You need to log in to unlock areas." msgstr "Du musst dich anmelden um Bereiche freizuschalten." @@ -2945,7 +2990,7 @@ msgstr[1] "Du wurdest eingeladen, die folgenden Bereiche freizuschalten:" #: c3nav/site/views.py:408 msgid "Your report was submitted." -msgstr "Deine Meldiung wurde abgesendet." +msgstr "Deine Meldung wurde abgesendet." #: c3nav/site/views.py:411 msgid "You can keep track of it from your user dashboard." diff --git a/src/c3nav/site/templates/site/account.html b/src/c3nav/site/templates/site/account.html index 64c481ff..e72267c3 100644 --- a/src/c3nav/site/templates/site/account.html +++ b/src/c3nav/site/templates/site/account.html @@ -23,6 +23,16 @@

{% endif %} + {% if request.user_permissions.can_review_reports %} +
+

+ {% trans 'You can review reports' %} +

+

+ {% trans 'Show reports' %} +

+ {% endif %} +

{% trans 'Log out' %} diff --git a/src/c3nav/site/templates/site/fragment_pagination.html b/src/c3nav/site/templates/site/fragment_pagination.html new file mode 100644 index 00000000..c27058cb --- /dev/null +++ b/src/c3nav/site/templates/site/fragment_pagination.html @@ -0,0 +1,22 @@ +{% load i18n %} +

+ {% if objects.has_previous %} + + « {% trans 'first' %} + · + + ‹ {% trans 'previous' %} + · + {% endif %} + {% with page_number=objects.number num_pages=objects.paginator.num_pages %} + {% blocktrans %}Page {{ page_number }} of {{ num_pages }}{% endblocktrans %} + {% endwith %} + {% if objects.has_next %} + · + {% trans 'next' %} › + + · + {% trans 'last' %} » + + {% endif %} +

diff --git a/src/c3nav/site/templates/site/report_list.html b/src/c3nav/site/templates/site/report_list.html new file mode 100644 index 00000000..c0495abf --- /dev/null +++ b/src/c3nav/site/templates/site/report_list.html @@ -0,0 +1,38 @@ +{% extends 'site/base.html' %} +{% load i18n %} + +{% block content %} +
+ {% include 'site/fragment_messages.html' %} + {% if filter == 'open' %} +

{% trans 'Open reports' %}

+

{% trans 'show all reports' %}

+ {% else %} +

{% trans 'All reports' %}

+

{% trans 'show open reports' %}

+ {% endif %} + + {% include 'site/fragment_pagination.html' with objects=reports %} + + + + + + + {% for report in reports %} + + + + + + {% endfor %} +
{% trans 'ID' %}{% trans 'Title' %}{% trans 'State' %}
{{ report.pk }}{{ report.title }} + {% if report.open %} + {% trans 'open' %} + {% else %} + {% trans 'closed' %} + {% endif %} +
+ {% include 'site/fragment_pagination.html' with objects=reports %} +
+{% endblock %} diff --git a/src/c3nav/site/urls.py b/src/c3nav/site/urls.py index 529bb36e..1a367969 100644 --- a/src/c3nav/site/urls.py +++ b/src/c3nav/site/urls.py @@ -1,7 +1,8 @@ from django.conf.urls import url from c3nav.site.views import (about_view, access_redeem_view, account_view, change_password_view, choose_language, - login_view, logout_view, map_index, qr_code, register_view, report_create, report_detail) + login_view, logout_view, map_index, qr_code, register_view, report_create, report_detail, + report_list) slug = r'(?P[a-z0-9-_.:]+)' coordinates = r'(?P[a-z0-9-_:]+:-?\d+(\.\d+)?:-?\d+(\.\d+)?)' @@ -26,9 +27,9 @@ urlpatterns = [ url(r'^access/(?P[^/]+)$', access_redeem_view, name='site.access.redeem'), url(r'^lang/$', choose_language, name='site.language'), url(r'^about/$', about_view, name='site.about'), - url(r'^report/$', about_view, name='site.about'), - url(r'^report/(?P\d+)/$', report_detail, name='site.report_detail'), - url(r'^report/(?P\d+)/(?P[^/]+)/$', report_detail, name='site.report_detail'), + url(r'^reports/(?P(open|all))/$', report_list, name='site.report_list'), + url(r'^reports/(?P\d+)/$', report_detail, name='site.report_detail'), + url(r'^reports/(?P\d+)/(?P[^/]+)/$', report_detail, name='site.report_detail'), url(r'^report/l/%s/$' % coordinates, report_create, name='site.report_create'), url(r'^report/l/(?P\d+)/$', report_create, name='site.report_create'), url(r'^report/r/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/$', diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index 4fbfacda..936eddef 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -10,6 +10,7 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm, UserCreationForm from django.contrib.auth.views import redirect_to_login from django.core.exceptions import ObjectDoesNotExist, SuspiciousOperation +from django.core.paginator import Paginator from django.core.serializers.json import DjangoJSONEncoder from django.db import transaction from django.http import Http404, HttpResponse, HttpResponseBadRequest @@ -423,6 +424,22 @@ def report_create(request, coordinates=None, location=None, origin=None, destina }) +def report_list(request, filter): + page = request.GET.get('page', 1) + + queryset = Report.qs_for_request(request).order_by('-created').select_related('author') + if filter == 'open': + queryset.filter(open=True) + + paginator = Paginator(queryset, 20) + reports = paginator.page(page) + + return render(request, 'site/report_list.html', { + 'filter': filter, + 'reports': reports, + }) + + def report_detail(request, pk, secret=None): if secret: qs = Report.objects.filter(secret=secret)