diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index 84489d34..6a4c9668 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -39,7 +39,13 @@ class EditorFormBase(I18nModelFormMixin, ModelForm): if not creating: self.initial['geometry'] = json.dumps(mapping(self.instance.geometry), separators=(',', ':')) - if 'groups' in self.fields: + if self._meta.model.__name__ == 'AccessRestriction': + AccessRestrictionGroup = self.request.changeset.wrap_model('AccessRestrictionGroup') + + self.fields['groups'].label_from_instance = lambda obj: obj.title + self.fields['groups'].queryset = AccessRestrictionGroup.qs_for_request(self.request) + + elif 'groups' in self.fields: LocationGroupCategory = self.request.changeset.wrap_model('LocationGroupCategory') kwargs = {'allow_'+self._meta.model._meta.default_related_name: True} diff --git a/src/c3nav/editor/urls.py b/src/c3nav/editor/urls.py index bdc806ad..9a0c1820 100644 --- a/src/c3nav/editor/urls.py +++ b/src/c3nav/editor/urls.py @@ -52,6 +52,7 @@ urlpatterns.extend(add_editor_urls('LocationGroupCategory')) urlpatterns.extend(add_editor_urls('LocationGroup')) urlpatterns.extend(add_editor_urls('WayType')) urlpatterns.extend(add_editor_urls('AccessRestriction')) +urlpatterns.extend(add_editor_urls('AccessRestrictionGroup')) urlpatterns.extend(add_editor_urls('Source')) urlpatterns.extend(add_editor_urls('Building', 'Level')) urlpatterns.extend(add_editor_urls('Space', 'Level', explicit_edit=True)) diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index adf6d244..52cde339 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -45,6 +45,7 @@ def main_index(request): child_model(request, 'LocationGroup'), child_model(request, 'WayType'), child_model(request, 'AccessRestriction'), + child_model(request, 'AccessRestrictionGroup'), child_model(request, 'Source'), ], }) diff --git a/src/c3nav/locale/de/LC_MESSAGES/django.po b/src/c3nav/locale/de/LC_MESSAGES/django.po index 875f1610..669f5482 100644 --- a/src/c3nav/locale/de/LC_MESSAGES/django.po +++ b/src/c3nav/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-12-20 17:40+0100\n" -"PO-Revision-Date: 2017-12-20 17:43+0100\n" +"POT-Creation-Date: 2017-12-20 20:53+0100\n" +"PO-Revision-Date: 2017-12-20 20:53+0100\n" "Last-Translator: Laura Klünder \n" "Language-Team: \n" "Language: de\n" @@ -39,11 +39,11 @@ msgstr[1] "alles mögliche (%d Erlaubnisse)" #: c3nav/control/forms.py:69 c3nav/control/templates/control/access.html:4 #: c3nav/control/templates/control/user.html:59 -#: c3nav/mapdata/models/access.py:124 +#: c3nav/mapdata/models/access.py:146 msgid "Access Permissions" msgstr "Zugangserlaubnisse" -#: c3nav/control/forms.py:78 c3nav/control/templates/control/user.html:80 +#: c3nav/control/forms.py:78 c3nav/control/templates/control/user.html:82 msgid "never" msgstr "nie" @@ -152,7 +152,7 @@ msgstr "Benutzer" #: c3nav/control/templates/control/announcements.html:9 #: c3nav/control/templates/control/users.html:15 -#: c3nav/mapdata/models/base.py:40 c3nav/mapdata/utils/locations.py:281 +#: c3nav/mapdata/models/base.py:40 c3nav/mapdata/utils/locations.py:299 msgid "ID" msgstr "ID" @@ -162,7 +162,7 @@ msgid "Text" msgstr "Text" #: c3nav/control/templates/control/announcements.html:11 -#: c3nav/editor/models/changeset.py:47 c3nav/mapdata/models/access.py:117 +#: c3nav/editor/models/changeset.py:47 c3nav/mapdata/models/access.py:139 msgid "Author" msgstr "Autor" @@ -247,7 +247,7 @@ msgid "General Permissions" msgstr "Generelle Befugnisse" #: c3nav/control/templates/control/user.html:24 -#: c3nav/control/templates/control/user.html:91 +#: c3nav/control/templates/control/user.html:93 msgid "none" msgstr "keine" @@ -287,55 +287,55 @@ msgstr "API Secret generieren" msgid "Update API secret" msgstr "API Secret updaten" -#: c3nav/control/templates/control/user.html:65 -#: c3nav/mapdata/models/access.py:26 c3nav/mapdata/models/access.py:187 -#: c3nav/mapdata/models/access.py:200 +#: c3nav/control/templates/control/user.html:60 +msgid "Add" +msgstr "Hinzufügen" + +#: c3nav/control/templates/control/user.html:67 +#: c3nav/mapdata/models/access.py:27 c3nav/mapdata/models/access.py:209 +#: c3nav/mapdata/models/access.py:222 msgid "Access Restriction" msgstr "Zugangs­beschränkung" -#: c3nav/control/templates/control/user.html:66 -#: c3nav/mapdata/models/access.py:52 c3nav/mapdata/models/geometry/space.py:297 +#: c3nav/control/templates/control/user.html:68 +#: c3nav/mapdata/models/access.py:74 c3nav/mapdata/models/geometry/space.py:301 #: c3nav/site/models.py:15 msgid "author" msgstr "Autor" -#: c3nav/control/templates/control/user.html:67 -#: c3nav/mapdata/models/access.py:114 +#: c3nav/control/templates/control/user.html:69 +#: c3nav/mapdata/models/access.py:136 msgid "expires" msgstr "läuft ab" -#: c3nav/control/templates/control/user.html:68 -#: c3nav/mapdata/models/access.py:57 c3nav/mapdata/models/access.py:115 +#: c3nav/control/templates/control/user.html:70 +#: c3nav/mapdata/models/access.py:79 c3nav/mapdata/models/access.py:137 msgid "can grant" msgstr "kann erteilen" -#: c3nav/control/templates/control/user.html:69 +#: c3nav/control/templates/control/user.html:71 msgid "key" msgstr "key" -#: c3nav/control/templates/control/user.html:81 +#: c3nav/control/templates/control/user.html:83 #: c3nav/mapdata/models/geometry/level.py:124 #: c3nav/mapdata/models/locations.py:102 c3nav/mapdata/models/locations.py:103 msgid "Yes" msgstr "Ja" -#: c3nav/control/templates/control/user.html:81 +#: c3nav/control/templates/control/user.html:83 #: c3nav/mapdata/models/geometry/level.py:124 #: c3nav/mapdata/models/locations.py:102 c3nav/mapdata/models/locations.py:103 msgid "No" msgstr "Nein" -#: c3nav/control/templates/control/user.html:84 +#: c3nav/control/templates/control/user.html:86 #: 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:93 -msgid "Add" -msgstr "Hinzufügen" - #: c3nav/control/templates/control/users.html:8 msgid "Search" msgstr "Suchen" @@ -397,33 +397,33 @@ msgstr "Token erfolgreich invalidiert." msgid "You can only display your most recently created token." msgstr "Du kannst nur deinen zuletzt erstellten Code anzeigen." -#: c3nav/editor/forms.py:118 +#: c3nav/editor/forms.py:124 msgid "Redirecting Slugs (comma seperated)" msgstr "Umleitungs-Slugs (mit Komma getrennt)" -#: c3nav/editor/forms.py:144 +#: c3nav/editor/forms.py:150 #, python-format msgid "Can not add redirecting slug “%s”: it's the slug of this object." msgstr "" "Umleitungs-Slug „%s“ kann nicht hinzugefügt werden: Es ist der Slug dieses " "Objects." -#: c3nav/editor/forms.py:151 +#: c3nav/editor/forms.py:157 #, python-format msgid "Can not add redirecting slug “%s”: it is already used elsewhere." msgstr "" "Umleitungs-Slug „%s“ kann nicht hinzugefügt werden: Er wird bereits an " "anderer Stelle verwendet." -#: c3nav/editor/forms.py:203 +#: c3nav/editor/forms.py:209 msgid "Final rejection" msgstr "Endgültige Ablehnung" -#: c3nav/editor/forms.py:211 +#: c3nav/editor/forms.py:217 msgid "create one way edges" msgstr "Kante nur in eine Richtung erstellen" -#: c3nav/editor/forms.py:212 +#: c3nav/editor/forms.py:218 msgid "activate next node after connecting" msgstr "nächsten Knoten nach dem Verbinden aktivieren" @@ -506,7 +506,7 @@ msgstr "letzte Statusänderung" #: c3nav/editor/models/changeset.py:48 c3nav/mapdata/models/base.py:50 #: c3nav/mapdata/models/graph.py:34 c3nav/mapdata/models/locations.py:183 -#: c3nav/mapdata/utils/locations.py:316 +#: c3nav/mapdata/utils/locations.py:334 msgid "Title" msgstr "Titel" @@ -827,12 +827,12 @@ msgstr "Einstellungen für neue Kanten" #: c3nav/editor/templates/editor/index.html:10 #: c3nav/editor/templates/editor/level.html:16 #: c3nav/mapdata/models/geometry/level.py:55 c3nav/mapdata/models/level.py:29 -#: c3nav/mapdata/utils/locations.py:283 +#: c3nav/mapdata/utils/locations.py:301 msgid "Level" msgstr "Etage" #: c3nav/editor/templates/editor/level.html:22 -#: c3nav/editor/templates/editor/space.html:14 c3nav/editor/views/edit.py:411 +#: c3nav/editor/templates/editor/space.html:14 c3nav/editor/views/edit.py:412 msgid "back to overview" msgstr "zurück zur Übersicht" @@ -858,8 +858,8 @@ msgstr "Details anzeigen" #: c3nav/editor/templates/editor/space.html:9 #: c3nav/mapdata/models/geometry/level.py:110 -#: c3nav/mapdata/models/geometry/space.py:66 -#: c3nav/mapdata/utils/locations.py:289 +#: c3nav/mapdata/models/geometry/space.py:70 +#: c3nav/mapdata/utils/locations.py:307 msgid "Space" msgstr "Raum" @@ -1068,89 +1068,89 @@ msgstr "gelöscht" msgid "You cannot edit this change set." msgstr "Du kannst dieses Änderungsset nicht bearbeiten." -#: c3nav/editor/views/edit.py:221 +#: c3nav/editor/views/edit.py:222 msgid "You can not create new objects because your changeset is full." msgstr "" "Du kannst keine neuen Objekte erstellen weil dein Änderungsset voll ist." -#: c3nav/editor/views/edit.py:224 c3nav/editor/views/edit.py:238 +#: c3nav/editor/views/edit.py:225 c3nav/editor/views/edit.py:239 msgid "You can not edit this object because your changeset is full." msgstr "Du kannst diese Objekt nicht löschen weil dein Änderungsset voll ist." -#: c3nav/editor/views/edit.py:247 +#: c3nav/editor/views/edit.py:248 msgid "" "You can not delete this object because other objects still depend on it." msgstr "" "Du kannst dieses Objekt nicht löschen weil andere Objekte sich darauf " "beziehen." -#: c3nav/editor/views/edit.py:255 c3nav/editor/views/edit.py:298 -#: c3nav/editor/views/edit.py:524 c3nav/editor/views/edit.py:561 -#: c3nav/editor/views/edit.py:579 +#: c3nav/editor/views/edit.py:256 c3nav/editor/views/edit.py:299 +#: c3nav/editor/views/edit.py:525 c3nav/editor/views/edit.py:562 +#: c3nav/editor/views/edit.py:580 msgid "You can not edit changes on this changeset." msgstr "Du kannst keine Änderungen dieses Änderungssets bearbeiten." -#: c3nav/editor/views/edit.py:257 +#: c3nav/editor/views/edit.py:258 msgid "Object was successfully deleted." msgstr "Objekt wurde erfolgreich gelöscht." -#: c3nav/editor/views/edit.py:295 +#: c3nav/editor/views/edit.py:296 msgid "Object was successfully saved." msgstr "Objekt wurde erfolgreich gespeichert." -#: c3nav/editor/views/edit.py:366 c3nav/editor/views/edit.py:482 +#: c3nav/editor/views/edit.py:367 c3nav/editor/views/edit.py:483 msgid "back to level" msgstr "zurück zur Etage" -#: c3nav/editor/views/edit.py:405 c3nav/editor/views/edit.py:496 +#: c3nav/editor/views/edit.py:406 c3nav/editor/views/edit.py:497 msgid "back to space" msgstr "zurück zum Raum" -#: c3nav/editor/views/edit.py:443 +#: c3nav/editor/views/edit.py:444 msgid "Could not edit edge because your changeset is full." msgstr "Kante konnte nicht bearbeitet werden weil dein Änderungsset voll ist." -#: c3nav/editor/views/edit.py:450 +#: c3nav/editor/views/edit.py:451 msgid "Reverse edge created." msgstr "Umgekehrte Kante erstellt." -#: c3nav/editor/views/edit.py:450 +#: c3nav/editor/views/edit.py:451 msgid "Edge created." msgstr "Kante erstellt." -#: c3nav/editor/views/edit.py:453 +#: c3nav/editor/views/edit.py:454 msgid "Reverse edge deleted." msgstr "Umgekehrte Kante gelöscht." -#: c3nav/editor/views/edit.py:453 +#: c3nav/editor/views/edit.py:454 msgid "Edge deleted." msgstr "Kante gelöscht." -#: c3nav/editor/views/edit.py:458 +#: c3nav/editor/views/edit.py:459 msgid "Reverse edge overwritten." msgstr "Umgekehrte Kante überschrieben." -#: c3nav/editor/views/edit.py:458 +#: c3nav/editor/views/edit.py:459 msgid "Edge overwritten." msgstr "Kante überschrieben." -#: c3nav/editor/views/edit.py:498 +#: c3nav/editor/views/edit.py:499 msgid "to level graph" msgstr "zum Etagengraph" -#: c3nav/editor/views/edit.py:514 +#: c3nav/editor/views/edit.py:515 msgid "You can not delete this graph node because your changeset is full." msgstr "Du kannst diesen Knoten nicht löschen weil dein Änderungsset voll ist." -#: c3nav/editor/views/edit.py:526 +#: c3nav/editor/views/edit.py:527 msgid "Graph Node was successfully deleted." msgstr "Graphknoten wurde erfolgreich gelöscht." -#: c3nav/editor/views/edit.py:567 +#: c3nav/editor/views/edit.py:568 msgid "You can not add graph nodes because your changeset is full." msgstr "Du kannst keine Graphknoten erstellen weil dein Änderungsset voll ist." -#: c3nav/editor/views/edit.py:574 +#: c3nav/editor/views/edit.py:575 msgid "New graph node created." msgstr "Neuer Graphknoten erstellt." @@ -1268,50 +1268,62 @@ msgstr "Zoomfaktor (von 1 bis 32), nur relevant für Bildrenderer" msgid "open" msgstr "öffnen" -#: c3nav/mapdata/models/access.py:27 +#: c3nav/mapdata/models/access.py:24 +msgid "Groups" +msgstr "Gruppen" + +#: c3nav/mapdata/models/access.py:28 msgid "Access Restrictions" msgstr "Zugangs­beschränkungen" -#: c3nav/mapdata/models/access.py:54 +#: c3nav/mapdata/models/access.py:47 +msgid "Access Restriction Group" +msgstr "Zugangsbeschränkungsgruppe" + +#: c3nav/mapdata/models/access.py:48 +msgid "Access Restriction Groups" +msgstr "Zugangsbeschränkungsgruppen" + +#: c3nav/mapdata/models/access.py:76 msgid "valid until" msgstr "gültig bis" -#: c3nav/mapdata/models/access.py:55 +#: c3nav/mapdata/models/access.py:77 msgid "unlimited" msgstr "unbeschränkt" -#: c3nav/mapdata/models/access.py:56 +#: c3nav/mapdata/models/access.py:78 msgid "redeemed" msgstr "eingelöst" -#: c3nav/mapdata/models/access.py:58 c3nav/mapdata/models/access.py:118 +#: c3nav/mapdata/models/access.py:80 c3nav/mapdata/models/access.py:140 msgid "unique key" msgstr "unique key" -#: c3nav/mapdata/models/access.py:62 +#: c3nav/mapdata/models/access.py:84 msgid "Access Permission Token" msgstr "Zugangserlaubnis-Token" -#: c3nav/mapdata/models/access.py:63 +#: c3nav/mapdata/models/access.py:85 msgid "Access Permission Tokens" msgstr "Zugangserlaubnis-Token" -#: c3nav/mapdata/models/access.py:108 c3nav/site/views.py:77 +#: c3nav/mapdata/models/access.py:130 c3nav/site/views.py:77 #: c3nav/site/views.py:298 msgid "Area successfully unlocked." msgid_plural "Areas successfully unlocked." msgstr[0] "Bereich erfolgreich freigeschaltet." msgstr[1] "Bereiche erfolgreich freigeschaltet." -#: c3nav/mapdata/models/access.py:120 +#: c3nav/mapdata/models/access.py:142 msgid "Access permission token" msgstr "Zugangserlaubnis-Token" -#: c3nav/mapdata/models/access.py:123 +#: c3nav/mapdata/models/access.py:145 msgid "Access Permission" msgstr "Zugangserlaubnis" -#: c3nav/mapdata/models/base.py:39 c3nav/mapdata/utils/locations.py:280 +#: c3nav/mapdata/models/base.py:39 c3nav/mapdata/utils/locations.py:298 msgid "Type" msgstr "Typ" @@ -1355,8 +1367,8 @@ msgstr "Gebäude" #: c3nav/mapdata/models/geometry/level.py:105 #: c3nav/mapdata/models/geometry/level.py:123 -#: c3nav/mapdata/models/geometry/space.py:147 -#: c3nav/mapdata/models/geometry/space.py:167 +#: c3nav/mapdata/models/geometry/space.py:151 +#: c3nav/mapdata/models/geometry/space.py:171 msgid "height" msgstr "Höhe" @@ -1381,7 +1393,7 @@ msgid "Doors" msgstr "Türen" #: c3nav/mapdata/models/geometry/level.py:147 -#: c3nav/mapdata/models/geometry/space.py:234 +#: c3nav/mapdata/models/geometry/space.py:238 msgid "altitude" msgstr "Bodenhöhe" @@ -1419,142 +1431,142 @@ msgstr "" "%(num_modified)d geändert, %(num_deleted)d entfernt, %(num_created)d " "erstellt." -#: c3nav/mapdata/models/geometry/space.py:20 -#: c3nav/mapdata/models/geometry/space.py:250 -#: c3nav/mapdata/models/geometry/space.py:272 +#: c3nav/mapdata/models/geometry/space.py:21 +#: c3nav/mapdata/models/geometry/space.py:254 +#: c3nav/mapdata/models/geometry/space.py:276 msgid "space" msgstr "Raum" -#: c3nav/mapdata/models/geometry/space.py:46 +#: c3nav/mapdata/models/geometry/space.py:50 #, python-brace-format msgid "{category}, {space}, {level}" msgstr "{category}, {space}, {level}" -#: c3nav/mapdata/models/geometry/space.py:50 +#: c3nav/mapdata/models/geometry/space.py:54 #, python-brace-format msgid "{category}, {space}" msgstr "{category}, {space}" -#: c3nav/mapdata/models/geometry/space.py:92 +#: c3nav/mapdata/models/geometry/space.py:96 msgid "Column" msgstr "Säule" -#: c3nav/mapdata/models/geometry/space.py:93 +#: c3nav/mapdata/models/geometry/space.py:97 msgid "Columns" msgstr "Säulen" -#: c3nav/mapdata/models/geometry/space.py:104 +#: c3nav/mapdata/models/geometry/space.py:108 msgid "Area" msgstr "Bereich" -#: c3nav/mapdata/models/geometry/space.py:105 -#: c3nav/mapdata/utils/locations.py:295 +#: c3nav/mapdata/models/geometry/space.py:109 +#: c3nav/mapdata/utils/locations.py:313 msgid "Areas" msgstr "Bereiche" -#: c3nav/mapdata/models/geometry/space.py:125 +#: c3nav/mapdata/models/geometry/space.py:129 msgid "Stair" msgstr "Stufe" -#: c3nav/mapdata/models/geometry/space.py:126 +#: c3nav/mapdata/models/geometry/space.py:130 msgid "Stairs" msgstr "Stufen" -#: c3nav/mapdata/models/geometry/space.py:137 +#: c3nav/mapdata/models/geometry/space.py:141 msgid "Ramp" msgstr "Rampe" -#: c3nav/mapdata/models/geometry/space.py:138 +#: c3nav/mapdata/models/geometry/space.py:142 msgid "Ramps" msgstr "Rampen" -#: c3nav/mapdata/models/geometry/space.py:151 +#: c3nav/mapdata/models/geometry/space.py:155 msgid "Obstacle" msgstr "Hindernis" -#: c3nav/mapdata/models/geometry/space.py:152 +#: c3nav/mapdata/models/geometry/space.py:156 msgid "Obstacles" msgstr "Hindernisse" -#: c3nav/mapdata/models/geometry/space.py:166 +#: c3nav/mapdata/models/geometry/space.py:170 msgid "width" msgstr "Breite" -#: c3nav/mapdata/models/geometry/space.py:171 +#: c3nav/mapdata/models/geometry/space.py:175 msgid "Line Obstacle" msgstr "Linienhindernis" -#: c3nav/mapdata/models/geometry/space.py:172 +#: c3nav/mapdata/models/geometry/space.py:176 msgid "Line Obstacles" msgstr "Linienhindernisse" -#: c3nav/mapdata/models/geometry/space.py:207 +#: c3nav/mapdata/models/geometry/space.py:211 msgid "Point of Interest" msgstr "Ort von Interesse" -#: c3nav/mapdata/models/geometry/space.py:208 +#: c3nav/mapdata/models/geometry/space.py:212 msgid "Points of Interest" msgstr "Orte von Interesse" -#: c3nav/mapdata/models/geometry/space.py:224 +#: c3nav/mapdata/models/geometry/space.py:228 msgid "Hole" msgstr "Loch" -#: c3nav/mapdata/models/geometry/space.py:225 +#: c3nav/mapdata/models/geometry/space.py:229 msgid "Holes" msgstr "Löcher" -#: c3nav/mapdata/models/geometry/space.py:237 +#: c3nav/mapdata/models/geometry/space.py:241 msgid "Altitude Marker" msgstr "Höhenmarker" -#: c3nav/mapdata/models/geometry/space.py:238 +#: c3nav/mapdata/models/geometry/space.py:242 msgid "Altitude Markers" msgstr "Höhenmarker" -#: c3nav/mapdata/models/geometry/space.py:251 -#: c3nav/mapdata/models/geometry/space.py:275 +#: c3nav/mapdata/models/geometry/space.py:255 +#: c3nav/mapdata/models/geometry/space.py:279 msgid "target space" msgstr "Zielraum" -#: c3nav/mapdata/models/geometry/space.py:253 -#: c3nav/mapdata/models/geometry/space.py:277 c3nav/mapdata/models/graph.py:44 +#: c3nav/mapdata/models/geometry/space.py:257 +#: c3nav/mapdata/models/geometry/space.py:281 c3nav/mapdata/models/graph.py:44 msgid "description" msgstr "Beschreibung" -#: c3nav/mapdata/models/geometry/space.py:256 +#: c3nav/mapdata/models/geometry/space.py:260 msgid "Leave description" msgstr "Verlassensbeschreibung" -#: c3nav/mapdata/models/geometry/space.py:257 +#: c3nav/mapdata/models/geometry/space.py:261 msgid "Leave descriptions" msgstr "Verlassensbeschreibungen" -#: c3nav/mapdata/models/geometry/space.py:273 +#: c3nav/mapdata/models/geometry/space.py:277 msgid "origin space" msgstr "Ursprungsraum" -#: c3nav/mapdata/models/geometry/space.py:280 +#: c3nav/mapdata/models/geometry/space.py:284 msgid "Cross description" msgstr "Durchschreitungsbeschreibung" -#: c3nav/mapdata/models/geometry/space.py:281 +#: c3nav/mapdata/models/geometry/space.py:285 msgid "Cross descriptions" msgstr "Durchschreitungsbeschreibungen" -#: c3nav/mapdata/models/geometry/space.py:298 +#: c3nav/mapdata/models/geometry/space.py:302 msgid "comment" msgstr "Kommentar" -#: c3nav/mapdata/models/geometry/space.py:299 +#: c3nav/mapdata/models/geometry/space.py:303 msgid "Measurement list" msgstr "Messungsliste" -#: c3nav/mapdata/models/geometry/space.py:302 +#: c3nav/mapdata/models/geometry/space.py:306 msgid "Wi-Fi Measurement" msgstr "WLAN Messung" -#: c3nav/mapdata/models/geometry/space.py:303 +#: c3nav/mapdata/models/geometry/space.py:307 msgid "Wi-Fi Measurements" msgstr "WLAN Messungen" @@ -1659,7 +1671,7 @@ msgid "default height" msgstr "Standarddeckenhöhe" #: c3nav/mapdata/models/locations.py:45 c3nav/mapdata/models/locations.py:65 -#: c3nav/mapdata/utils/locations.py:282 +#: c3nav/mapdata/utils/locations.py:300 msgid "Slug" msgstr "Slug" @@ -1791,59 +1803,59 @@ msgstr[1] "%d Kartenupdates verarbeitet." msgid "Last processed update: %(date)s (#%(id)d)" msgstr "Letztes verarbeitetes Update: %(date)s (#%(id)d)" -#: c3nav/mapdata/utils/locations.py:280 +#: c3nav/mapdata/utils/locations.py:298 msgid "Coordinates" msgstr "Koordinaten" -#: c3nav/mapdata/utils/locations.py:301 +#: c3nav/mapdata/utils/locations.py:319 msgid "Near Area" msgstr "Naher Bereich" -#: c3nav/mapdata/utils/locations.py:307 +#: c3nav/mapdata/utils/locations.py:325 msgid "Near POI" msgstr "Naher POI" -#: c3nav/mapdata/utils/locations.py:313 +#: c3nav/mapdata/utils/locations.py:331 msgid "X Coordinate" msgstr "X-Koordinate" -#: c3nav/mapdata/utils/locations.py:314 +#: c3nav/mapdata/utils/locations.py:332 msgid "Y Coordinate" msgstr "Y-Koordinate" -#: c3nav/mapdata/utils/locations.py:315 +#: c3nav/mapdata/utils/locations.py:333 msgid "Altitude" msgstr "Höhe" -#: c3nav/mapdata/utils/locations.py:317 +#: c3nav/mapdata/utils/locations.py:335 msgid "Subtitle" msgstr "Untertitel" -#: c3nav/mapdata/utils/locations.py:349 +#: c3nav/mapdata/utils/locations.py:367 msgid "Point" msgstr "Punkt" -#: c3nav/mapdata/utils/locations.py:356 +#: c3nav/mapdata/utils/locations.py:374 #, python-format msgid "Point near %(poi)s" msgstr "Punkt nahe %(poi)s" -#: c3nav/mapdata/utils/locations.py:360 +#: c3nav/mapdata/utils/locations.py:378 #, python-format msgid "near %(area)s" msgstr "nahe %(area)s" -#: c3nav/mapdata/utils/locations.py:362 +#: c3nav/mapdata/utils/locations.py:380 #, python-format msgid "Point in %(area)s" msgstr "Punkt innerhalb %(area)s" -#: c3nav/mapdata/utils/locations.py:366 +#: c3nav/mapdata/utils/locations.py:384 #, python-format msgid "Point near %(area)s" msgstr "Punkt nahe %(area)s" -#: c3nav/mapdata/utils/locations.py:368 +#: c3nav/mapdata/utils/locations.py:386 #, python-format msgid "Point in %(space)s" msgstr "Punkt innerhalb %(space)s" diff --git a/src/c3nav/mapdata/migrations/0065_access_restriction_group.py b/src/c3nav/mapdata/migrations/0065_access_restriction_group.py new file mode 100644 index 00000000..b957b766 --- /dev/null +++ b/src/c3nav/mapdata/migrations/0065_access_restriction_group.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2017-12-20 19:44 +from __future__ import unicode_literals + +import c3nav.mapdata.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mapdata', '0064_access_permission_unique_key'), + ] + + operations = [ + migrations.CreateModel( + name='AccessRestrictionGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', c3nav.mapdata.fields.I18nField(blank=True, fallback_any=True, fallback_value='{model} {pk}', plural_name='titles', verbose_name='Title')), + ], + options={ + 'verbose_name': 'Access Restriction Group', + 'verbose_name_plural': 'Access Restriction Groups', + 'default_related_name': 'accessrestrictiongroups', + }, + ), + migrations.AddField( + model_name='accessrestriction', + name='groups', + field=models.ManyToManyField(blank=True, related_name='accessrestrictions', to='mapdata.AccessRestrictionGroup', verbose_name='Groups'), + ), + ] diff --git a/src/c3nav/mapdata/models/access.py b/src/c3nav/mapdata/models/access.py index 05878a99..ad25cfa9 100644 --- a/src/c3nav/mapdata/models/access.py +++ b/src/c3nav/mapdata/models/access.py @@ -21,6 +21,7 @@ class AccessRestriction(TitledMixin, models.Model): An access restriction """ open = models.BooleanField(default=False, verbose_name=_('open')) + groups = models.ManyToManyField('mapdata.AccessRestrictionGroup', verbose_name=_('Groups'), blank=True) class Meta: verbose_name = _('Access Restriction') @@ -38,6 +39,27 @@ class AccessRestriction(TitledMixin, models.Model): return Q(pk__in=AccessPermission.get_for_request(request)) +class AccessRestrictionGroup(TitledMixin, models.Model): + """ + An access restriction group + """ + class Meta: + verbose_name = _('Access Restriction Group') + verbose_name_plural = _('Access Restriction Groups') + default_related_name = 'accessrestrictiongroups' + + @classmethod + def qs_for_request(cls, request): + return cls.objects.filter(cls.q_for_request(request)) + + @classmethod + def q_for_request(cls, request): + if request.user.is_authenticated and request.user.is_superuser: + return Q() + permissions = AccessPermission.get_for_request(request) + return Q(Q(accessrestrictions=None) | Q(accessrestrictions__pk__in=permissions)) + + def default_valid_until(): return timezone.now()+timedelta(seconds=20)