diff --git a/.env b/.env index e544b5b3..25754a90 100644 --- a/.env +++ b/.env @@ -1,4 +1,42 @@ ENVIRONMENT=development DJANGO_SECRET_KEY=secret_key -ALLOWED_HOSTS=* + +DEV_SOCKET_PORT=9003 + +POSTGRES_DB=project +POSTGRES_USER=user +POSTGRES_PASSWORD=insecure + +DATABASE_NAME=project +DATABASE_USER=user +DATABASE_PASSWORD=insecure +DATABASE_HOST_OVERRIDE=database +DATABASE_PORT_OVERRIDE=5432 + +DJANGO_SUPERUSER_USERNAME=admin +DJANGO_SUPERUSER_EMAIL=admin@admin.com +DJANGO_SUPERUSER_PASSWORD=insecure + +MELDINGEN_URL=http://core.mor.local:8002 +MELDINGEN_TOKEN_API=http://core.mor.local:8002/api-token-auth/ +MELDINGEN_USERNAME=regie_username +MELDINGEN_PASSWORD=insecure + +DJANGO_USER_CORE_USERNAME=core_username +DJANGO_USER_CORE_PASSWORD=insecure + +OIDC_RP_CLIENT_ID=mor-regie +OIDC_RP_CLIENT_SECRET=insecure +OIDC_OP_AUTHORIZATION_ENDPOINT=http://127.0.0.1:5556/auth +OIDC_OP_TOKEN_ENDPOINT=http://dex:5556/token +OIDC_OP_USER_ENDPOINT=http://dex:5556/userinfo +OIDC_OP_JWKS_ENDPOINT=http://dex:5556/keys + + +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres +DATABASE_USERNAME=fusionauth +DATABASE_PASSWORD=hkaLBM3RVnyYeYeqE3WI1w2e4Avpy0Wd5O3s3 +ES_JAVA_OPTS="-Xms512m -Xmx512m" +FUSIONAUTH_APP_MEMORY=512M diff --git a/.env.test b/.env.test index e544b5b3..01e10192 100644 --- a/.env.test +++ b/.env.test @@ -2,3 +2,24 @@ ENVIRONMENT=development DJANGO_SECRET_KEY=secret_key ALLOWED_HOSTS=* + +POSTGRES_DB=project +POSTGRES_USER=user +POSTGRES_PASSWORD=insecure + +DJANGO_SUPERUSER_USERNAME=admin +DJANGO_SUPERUSER_EMAIL=admin@admin.com +DJANGO_SUPERUSER_PASSWORD=insecure + +DATABASE_NAME=project +DATABASE_USER=user +DATABASE_PASSWORD=insecure +DATABASE_HOST_OVERRIDE=database +DATABASE_PORT_OVERRIDE=5432 + +OIDC_RP_CLIENT_ID=mor-regie +OIDC_RP_CLIENT_SECRET=insecure +OIDC_OP_AUTHORIZATION_ENDPOINT=http://127.0.0.1:5556/auth +OIDC_OP_TOKEN_ENDPOINT=http://dex:5556/token +OIDC_OP_USER_ENDPOINT=http://dex:5556/userinfo +OIDC_OP_JWKS_ENDPOINT=http://dex:5556/keys diff --git a/.github/workflows/build-test-docker-images.yaml b/.github/workflows/build-test-docker-images.yaml index 99fd3bf9..43a6420b 100644 --- a/.github/workflows/build-test-docker-images.yaml +++ b/.github/workflows/build-test-docker-images.yaml @@ -20,7 +20,7 @@ jobs: - name: Build Docker images run: docker compose -f docker-compose.test.yaml build - name: Create Docker network - run: docker network create mor_network + run: docker network create regie_network - name: Start images run: docker compose -f docker-compose.test.yaml up -d - name: Run Tests diff --git a/.gitignore b/.gitignore index 4e505f53..8c424a9b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ yarn-error.log *.py[cod] *.pytest_cache* **/webpack-stats.json +**.bash_history +media/**/* +app/*.log diff --git a/LICENCE.MD b/LICENCE.MD new file mode 100644 index 00000000..ce0eff17 --- /dev/null +++ b/LICENCE.MD @@ -0,0 +1,97 @@ +OPENBARE LICENTIE VAN DE EUROPESE UNIE v. 1.2. +EUPL © Europese Unie 2007, 2016 +Deze openbare licentie van de Europese Unie („EUPL”) is van toepassing op het werk (zoals hieronder gedefinieerd) dat onder de voorwaarden van deze licentie wordt verstrekt. Elk gebruik van het werk dat niet door deze licentie is toegestaan, is verboden (voor zover dit gebruik valt onder een recht van de houder van het auteursrecht op het werk). Het werk wordt verstrekt onder de voorwaarden van deze licentie wanneer de licentiegever (zoals hieronder gedefinieerd), direct volgend op de kennisgeving inzake het auteursrecht op het werk, de volgende kennisgeving opneemt: + In licentie gegeven krachtens de EUPL +of op een andere wijze zijn bereidheid te kennen heeft gegeven krachtens de EUPL in licentie te geven. + +1.Definities +In deze licentie wordt verstaan onder: +— „de licentie”:de onderhavige licentie; +— „het oorspronkelijke werk”:het werk dat of de software die door de licentiegever krachtens deze licentie wordt verspreid of medegedeeld, en dat/die beschikbaar is als broncode en, in voorkomend geval, ook als uitvoerbare code; +— „bewerkingen”:de werken of software die de licentiehouder kan creëren op grond van het oorspronkelijke werk of wijzigingen ervan. In deze licentie wordt niet gedefinieerd welke mate van wijziging of afhankelijkheid van het oorspronkelijke werk vereist is om een werk als een bewerking te kunnen aanmerken; dat wordt bepaald conform het auteursrecht dat van toepassing is in de in artikel 15 bedoelde staat; +— „het werk”:het oorspronkelijke werk of de bewerkingen ervan; +— „de broncode”:de voor mensen leesbare vorm van het werk, die het gemakkelijkste door mensen kan worden bestudeerd en gewijzigd; +— „de uitvoerbare code”:elke code die over het algemeen is gecompileerd en is bedoeld om door een computer als een programma te worden uitgevoerd; +— „de licentiegever”:de natuurlijke of rechtspersoon die het werk krachtens de licentie verspreidt of mededeelt; +— „bewerker(s)”:elke natuurlijke of rechtspersoon die het werk krachtens de licentie wijzigt of op een andere wijze bijdraagt tot de totstandkoming van een bewerking; +— „de licentiehouder” of „u”:elke natuurlijke of rechtspersoon die het werk onder de voorwaarden van de licentie gebruikt; — „verspreiding” of „mededeling”:het verkopen, geven, uitlenen, verhuren, verspreiden, mededelen, doorgeven, of op een andere wijze online of offline beschikbaar stellen van kopieën van het werk of het verlenen van toegang tot de essentiële functies ervan ten behoeve van andere natuurlijke of rechtspersonen. + +2.Draagwijdte van de uit hoofde van de licentie verleende rechten +De licentiegever verleent u hierbij een wereldwijde, royaltyvrije, niet-exclusieve, voor een sublicentie in aanmerking komende licentie, om voor de duur van het aan het oorspronkelijke werk verbonden auteursrecht, het volgende te doen: +— het werk in alle omstandigheden en voor ongeacht welk doel te gebruiken; +— het werk te verveelvoudigen; +— het werk te wijzigen en op grond van het werk bewerkingen te ontwikkelen; +— het werk aan het publiek mede te delen, waaronder het recht om het werk of kopieën ervan aan het publiek ter beschikking te stellen of te vertonen, en het werk, in voorkomend geval, in het openbaar uit te voeren; +— het werk of kopieën ervan te verspreiden; +— het werk of kopieën ervan uit te lenen en te verhuren; +— de rechten op het werk of op kopieën ervan in sublicentie te geven. +Deze rechten kunnen worden uitgeoefend met gebruikmaking van alle thans bekende of nog uit te vinden media, dragers en formaten, voor zover het toepasselijke recht dit toestaat. In de landen waar immateriële rechten van toepassing zijn, doet de licentiegever afstand van zijn recht op uitoefening van zijn immateriële rechten in de mate die door het toepasselijke recht wordt toegestaan teneinde een doeltreffende uitoefening van de bovenvermelde in licentie gegeven economische rechten mogelijk te maken. De licentiegever verleent de licentiehouder een royaltyvrij, niet-exclusief gebruiksrecht op alle octrooien van de licentiegever, voor zover dit noodzakelijk is om de uit hoofde van deze licentie verleende rechten op het werk te gebruiken. + +3.Mededeling van de broncode +De licentiegever kan het werk verstrekken in zijn broncode of als uitvoerbare code. Indien het werk als uitvoerbare code wordt verstrekt, verstrekt de licentiegever bij elke door hem verspreide kopie van het werk tevens een machinaal leesbare kopie van de broncode van het werk of geeft hij in een mededeling, volgende op de bij het werk gevoegde auteursrechtelijke kennisgeving, de plaats aan waar de broncode gemakkelijk en vrij toegankelijk is, zolang de licentiegever het werk blijft verspreiden of mededelen. + +4.Beperkingen van het auteursrecht +Geen enkele bepaling in deze licentie heeft ten doel de licentiehouder het recht te ontnemen een beroep te doen op een uitzondering op of een beperking van de exclusieve rechten van de rechthebbenden op het werk, of op de uitputting van die rechten of andere toepasselijke beperkingen daarvan. + +5.Verplichtingen van de licentiehouder +De verlening van de bovenvermelde rechten is onderworpen aan een aantal aan de licentiehouder opgelegde beperkingen en verplichtingen. Het gaat om de onderstaande verplichtingen. + +Attributierecht: de licentiehouder moet alle auteurs-, octrooi- of merkenrechtelijke kennisgevingen onverlet laten alsook alle kennisgevingen die naar de licentie en de afwijzing van garanties verwijzen. De licentiehouder moet een afschrift van deze kennisgevingen en een afschrift van de licentie bij elke kopie van het werk voegen die hij verspreidt of mededeelt. De licentiehouder moet in elke bewerking duidelijk aangeven dat het werk is gewijzigd, en eveneens de datum van wijziging vermelden. + +Copyleftclausule: wanneer de licentiehouder kopieën van het oorspronkelijke werk of bewerkingen verspreidt of mededeelt, geschiedt die verspreiding of mededeling onder de voorwaarden van deze licentie of van een latere versie van deze licentie, tenzij het oorspronkelijke werk uitdrukkelijk alleen onder deze versie van de licentie wordt verspreid — bijvoorbeeld door de mededeling „alleen EUPL v. 1.2”. De licentiehouder (die licentiegever wordt) kan met betrekking tot het werk of de bewerkingen geen aanvullende bepalingen of voorwaarden opleggen of stellen die de voorwaarden van de licentie wijzigen of beperken. + +Verenigbaarheidsclausule: wanneer de licentiehouder bewerkingen of kopieën ervan verspreidt of mededeelt die zijn gebaseerd op het werk en op een ander werk dat uit hoofde van een verenigbare licentie in licentie is gegeven, kan die verspreiding of mededeling geschieden onder de voorwaarden van deze verenigbare licentie. Voor de toepassing van deze clausule wordt onder „verenigbare licentie” verstaan, de licenties die in het aanhangsel bij deze licentie zijn opgesomd. Indien de verplichtingen van de licentiehouder uit hoofde van de verenigbare licentie in strijd zijn met diens verplichtingen uit hoofde van deze licentie, hebben de verplichtingen van de verenigbare licentie voorrang. + +Verstrekking van de broncode: bij de verspreiding of mededeling van kopieën van het werk verstrekt de licentiehouder een machinaal leesbare kopie van de broncode of geeft hij aan waar deze broncode gemakkelijk en vrij toegankelijk is, zolang de licentiehouder het werk blijft verspreiden of mededelen. + +Juridische bescherming: deze licentie verleent geen toestemming om handelsnamen, handelsmerken, dienstmerken of namen van de licentiegever te gebruiken, behalve wanneer dit op grond van een redelijk en normaal gebruik noodzakelijk is om de oorsprong van het werk te beschrijven en de inhoud van de auteursrechtelijke kennisgeving te herhalen. + +6.Auteursketen +De oorspronkelijke licentiegever garandeert dat hij houder is van het hierbij verleende auteursrecht op het oorspronkelijke werk dan wel dat dit hem in licentie is gegeven en dat hij de bevoegdheid heeft de licentie te verlenen. Elke bewerker garandeert dat hij houder is van het auteursrecht op de door hem aan het werk aangebrachte wijzigingen dan wel dat dit hem in licentie is gegeven en dat hij de bevoegdheid heeft de licentie te verlenen. Telkens wanneer u de licentie aanvaardt, verlenen de oorspronkelijke licentiegever en de opeenvolgende bewerkers u een licentie op hun bijdragen aan het werk onder de voorwaarden van deze licentie. + +7.Uitsluiting van garantie +Het werk is een werk in ontwikkeling, dat voortdurend door vele bewerkers wordt verbeterd. Het is een onvoltooid werk, dat bijgevolg nog tekortkomingen of programmeerfouten („bugs”) kan vertonen, die onlosmakelijk verbonden zijn met dit soort ontwikkeling. Om die reden wordt het werk op grond van de licentie verstrekt „zoals het is” en zonder enige garantie met betrekking tot het werk te geven, met inbegrip van, maar niet beperkt tot garanties met betrekking tot de verhandelbaarheid, de geschiktheid voor een specifiek doel, de afwezigheid van tekortkomingen of fouten, de nauwkeurigheid, de eerbiediging van andere intellectuele-eigendomsrechten dan het in artikel 6 van deze licentie bedoelde auteursrecht. Deze uitsluiting van garantie is een essentieel onderdeel van de licentie en een voorwaarde voor de verlening van rechten op het werk. + +8.Uitsluiting van aansprakelijkheid +Behoudens in het geval van een opzettelijke fout of directe schade aan natuurlijke personen, is de licentiegever in geen enkel geval aansprakelijk voor ongeacht welke directe of indirecte, materiële of immateriële schade die voortvloeit uit de licentie of het gebruik van het werk, met inbegrip van, maar niet beperkt tot schade als gevolg van het verlies van goodwill, verloren werkuren, een computerdefect of computerfout, het verlies van gegevens, of enige andere commerciële schade, zelfs indien de licentiegever werd gewezen op de mogelijkheid van dergelijke schade. De licentiegever is echter aansprakelijk op grond van de wetgeving inzake productaansprakelijkheid, voor zover deze wetgeving op het werk van toepassing is. + +9.Aanvullende overeenkomsten +Bij de verspreiding van het werk kunt u ervoor kiezen een aanvullende overeenkomst te sluiten, waarin de verplichtingen of diensten overeenkomstig deze licentie worden omschreven. Indien deze verplichtingen worden aanvaard, kunt u echter alleen in eigen naam en onder eigen verantwoordelijkheid handelen, en dus niet in naam van de oorspronkelijke licentiegever of een bewerker, en kunt u voorts alleen handelen indien u ermee instemt alle bewerkers schadeloos te stellen, te verdedigen of te vrijwaren met betrekking tot de aansprakelijkheid van of vorderingen tegen deze bewerkers op grond van het feit dat u een garantie of aanvullende aansprakelijkheid hebt aanvaard. + +10.Aanvaarding van de licentie +De bepalingen van deze licentie kunnen worden aanvaard door te klikken op het pictogram „Ik ga akkoord”, dat zich bevindt onderaan het venster waarin de tekst van deze licentie is weergegeven, of door overeenkomstig de toepasselijke wetsbepalingen op een soortgelijke wijze met de licentie in te stemmen. Door op dat pictogram te klikken geeft u aan dat u deze licentie en alle voorwaarden ervan ondubbelzinnig en onherroepelijk aanvaardt. Evenzo aanvaardt u onherroepelijk deze licentie en alle voorwaarden ervan door uitoefening van de rechten die u in artikel 2 van deze licentie zijn verleend, zoals het gebruik van het werk, het creëren door u van een bewerking of de verspreiding of mededeling door u van het werk of kopieën ervan. + +11.Voorlichting van het publiek +Indien u het werk verspreidt of mededeelt door middel van elektronische communicatiemiddelen (bijvoorbeeld door voor te stellen het werk op afstand te downloaden), moet het distributiekanaal of het medium (bijvoorbeeld een website) het publiek ten minste de gegevens verschaffen die door het toepasselijke recht zijn voorgeschreven met betrekking tot de licentiegever, de licentie en de wijze waarop deze kan worden geraadpleegd, gesloten, opgeslagen en gereproduceerd door de licentiehouder. + +12.Einde van de licentie +De licentie en de uit hoofde daarvan verleende rechten eindigen automatisch bij elke inbreuk door de licentiehouder op de voorwaarden van de licentie. Dit einde beëindigt niet de licenties van personen die het werk van de licentiehouder krachtens de licentie hebben ontvangen, mits deze personen zich volledig aan de licentie houden. + +13.Overige +Onverminderd artikel 9 vormt de licentie de gehele overeenkomst tussen de partijen met betrekking tot het werk. Indien een bepaling van de licentie volgens het toepasselijke recht ongeldig is of niet uitvoerbaar is, doet dit geen afbreuk aan de geldigheid of uitvoerbaarheid van de licentie in haar geheel. Deze bepaling dient zodanig te worden uitgelegd of gewijzigd dat zij geldig en uitvoerbaar wordt. De Europese Commissie kan, voor zover dit noodzakelijk en redelijk is, versies in andere talen of nieuwe versies van deze licentie of geactualiseerde versies van dit aanhangsel publiceren, zonder de draagwijdte van de uit hoofde van de licentie verleende rechten te beperken. Nieuwe versies van de licentie zullen worden gepubliceerd met een uniek versienummer. Alle door de Europese Commissie goedgekeurde taalversies van deze licentie hebben dezelfde waarde. De partijen kunnen zich beroepen op de taalversie van hun keuze. + +14.Bevoegd gerecht +Onverminderd specifieke overeenkomsten tussen de partijen, +— vallen alle geschillen tussen de instellingen, organen en instanties van de Europese Unie, als licentiegeefster, en een licentiehouder in verband met de uitlegging van deze licentie onder de bevoegdheid van het Hof van Justitie van de Europese Unie, conform artikel 272 van het Verdrag betreffende de werking van de Europese Unie, +— vallen alle geschillen tussen andere partijen in verband met de uitlegging van deze licentie onder de uitsluitende bevoegdheid van het bevoegde gerecht van de plaats waar de licentiegever is gevestigd of zijn voornaamste activiteit uitoefent. + +15.Toepasselijk recht +Onverminderd specifieke overeenkomsten tussen de partijen, +— wordt deze licentie beheerst door het recht van de lidstaat van de Europese Unie waar de licentiegever zijn statutaire zetel, verblijfplaats of hoofdkantoor heeft, +— wordt deze licentie beheerst door het Belgische recht indien de licentiegever geen statutaire zetel, verblijfplaats of hoofdkantoor heeft in een lidstaat van de Europese Unie. + + +Aanhangsel +„Verenigbare licenties” in de zin van artikel 5 EUPL zijn: +— GNU General Public License (GPL) v. 2, v. 3 +— GNU Affero General Public License (AGPL) v. 3 +— Open Software License (OSL) v. 2.1, v. 3.0 +— Eclipse Public License (EPL) v. 1.0 +— CeCILL v. 2.0, v. 2.1 +— Mozilla Public Licence (MPL) v. 2 +— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) voor andere werken dan software +— European Union Public Licence (EUPL) v. 1.1, v. 1.2 +— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) of Strong Reciprocity (LiLiQ-R+). +De Europese Commissie kan dit aanhangsel actualiseren in geval van latere versies van de bovengenoemde licenties zonder dat er een nieuwe EUPL-versie wordt ontwikkeld, zolang die versies de uit hoofde van artikel 2 van deze licentie verleende rechten verlenen en ze de betrokken broncode beschermen tegen exclusieve toe-eigening. +Voor alle andere wijzigingen van of aanvullingen op dit aanhangsel is de ontwikkeling van een nieuwe EUPL-versie vereist. diff --git a/app/Dockerfile b/app/Dockerfile index bea4236f..dd066df7 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -6,19 +6,59 @@ RUN cd /srv/web \ && npm install \ && npm run build -FROM python:3.9.15-slim-buster +FROM python:3.10.10-slim-bullseye EXPOSE 8000 +ENV APP_HOME=/app +ENV APP_USER=appuser +ENV APP_USER_ID=2000 + +RUN groupadd -r $APP_USER && \ + useradd -r -u $APP_USER_ID -g $APP_USER -d $APP_HOME -s /sbin/nologin -c "Docker image user" $APP_USER + ENV PYTHONUNBUFFERED 1 WORKDIR /app/ -RUN apt-get update && apt-get install -y \ - build-essential \ - python-dev \ - git \ - locales \ +RUN apt-get update \ + && apt-get dist-upgrade -y \ + && apt-get autoremove -y \ + && apt-get install --no-install-recommends -y \ + build-essential \ + python-dev \ + curl \ + unzip \ + wget \ + dnsutils \ + vim-tiny \ + net-tools \ + netcat \ + libgeos-c1v5 \ + gdal-bin \ + postgresql-client \ + libgdal28 \ + libspatialite7 \ + libfreexl1 \ + libgeotiff-dev \ + libwebp6 \ + proj-bin \ + mime-support \ + gettext \ + libwebpmux3 \ + libwebpdemux2 \ + libxml2 \ + libfreetype6 \ + libtiff5 \ + libgdk-pixbuf2.0-0 \ + libmagic1 \ + libcairo2 \ + libpango1.0-0 \ + gcc \ + graphviz \ + graphviz-dev \ + git \ + locales \ && pip install --upgrade pip \ && sed -i '/nl_NL.UTF-8/s/^# //g' /etc/locale.gen && \ locale-gen @@ -29,12 +69,21 @@ ENV LANG=nl_NL.UTF-8 \ COPY . /app/ +COPY --from=node_step /srv/web/public/build /static/ -RUN mkdir -p /media && mkdir -p /static && chown 2000 /media && chown 2000 /static && chmod 744 /media && chmod 744 /static \ - && mkdir -p /srv/web/var/cache && chown 2000 /srv/web/var/cache && chmod -R ugo+rwx /srv/web/var/cache \ - && chmod +x /app/deploy/docker-entrypoint.sh && chown root:root /app/deploy/docker-entrypoint.sh \ +RUN mkdir -p /media \ + && mkdir -p /static \ + && chown -R $APP_USER:$APP_USER /media \ + && chown -R $APP_USER:$APP_USER /static \ + && chmod -R 744 /media \ + && chmod -R 744 /static \ + && mkdir -p /srv/web/var/cache \ + && chown $APP_USER:$APP_USER /srv/web/var/cache \ + && chmod -R ugo+rwx /srv/web/var/cache \ + && chown -R $APP_USER:$APP_USER $APP_HOME \ + && chmod -R +x /app/deploy \ && pip install --no-cache-dir -r /app/requirements.txt -COPY --from=node_step /srv/web/public/build /static/ +USER $APP_USER CMD ["bash", "/app/deploy/docker-entrypoint.sh"] diff --git a/app/apps/authenticatie/__init__.py b/app/apps/authenticatie/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/apps/authenticatie/admin.py b/app/apps/authenticatie/admin.py new file mode 100644 index 00000000..0ca76690 --- /dev/null +++ b/app/apps/authenticatie/admin.py @@ -0,0 +1,35 @@ +from apps.authenticatie.models import Gebruiker +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin + + +class GebruikerAdmin(UserAdmin): + model = Gebruiker + list_display = ( + "email", + "is_staff", + "is_active", + ) + list_filter = ( + "email", + "is_staff", + "is_active", + ) + fieldsets = ( + (None, {"fields": ("email", "password")}), + ("Permissions", {"fields": ("is_staff", "is_active")}), + ) + add_fieldsets = ( + ( + None, + { + "classes": ("wide",), + "fields": ("email", "password1", "password2", "is_staff", "is_active"), + }, + ), + ) + search_fields = ("email",) + ordering = ("email",) + + +admin.site.register(Gebruiker, GebruikerAdmin) diff --git a/app/apps/authenticatie/apps.py b/app/apps/authenticatie/apps.py new file mode 100644 index 00000000..32fa7f9a --- /dev/null +++ b/app/apps/authenticatie/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AuthenticatieConfig(AppConfig): + name = "apps.authenticatie" + verbose_name = "Authenticatie" diff --git a/app/apps/authenticatie/auth.py b/app/apps/authenticatie/auth.py new file mode 100644 index 00000000..6d7aebfd --- /dev/null +++ b/app/apps/authenticatie/auth.py @@ -0,0 +1,20 @@ +from mozilla_django_oidc import auth + + +class OIDCAuthenticationBackend(auth.OIDCAuthenticationBackend): + def create_user(self, claims): + email = claims.get("email") + user = self.UserModel.objects.create_user(email=email) + + user.first_name = claims.get("given_name", "") + user.last_name = claims.get("family_name", "") + user.save() + + return user + + def update_user(self, user, claims): + user.first_name = claims.get("given_name", "") + user.last_name = claims.get("family_name", "") + user.save() + + return user diff --git a/app/apps/authenticatie/backends.py b/app/apps/authenticatie/backends.py new file mode 100644 index 00000000..eeae03f6 --- /dev/null +++ b/app/apps/authenticatie/backends.py @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MPL-2.0 +# Copyright (C) 2022 Delta10 B.V. +from mozilla_django_oidc.auth import OIDCAuthenticationBackend + + +class AuthenticationBackend(OIDCAuthenticationBackend): + def filter_users_by_claims(self, claims): + print("claims") + print(claims) + email = claims.get("email") + if not email: + return self.UserModel.objects.none() + + return self.UserModel.objects.filter(username__iexact=email) + + def create_user(self, claims): + return None # do not create users when they do not exist in the database + + def update_user(self, user, claims): + return user # do not update any attributes in the database based on claims + + def authenticate(self, request, **kwargs): + print("authenticate") + print(request) + return super().authenticate(request, **kwargs) diff --git a/app/apps/authenticatie/managers.py b/app/apps/authenticatie/managers.py new file mode 100644 index 00000000..a2e412cc --- /dev/null +++ b/app/apps/authenticatie/managers.py @@ -0,0 +1,44 @@ +from django.contrib.auth.base_user import BaseUserManager +from django.contrib.auth.hashers import make_password +from django.utils.translation import ugettext_lazy as _ + + +class GebruikerManager(BaseUserManager): + """ + Gebruiker model manager where email is the unique identifiers + for authentication instead of usernames. + """ + + def _create_user(self, email, password, **extra_fields): + """ + Create and save a user with the given username, email, and password. + """ + if not email: + raise ValueError("The given email must be set") + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.password = make_password(password) + user.save(using=self._db) + return user + + def create_user(self, email, password=None, **extra_fields): + """ + Create and save a User with the given email and password. + """ + extra_fields.setdefault("is_staff", False) + extra_fields.setdefault("is_superuser", False) + return self._create_user(email, password, **extra_fields) + + def create_superuser(self, email, password=None, **extra_fields): + """ + Create and save a SuperUser with the given email and password. + """ + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + extra_fields.setdefault("is_active", True) + + if extra_fields.get("is_staff") is not True: + raise ValueError(_("Superuser must have is_staff=True.")) + if extra_fields.get("is_superuser") is not True: + raise ValueError(_("Superuser must have is_superuser=True.")) + return self._create_user(email, password, **extra_fields) diff --git a/app/apps/authenticatie/migrations/0001_initial.py b/app/apps/authenticatie/migrations/0001_initial.py new file mode 100644 index 00000000..a9068893 --- /dev/null +++ b/app/apps/authenticatie/migrations/0001_initial.py @@ -0,0 +1,107 @@ +# Generated by Django 3.2.16 on 2023-06-29 08:17 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + ] + + operations = [ + migrations.CreateModel( + name="Gebruiker", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ("email", models.EmailField(max_length=254, unique=True)), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.Group", + verbose_name="groups", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.Permission", + verbose_name="user permissions", + ), + ), + ], + options={ + "verbose_name": "user", + "verbose_name_plural": "users", + "abstract": False, + }, + ), + ] diff --git a/app/apps/authenticatie/migrations/__init__.py b/app/apps/authenticatie/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/apps/authenticatie/models.py b/app/apps/authenticatie/models.py new file mode 100644 index 00000000..d028ada7 --- /dev/null +++ b/app/apps/authenticatie/models.py @@ -0,0 +1,16 @@ +from apps.authenticatie.managers import GebruikerManager +from django.contrib.auth.models import AbstractUser +from django.contrib.gis.db import models + + +class Gebruiker(AbstractUser): + username = None + email = models.EmailField(unique=True) + + USERNAME_FIELD = "email" + REQUIRED_FIELDS = [] + + objects = GebruikerManager() + + def __str__(self): + return self.email diff --git a/app/apps/authenticatie/templates/auth/check_sso_status.html b/app/apps/authenticatie/templates/auth/check_sso_status.html new file mode 100644 index 00000000..3083ca4e --- /dev/null +++ b/app/apps/authenticatie/templates/auth/check_sso_status.html @@ -0,0 +1,20 @@ + + diff --git a/app/apps/authenticatie/views.py b/app/apps/authenticatie/views.py new file mode 100644 index 00000000..44b5d81b --- /dev/null +++ b/app/apps/authenticatie/views.py @@ -0,0 +1,32 @@ +import logging +from urllib import parse + +import requests +from django.conf import settings + +logger = logging.getLogger(__name__) + + +def provider_logout(request): + logout_url = settings.OIDC_OP_LOGOUT_ENDPOINT + oidc_id_token = request.session.get("oidc_id_token", None) + redirect_url = request.build_absolute_uri( + location=request.GET.get("next", settings.LOGOUT_REDIRECT_URL) + ) + if oidc_id_token: + logout_url = ( + settings.OIDC_OP_LOGOUT_ENDPOINT + + "?" + + parse.urlencode( + { + "id_token_hint": oidc_id_token, + "post_logout_redirect_uri": redirect_url, + } + ) + ) + logout_response = requests.get(logout_url) + if logout_response.status_code != 200: + logger.error( + f"provider_logout: status code: {logout_response.status_code}, logout_url: {logout_url}" + ) + return redirect_url diff --git a/app/apps/health/__init__.py b/app/apps/health/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/apps/health/apps.py b/app/apps/health/apps.py new file mode 100644 index 00000000..73230018 --- /dev/null +++ b/app/apps/health/apps.py @@ -0,0 +1,12 @@ +from django.apps import AppConfig +from health_check.plugins import plugin_dir + + +class HealthConfig(AppConfig): + name = "apps.health" + verbose_name = "Health" + + def ready(self): + from apps.health.custom_checks import MeldingenAPIHealthCheck + + plugin_dir.register(MeldingenAPIHealthCheck) diff --git a/app/apps/health/custom_checks.py b/app/apps/health/custom_checks.py new file mode 100644 index 00000000..602b1526 --- /dev/null +++ b/app/apps/health/custom_checks.py @@ -0,0 +1,23 @@ +import requests +from django.conf import settings +from health_check.backends import BaseHealthCheckBackend +from health_check.exceptions import HealthCheckException + + +class MeldingenAPIHealthCheck(BaseHealthCheckBackend): + critical_service = False + + def check_status(self): + health_check_response = requests.get(settings.MELDINGEN_API_HEALTH_CHECK_URL) + + if health_check_response.status_code != 200: + raise HealthCheckException( + f"Meldingen API not ready: status code: {health_check_response.status_code}" + ) + if health_check_response.status_code == 404: + raise HealthCheckException( + f"Meldingen API: health url not implemented: status code: {health_check_response.status_code}" + ) + + def identifier(self): + return self.__class__.__name__ diff --git a/app/apps/meldingen/__init__.py b/app/apps/meldingen/__init__.py new file mode 100644 index 00000000..426fd2e1 --- /dev/null +++ b/app/apps/meldingen/__init__.py @@ -0,0 +1,4 @@ +from apps.meldingen.service import MeldingenService +from django.conf import settings + +service_instance = MeldingenService(settings.MELDINGEN_URL) diff --git a/app/apps/meldingen/service.py b/app/apps/meldingen/service.py new file mode 100644 index 00000000..ebaea7fe --- /dev/null +++ b/app/apps/meldingen/service.py @@ -0,0 +1,180 @@ +from urllib.parse import urlparse + +import requests +from apps.meldingen.utils import get_meldingen_token +from requests import Request, Response + + +class MeldingenService: + _api_base_url = None + _timeout: tuple[int, ...] = (5, 10) + _api_path: str = "/api/v1" + + class BasisUrlFout(Exception): + ... + + class AntwoordFout(Exception): + ... + + def __init__(self, api_base_url: str, *args, **kwargs: dict): + self._api_base_url = api_base_url.strip().rstrip("/") + super().__init__(*args, **kwargs) + + def get_url(self, url): + url_o = urlparse(url) + if not url_o.scheme and not url_o.netloc: + return f"{self._api_base_url}{url}" + if f"{url_o.scheme}://{url_o.netloc}" == self._api_base_url: + return url + raise MeldingenService.BasisUrlFout( + f"url: {url}, basis_url: {self._api_base_url}" + ) + + def get_headers(self): + headers = {"Authorization": f"Token {get_meldingen_token()}"} + return headers + + def do_request(self, url, method="get", data={}, raw_response=True): + + action: Request = getattr(requests, method) + action_params: dict = { + "url": self.get_url(url), + "headers": self.get_headers(), + "json": data, + "timeout": self._timeout, + } + response: Response = action(**action_params) + + if raw_response: + return response + try: + return response.json() + except Exception: + raise MeldingenService.AntwoordFout( + f"url: {self.get_url(url)}, status code: {response.status_code}, tekst: {response.text}" + ) + + def get_melding_lijst(self, query_string=""): + return self.do_request( + f"{self._api_path}/melding/?{query_string}", + raw_response=False, + ) + + def get_melding(self, id, query_string="") -> dict: + return self.do_request( + f"{self._api_path}/melding/{id}/?{query_string}", + raw_response=False, + ) + + def melding_gebeurtenis_toevoegen( + self, + id, + bijlagen=[], + omschrijving_intern=None, + omschrijving_extern=None, + gebruiker=None, + ): + data = { + "bijlagen": bijlagen, + "omschrijving_intern": omschrijving_intern, + "omschrijving_extern": omschrijving_extern, + "gebruiker": gebruiker, + } + response = self.do_request( + f"{self._api_path}/melding/{id}/gebeurtenis-toevoegen/", + method="post", + data=data, + ) + if response.status_code != 200: + raise MeldingenService.AntwoordFout( + f"status code: {response.status_code}, status code verwacht: 200" + ) + return response.json() + + def melding_status_aanpassen( + self, + id, + status=None, + resolutie=None, + bijlagen=[], + omschrijving_extern=None, + omschrijving_intern=None, + gebruiker=None, + ): + data = { + "bijlagen": bijlagen, + "omschrijving_extern": omschrijving_extern, + "omschrijving_intern": omschrijving_intern, + "gebruiker": gebruiker, + } + if status: + data.update( + { + "status": { + "naam": status, + }, + "resolutie": resolutie, + } + ) + return self.do_request( + f"{self._api_path}/melding/{id}/status-aanpassen/" + if status + else f"{self._api_path}/melding/{id}/gebeurtenis-toevoegen/", + method="patch" if status else "post", + data=data, + raw_response=False, + ) + + def taakapplicaties(self): + return self.do_request( + f"{self._api_path}/taakapplicatie/", + raw_response=False, + ) + + def taak_aanmaken( + self, + melding_uuid, + taaktype_url, + titel, + bericht=None, + gebruiker=None, + additionele_informatie={}, + ): + data = { + "taaktype": taaktype_url, + "titel": titel, + "bericht": bericht, + "gebruiker": gebruiker, + "additionele_informatie": additionele_informatie, + } + return self.do_request( + f"{self._api_path}/melding/{melding_uuid}/taakopdracht/", + method="post", + data=data, + raw_response=False, + ) + + def taak_status_aanpassen( + self, + taakopdracht_url, + status, + resolutie=None, + omschrijving_intern=None, + bijlagen=None, + gebruiker=None, + ): + data = { + "taakstatus": { + "naam": status, + }, + "resolutie": resolutie, + "omschrijving_intern": omschrijving_intern, + "bijlagen": bijlagen, + "gebruiker": gebruiker, + } + return self.do_request( + f"{taakopdracht_url}status-aanpassen/", + method="patch", + data=data, + raw_response=False, + ) diff --git a/app/apps/meldingen/utils.py b/app/apps/meldingen/utils.py new file mode 100644 index 00000000..fecc76c6 --- /dev/null +++ b/app/apps/meldingen/utils.py @@ -0,0 +1,60 @@ +import requests +from django.conf import settings +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.validators import validate_email + + +class MeldingAuthResponseException(Exception): + pass + + +def get_meldingen_token(): + meldingen_token = cache.get("meldingen_token2") + if not meldingen_token: + email = settings.MELDINGEN_USERNAME + try: + validate_email(email) + except ValidationError: + email = f"{settings.MELDINGEN_USERNAME}@forzamor.nl" + token_response = requests.post( + settings.MELDINGEN_TOKEN_API, + json={ + "username": email, + "password": settings.MELDINGEN_PASSWORD, + }, + ) + if token_response.status_code == 200: + meldingen_token = token_response.json().get("token") + cache.set( + "meldingen_token", meldingen_token, settings.MELDINGEN_TOKEN_TIMEOUT + ) + else: + raise MeldingAuthResponseException( + f"auth response status code: {token_response.status_code}" + ) + return meldingen_token + + +def get_taaktypes(melding): + from apps.meldingen import service_instance + + taakapplicaties = service_instance.taakapplicaties() + taaktypes = [ + [ + tt.get("_links", {}).get("self"), + f"{tt.get('omschrijving')}", + ] + for ta in taakapplicaties.get("results", []) + for tt in ta.get("taaktypes", []) + ] + gebruikte_taaktypes = [ + *set( + list( + to.get("taaktype") + for to in melding.get("taakopdrachten_voor_melding", []) + ) + ) + ] + taaktypes = [tt for tt in taaktypes if tt[0] not in gebruikte_taaktypes] + return taaktypes diff --git a/app/apps/regie/constanten.py b/app/apps/regie/constanten.py new file mode 100644 index 00000000..52a287dc --- /dev/null +++ b/app/apps/regie/constanten.py @@ -0,0 +1,37 @@ +VERTALINGEN = { + "standaard": "Standaard", + "status_wijziging": "Status wijziging", + "melding_aangemaakt": "Melding aangemaakt", + "taakopdracht_aangemaakt": "Taakopdracht aangemaakt", + "taakopdracht_status_wijziging": "Taakopdracht status wijziging", + "opgelost": "Opgelost", + "niet_opgelost": "Niet opgelost", + "aangemaakt": "Aangemaakt", + "gewijzigd": "Gewijzigd", + "verwijderd": "Verwijderd", + "verwijderd": "Verwijderd", + "in_behandeling": "In behandeling", + "openstaand": "Openstaand", + "controle": "Controle", + "afgehandeld": "Afgehandeld", + "nieuw": "Nieuw", + "bezig": "Bezig", + "voltooid": "Voltooid", + "adres": "Adres", + "lichtmast": "Lichtmast", + "graf": "Graf", + "vak": "Vak", + "fotos": "Foto's", + "aannemer": "Aangenomen door", + "no_email": "De melder beschikt niet over een e-mailadres.", + "grafnummer": "Grafnummer", + "naam_melder": "Naam", + "toelichting": "Toelichting", + "email_melder": "E-mailadres", + "begraafplaats": "Begraafplaats", + "rechthebbende": "Is deze persoon de rechthebbende of belanghebbende?", + "specifiek_graf": "Betreft het verzoek een specifiek graf?", + "naam_overledene": "Naam overledene", + "telefoon_melder": "Telefoonnummer", + "terugkoppeling_gewenst": "Is terugkoppeling gewenst?", +} diff --git a/app/apps/regie/forms.py b/app/apps/regie/forms.py new file mode 100644 index 00000000..92bf4042 --- /dev/null +++ b/app/apps/regie/forms.py @@ -0,0 +1,227 @@ +from django import forms + +BEHANDEL_OPTIES = ( + ( + "ja", + "Ja", + "We zijn met uw melding aan de slag gegaan en hebben het probleem opgelost.", + "afgehandeld", + "opgelost", + ), + ( + "nee", + "Nee", + "We zijn met uw melding aan de slag gegaan maar deze kan niet direct worden opgelost. Want...", + "afgehandeld", + None, + ), +) +TAAK_BEHANDEL_OPTIES = ( + ( + "ja", + "Ja", + "We zijn met uw melding aan de slag gegaan en hebben het probleem opgelost.", + "voltooid", + "opgelost", + ), + ( + "nee", + "Nee, het probleem kan niet worden opgelost.", + "We zijn met uw melding aan de slag gegaan, maar konden het probleem helaas niet oplossen. Want...", + "voltooid", + None, + ), +) + +TAAK_BEHANDEL_STATUS = {bo[0]: bo[3] for bo in TAAK_BEHANDEL_OPTIES} +TAAK_BEHANDEL_RESOLUTIE = {bo[0]: bo[4] for bo in TAAK_BEHANDEL_OPTIES} +BEHANDEL_STATUS = {bo[0]: bo[3] for bo in BEHANDEL_OPTIES} +BEHANDEL_RESOLUTIE = {bo[0]: bo[4] for bo in BEHANDEL_OPTIES} + + +class CheckboxSelectMultipleThumb(forms.CheckboxSelectMultiple): + ... + + +class FilterForm(forms.Form): + + begraafplaats = forms.MultipleChoiceField( + label="Locatie", + widget=forms.CheckboxSelectMultiple( + attrs={ + "class": "list--form-check-input", + "hideLabel": True, + } + ), + choices=[], + required=False, + ) + + ordering = forms.CharField( + widget=forms.HiddenInput(), + initial="aangemaakt_op", + required=False, + ) + + offset = forms.ChoiceField( + widget=forms.RadioSelect( + attrs={ + "class": "list--form-check-input", + "hideLabel": True, + } + ), + required=False, + ) + + limit = forms.CharField( + widget=forms.HiddenInput, + initial="10", + required=False, + ) + + def __init__(self, *args, **kwargs): + offset_options = kwargs.pop("offset_options", None) + locatie_opties = kwargs.pop("locatie_opties", None) + super().__init__(*args, **kwargs) + self.fields["offset"].choices = offset_options + self.fields["begraafplaats"].choices = locatie_opties + + +class LoginForm(forms.Form): + username = forms.CharField(label="Personeelsnummer", widget=forms.TextInput()) + password = forms.CharField(label="Wachtwoord", widget=forms.PasswordInput()) + + +class RadioSelect(forms.RadioSelect): + option_template_name = "widgets/radio_option.html" + + +class InformatieToevoegenForm(forms.Form): + opmerking = forms.CharField( + label="Voeg een opmerking toe", + widget=forms.Textarea( + attrs={"class": "form-control", "data-testid": "information", "rows": "4"} + ), + required=False, + ) + + bijlagen_extra = forms.FileField( + widget=forms.widgets.FileInput( + attrs={ + "accept": ".jpg, .jpeg, .png, .heic", + "data-action": "change->bijlagen#updateImageDisplay", + "data-bijlagen-target": "bijlagenExtra", + } + ), + label="Voeg één of meerdere foto's toe", + required=False, + ) + + +class TaakStartenForm(forms.Form): + taaktype = forms.ChoiceField( + widget=forms.Select(), + label="Taak", + choices=( + ("graf_ophogen", "Graf ophogen"), + ("steen_rechtzetten", "Steen rechtzetten"), + ("snoeien", "Snoeien"), + ), + required=True, + ) + + bericht = forms.CharField( + label="Interne opmerking", + help_text="Deze tekst wordt niet naar de melder verstuurd.", + widget=forms.Textarea( + attrs={"class": "form-control", "data-testid": "information", "rows": "4"} + ), + required=False, + ) + + def __init__(self, *args, **kwargs): + taaktypes = kwargs.pop("taaktypes", None) + super().__init__(*args, **kwargs) + self.fields["taaktype"].choices = taaktypes + + +class TaakAfrondenForm(forms.Form): + status = forms.ChoiceField( + widget=RadioSelect( + attrs={ + "class": "list--form-radio-input", + } + ), + label="Is het probleem opgelost?", + choices=[[x[0], x[1]] for x in TAAK_BEHANDEL_OPTIES], + required=True, + ) + + bijlagen = forms.FileField( + widget=forms.widgets.FileInput( + attrs={ + "accept": ".jpg, .jpeg, .png, .heic", + "data-action": "change->bijlagen#updateImageDisplay", + "data-bijlagen-target": "bijlagenAfronden", + } + ), + label="Foto's", + required=False, + ) + + omschrijving_intern = forms.CharField( + label="Interne opmerking", + help_text="Je kunt deze tekst aanpassen of eigen tekst toevoegen.", + widget=forms.Textarea( + attrs={ + "class": "form-control", + "data-testid": "information", + "rows": "4", + "data-meldingbehandelformulier-target": "internalText", + } + ), + required=False, + ) + + +class MeldingAfhandelenForm(forms.Form): + + omschrijving_extern = forms.CharField( + label="Bericht voor de melder", + help_text="Je kunt deze tekst aanpassen of eigen tekst toevoegen.", + widget=forms.Textarea( + attrs={ + "class": "form-control", + "data-testid": "message", + "rows": "4", + "data-meldingbehandelformulier-target": "externalText", + } + ), + required=False, + ) + + omschrijving_intern = forms.CharField( + label="Interne opmerking", + help_text="Deze tekst wordt niet naar de melder verstuurd.", + widget=forms.Textarea( + attrs={ + "class": "form-control", + "rows": "4", + "data-meldingbehandelformulier-target": "internalText", + } + ), + required=False, + ) + + def __init__(self, *args, **kwargs): + # bijlagen = kwargs.pop("bijlagen", None) + super().__init__(*args, **kwargs) + # print("FORMS bijlagen = = = >") + # print(bijlagen) + # self.fields["bijlagen"].choices = bijlagen + # self.fields["bijlagen"].choices = [ + # (str(m.get("afbeelding")), m.get("afbeelding")) for m in bijlagen + # ] + + # def terugsturen(self, data): + # if data.get("afhandel_reden") == "" diff --git a/app/apps/regie/mock.py b/app/apps/regie/mock.py index 93bb29c0..2a7bb1e6 100644 --- a/app/apps/regie/mock.py +++ b/app/apps/regie/mock.py @@ -2,9 +2,10 @@ { "id": 58, "uuid": "567be434-991d-40db-8452-759182e7433b", - "aangemaakt_op": "2014-01-16T04:20:17 -01:00", - "aangepast_op": "2020-06-08T12:59:07 -02:00", - "origineel_aangemaakt": "2017-01-16T07:04:51 -01:00", + "aangemaakt_op": "2014-01-16T04:20:17", + "aangepast_op": "2020-06-08T12:59:07", + "afgesloten_op": "2023-06-08T13:00:00", + "origineel_aangemaakt": "2017-01-16T07:04:51", "tekst": "Cupidatat esse do sunt in. Officia sunt voluptate excepteur fugiat elit sint id est. Eu veniam amet enim esse voluptate aute labore magna aute eiusmod. Minim nisi ipsum est dolore dolore labore do. Nisi et do laboris consectetur proident nostrud quis in culpa aliquip culpa minim consequat qui. Aute eiusmod adipisicing consequat dolor enim laboris consequat dolore cillum dolor dolore. Veniam ipsum pariatur pariatur do culpa occaecat pariatur excepteur.\r\n", "meta": { "naam_overledene": "Roslyn Dickerson", @@ -25,7 +26,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Pernis", - "grafnummer": "'287'", + "grafnummer": "287", "vak": "E", "geometrieen": [], } @@ -46,13 +47,13 @@ { "id": 253, "uuid": "21e5ec23-ef1f-4bee-90c5-8e0834c39c58", - "aangemaakt_op": "2020-03-02T08:42:48 -01:00", - "aangepast_op": "2022-08-03T04:48:43 -02:00", - "origineel_aangemaakt": "2019-08-16T07:22:42 -02:00", + "aangemaakt_op": "2020-03-02T08:42:48", + "afgesloten_op": "2023-06-08T13:00:00", + "origineel_aangemaakt": "2019-08-16T07:22:42", "tekst": "Qui dolor labore qui commodo nostrud. Et consequat officia adipisicing ea sint est proident dolor. Fugiat cillum nostrud non enim. Pariatur ad reprehenderit non cillum aliquip cupidatat ea eiusmod adipisicing laboris et. Ex laborum ullamco commodo ipsum cillum. Sint occaecat voluptate commodo ea exercitation ullamco tempor nisi in cupidatat laboris dolore ullamco incididunt.\r\n", "meta": { "naam_overledene": "Knight Merritt", - "categorie": ["Verzakking eigen graf"], + "categorie": ["Verzakking eigen graf", "Muizen"], "omschrijving_andere_oorzaken": "Cillum officia nulla dolore nostrud. Anim quis nulla excepteur fugiat ad aliqua et. Laboris ullamco magna sunt nostrud esse dolore amet. Esse ipsum laboris fugiat ad. Ad fugiat enim non sunt irure nostrud elit ad occaecat voluptate ut laborum elit. Laboris adipisicing ipsum id sint enim reprehenderit irure consectetur dolore tempor duis pariatur fugiat ex.\r\n", "aannemer": "Aimee Harmon", "rechthebbende": "Nee", @@ -69,14 +70,14 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oudeland, Hoogvliet", - "grafnummer": "'192'", + "grafnummer": "192", "vak": "E", "geometrieen": [], } ], "bijlagen": [ { - "bestand": "http://placehold.it/32x32", + "bestand": "http://placehold.it/64x48", "mimetype": "image/jpeg", "is_afbeelding": True, }, @@ -90,9 +91,9 @@ { "id": 252, "uuid": "cd1e8faa-7fa1-4275-bb1b-59604fc8bc07", - "aangemaakt_op": "2017-06-02T11:10:27 -02:00", - "aangepast_op": "2021-02-23T02:58:51 -01:00", - "origineel_aangemaakt": "2017-06-24T10:19:13 -02:00", + "aangemaakt_op": "2017-06-02T11:10:27", + "aangepast_op": "2021-02-23T02:58:51", + "origineel_aangemaakt": "2017-06-24T10:19:13", "tekst": "Aliquip aute amet magna culpa voluptate dolor est. Aliquip eu irure commodo culpa. Culpa nisi exercitation adipisicing reprehenderit sunt sunt do commodo cupidatat excepteur. Eiusmod consectetur et proident ad laborum reprehenderit ullamco officia. Nulla veniam sunt exercitation est do et adipisicing amet velit. Voluptate deserunt ullamco officia laboris fugiat. Commodo id est sunt consectetur.\r\n", "meta": { "naam_overledene": "Guerrero Dejesus", @@ -113,7 +114,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oudeland, Hoogvliet", - "grafnummer": "'299'", + "grafnummer": "299", "vak": "E", "geometrieen": [], } @@ -129,9 +130,9 @@ { "id": 207, "uuid": "5e6a89f3-f635-4e04-b255-aab946b21963", - "aangemaakt_op": "2020-03-05T04:25:37 -01:00", - "aangepast_op": "2015-11-29T06:17:46 -01:00", - "origineel_aangemaakt": "2021-06-29T09:27:21 -02:00", + "aangemaakt_op": "2020-03-05T04:25:37", + "aangepast_op": "2015-11-29T06:17:46", + "origineel_aangemaakt": "2021-06-29T09:27:21", "tekst": "Ex mollit elit ex quis laboris dolore non exercitation consequat. Cillum cupidatat irure aute et. Cillum cupidatat anim nulla proident et sint fugiat dolor. Laborum enim reprehenderit pariatur amet qui sunt incididunt excepteur ipsum quis in enim. Ex id minim aute excepteur dolor labore et irure. Est Lorem dolor eu ad sint tempor sit officia ut velit. Non deserunt aliqua reprehenderit ex aliqua dolore qui laboris.\r\n", "meta": { "naam_overledene": "Anthony Roth", @@ -152,7 +153,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Pernis", - "grafnummer": "'119'", + "grafnummer": "119", "vak": "C", "geometrieen": [], } @@ -173,9 +174,9 @@ { "id": 360, "uuid": "13c461a7-94dd-4cbe-9d4b-d81399526ec6", - "aangemaakt_op": "2022-09-28T02:40:30 -02:00", - "aangepast_op": "2021-01-20T06:42:30 -01:00", - "origineel_aangemaakt": "2022-09-28T10:13:04 -02:00", + "aangemaakt_op": "2022-09-28T02:40:30", + "aangepast_op": "2021-01-20T06:42:30", + "origineel_aangemaakt": "2022-09-28T10:13:04", "tekst": "Consectetur veniam nostrud anim veniam. Quis adipisicing exercitation aliquip ut non in pariatur aliquip laborum ut culpa ad. Esse magna deserunt esse laboris culpa culpa occaecat adipisicing sint aliqua. Ad deserunt ipsum fugiat aliquip ad minim. Ipsum quis consectetur officia ut amet enim officia sunt eu minim in exercitation proident.\r\n", "meta": { "naam_overledene": "Katherine Potts", @@ -196,7 +197,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'255'", + "grafnummer": "255", "vak": "G", "geometrieen": [], } @@ -212,9 +213,9 @@ { "id": 9, "uuid": "9fa6359c-385b-48be-b48e-514290720f81", - "aangemaakt_op": "2021-11-30T01:21:05 -01:00", - "aangepast_op": "2019-03-23T12:30:29 -01:00", - "origineel_aangemaakt": "2014-01-08T09:12:44 -01:00", + "aangemaakt_op": "2021-11-30T01:21:05", + "aangepast_op": "2019-03-23T12:30:29", + "origineel_aangemaakt": "2014-01-08T09:12:44", "tekst": "Id laboris velit nostrud voluptate eu anim occaecat sunt. Laborum sunt ipsum officia minim ex sunt aute nisi adipisicing eiusmod ipsum tempor irure. Elit nisi exercitation occaecat esse commodo dolore ad. Deserunt aliquip cupidatat cillum occaecat amet dolor velit ipsum magna sunt in aute eu. Ut ea occaecat nisi nisi ut in sit culpa in.\r\n", "meta": { "naam_overledene": "Terry Knight", @@ -235,7 +236,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Hoek van Holland", - "grafnummer": "'196'", + "grafnummer": "196", "vak": "D", "geometrieen": [], } @@ -281,9 +282,9 @@ { "id": 393, "uuid": "2cc5e5e0-5719-4233-a150-e81245a220e0", - "aangemaakt_op": "2018-06-17T08:35:33 -02:00", - "aangepast_op": "2017-09-21T09:21:31 -02:00", - "origineel_aangemaakt": "2016-02-29T09:52:05 -01:00", + "aangemaakt_op": "2018-06-17T08:35:33", + "aangepast_op": "2017-09-21T09:21:31", + "origineel_aangemaakt": "2016-02-29T09:52:05", "tekst": "Deserunt mollit deserunt velit ea officia laboris in in eiusmod sint voluptate culpa ut. Cupidatat ad duis anim velit commodo cupidatat aliqua exercitation minim. Ad eiusmod ipsum consequat velit est sit. Lorem aute consequat eiusmod in velit adipisicing exercitation cupidatat aliquip exercitation cupidatat.\r\n", "meta": { "naam_overledene": "Harriett Wheeler", @@ -304,7 +305,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Pernis", - "grafnummer": "'83'", + "grafnummer": "83", "vak": "D", "geometrieen": [], } @@ -320,9 +321,9 @@ { "id": 40, "uuid": "8720d519-97b7-4093-8e31-c9f96df3abed", - "aangemaakt_op": "2015-12-01T09:44:41 -01:00", - "aangepast_op": "2020-05-03T06:34:09 -02:00", - "origineel_aangemaakt": "2019-03-31T03:26:08 -02:00", + "aangemaakt_op": "2015-12-01T09:44:41", + "aangepast_op": "2020-05-03T06:34:09", + "origineel_aangemaakt": "2019-03-31T03:26:08", "tekst": "Eu officia labore aliqua eiusmod consequat cupidatat ullamco. Et aute esse enim id laboris exercitation culpa do et voluptate aliquip est. Cupidatat ea ex excepteur reprehenderit esse consequat. Cillum est amet cillum voluptate labore proident amet sint ipsum. Lorem do dolore minim eiusmod velit deserunt ex pariatur tempor id qui sint nostrud. Ad nostrud dolore tempor tempor adipisicing nulla qui. Adipisicing ut aliquip exercitation culpa occaecat commodo consectetur mollit consectetur consequat elit.\r\n", "meta": { "naam_overledene": "Humphrey Morton", @@ -343,7 +344,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Schiebroek", - "grafnummer": "'124'", + "grafnummer": "124", "vak": "A", "geometrieen": [], } @@ -359,9 +360,9 @@ { "id": 158, "uuid": "e69797e1-b6d6-449e-90cc-c00104bd24fa", - "aangemaakt_op": "2022-09-06T12:38:06 -02:00", - "aangepast_op": "2019-04-08T12:29:19 -02:00", - "origineel_aangemaakt": "2017-04-10T06:28:26 -02:00", + "aangemaakt_op": "2022-09-06T12:38:06", + "aangepast_op": "2019-04-08T12:29:19", + "origineel_aangemaakt": "2017-04-10T06:28:26", "tekst": "Tempor commodo laboris cupidatat duis exercitation ullamco dolore id excepteur nulla. Nisi eiusmod qui labore voluptate. Mollit voluptate fugiat est do. Irure est exercitation veniam anim et quis sunt laboris Lorem ad ad. Ad Lorem ipsum sunt aliqua ad elit occaecat ad dolor nulla fugiat. In ex sit id non cupidatat commodo sunt officia Lorem exercitation laboris adipisicing ad.\r\n", "meta": { "naam_overledene": "Elliott Forbes", @@ -382,7 +383,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Pernis", - "grafnummer": "'8'", + "grafnummer": "8", "vak": "C", "geometrieen": [], } @@ -398,9 +399,9 @@ { "id": 330, "uuid": "a12b269c-0ca6-4eb3-a46d-9b13d8334430", - "aangemaakt_op": "2019-11-08T04:50:17 -01:00", - "aangepast_op": "2023-03-08T03:39:33 -01:00", - "origineel_aangemaakt": "2014-02-13T11:16:34 -01:00", + "aangemaakt_op": "2019-11-08T04:50:17", + "aangepast_op": "2023-03-08T03:39:33", + "origineel_aangemaakt": "2014-02-13T11:16:34", "tekst": "Consequat ullamco amet reprehenderit tempor laboris est cupidatat exercitation culpa enim occaecat cillum enim adipisicing. Sit mollit est minim nulla. Tempor enim ullamco quis veniam pariatur elit dolore proident esse id esse nisi tempor reprehenderit. Exercitation in deserunt labore ex.\r\n", "meta": { "naam_overledene": "Kristie Terry", @@ -421,7 +422,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Rozenburg", - "grafnummer": "'152'", + "grafnummer": "152", "vak": "C", "geometrieen": [], } @@ -442,9 +443,9 @@ { "id": 307, "uuid": "16cbc6f0-effd-44a9-aba6-e5e22021e970", - "aangemaakt_op": "2022-03-29T06:35:04 -02:00", - "aangepast_op": "2020-10-22T02:53:22 -02:00", - "origineel_aangemaakt": "2023-02-25T10:26:24 -01:00", + "aangemaakt_op": "2022-03-29T06:35:04", + "aangepast_op": "2020-10-22T02:53:22", + "origineel_aangemaakt": "2023-02-25T10:26:24", "tekst": "Consequat laborum duis incididunt adipisicing velit esse laboris laboris. Laboris mollit nostrud voluptate anim velit ipsum occaecat velit dolore quis. Fugiat adipisicing adipisicing eiusmod commodo eu irure exercitation adipisicing sint do occaecat sint cupidatat aute. Elit ipsum aute et quis sit est pariatur deserunt duis. Enim incididunt ad do duis laboris amet ad fugiat.\r\n", "meta": { "naam_overledene": "Sherrie Sanford", @@ -465,7 +466,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'262'", + "grafnummer": "262", "vak": "D", "geometrieen": [], } @@ -481,9 +482,9 @@ { "id": 223, "uuid": "b5d266f9-7555-4bf2-9727-b4ba5b49892a", - "aangemaakt_op": "2021-08-07T07:14:34 -02:00", - "aangepast_op": "2017-12-09T07:02:26 -01:00", - "origineel_aangemaakt": "2014-10-16T01:39:19 -02:00", + "aangemaakt_op": "2021-08-07T07:14:34", + "aangepast_op": "2017-12-09T07:02:26", + "origineel_aangemaakt": "2014-10-16T01:39:19", "tekst": "Commodo ullamco veniam sit do laborum et dolor ex sunt sit aliquip laborum. Ex qui dolore eiusmod ea in eiusmod sint. Ut eiusmod veniam pariatur aliquip laborum culpa.\r\n", "meta": { "naam_overledene": "Copeland Cooke", @@ -504,7 +505,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Hoek van Holland", - "grafnummer": "'27'", + "grafnummer": "27", "vak": "E", "geometrieen": [], } @@ -525,9 +526,9 @@ { "id": 95, "uuid": "ffdec5fd-5634-456f-8332-994f55f49fad", - "aangemaakt_op": "2021-07-24T08:02:57 -02:00", - "aangepast_op": "2022-01-29T11:36:57 -01:00", - "origineel_aangemaakt": "2020-07-31T02:15:24 -02:00", + "aangemaakt_op": "2021-07-24T08:02:57", + "aangepast_op": "2022-01-29T11:36:57", + "origineel_aangemaakt": "2020-07-31T02:15:24", "tekst": "In ipsum incididunt irure est occaecat ullamco dolor consectetur occaecat nisi eu exercitation incididunt. Aliquip est in veniam pariatur aute ea sint. Laboris mollit est tempor aliquip commodo sint velit consectetur. Fugiat adipisicing esse et tempor voluptate minim voluptate mollit esse exercitation. Veniam nulla voluptate elit reprehenderit velit ipsum veniam veniam dolore consectetur.\r\n", "meta": { "naam_overledene": "Neva Keller", @@ -548,7 +549,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Crooswijk", - "grafnummer": "'230'", + "grafnummer": "230", "vak": "B", "geometrieen": [], } @@ -564,9 +565,9 @@ { "id": 438, "uuid": "6f0d6d7e-c110-4173-8214-a8d0f63e6b39", - "aangemaakt_op": "2022-12-15T04:37:09 -01:00", - "aangepast_op": "2020-03-21T07:57:14 -01:00", - "origineel_aangemaakt": "2022-04-23T03:54:12 -02:00", + "aangemaakt_op": "2022-12-15T04:37:09", + "aangepast_op": "2020-03-21T07:57:14", + "origineel_aangemaakt": "2022-04-23T03:54:12", "tekst": "Id proident magna amet qui occaecat irure sunt nisi sint magna anim ex labore reprehenderit. Dolor commodo eiusmod nisi et cillum labore. Commodo nisi commodo adipisicing id sint fugiat incididunt.\r\n", "meta": { "naam_overledene": "Wong Barlow", @@ -587,7 +588,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oudeland, Hoogvliet", - "grafnummer": "'39'", + "grafnummer": "39", "vak": "G", "geometrieen": [], } @@ -603,9 +604,9 @@ { "id": 138, "uuid": "eb40db4f-5f0b-47af-a321-4ecc0de3cafa", - "aangemaakt_op": "2014-03-22T07:46:51 -01:00", - "aangepast_op": "2022-07-27T12:50:53 -02:00", - "origineel_aangemaakt": "2020-11-12T08:19:11 -01:00", + "aangemaakt_op": "2014-03-22T07:46:51", + "aangepast_op": "2022-07-27T12:50:53", + "origineel_aangemaakt": "2020-11-12T08:19:11", "tekst": "Sint pariatur commodo voluptate officia ipsum quis adipisicing magna fugiat id eiusmod occaecat minim magna. Ea est anim occaecat ex quis sit in veniam voluptate mollit consequat elit. Ut sint laboris mollit ad ea adipisicing laborum ad adipisicing in ad sunt officia. Culpa in Lorem tempor fugiat eiusmod anim nostrud voluptate ex laboris sunt excepteur mollit adipisicing. Enim tempor commodo occaecat labore.\r\n", "meta": { "naam_overledene": "Hernandez Singleton", @@ -626,7 +627,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Crooswijk", - "grafnummer": "'91'", + "grafnummer": "91", "vak": "B", "geometrieen": [], } @@ -667,9 +668,9 @@ { "id": 288, "uuid": "230727a9-aabf-482d-846f-2dc2128a87a4", - "aangemaakt_op": "2017-06-28T05:03:08 -02:00", - "aangepast_op": "2019-11-25T02:37:45 -01:00", - "origineel_aangemaakt": "2016-12-12T10:07:15 -01:00", + "aangemaakt_op": "2017-06-28T05:03:08", + "aangepast_op": "2019-11-25T02:37:45", + "origineel_aangemaakt": "2016-12-12T10:07:15", "tekst": "Qui labore sint dolor nostrud non nulla in reprehenderit. Eiusmod ut voluptate nostrud dolor. Id fugiat do commodo laboris nulla do ullamco pariatur id eiusmod laborum mollit excepteur ad. Do commodo sunt exercitation Lorem ea ipsum est veniam esse.\r\n", "meta": { "naam_overledene": "Pearson Barnett", @@ -690,7 +691,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Schiebroek", - "grafnummer": "'133'", + "grafnummer": "133", "vak": "E", "geometrieen": [], } @@ -711,9 +712,9 @@ { "id": 65, "uuid": "a2949ed8-d3c8-4b49-b4b5-bbb6628d8341", - "aangemaakt_op": "2018-07-02T02:52:03 -02:00", - "aangepast_op": "2017-12-24T03:20:33 -01:00", - "origineel_aangemaakt": "2018-03-14T05:18:47 -01:00", + "aangemaakt_op": "2018-07-02T02:52:03", + "aangepast_op": "2017-12-24T03:20:33", + "origineel_aangemaakt": "2018-03-14T05:18:47", "tekst": "Nisi magna excepteur cupidatat ut pariatur deserunt excepteur irure aliquip sint. Aliquip culpa deserunt enim labore do veniam nisi qui. Anim ea do ipsum pariatur consectetur dolore consequat consequat eu non culpa excepteur enim minim. Nisi in mollit irure eu duis adipisicing labore ut non nostrud eiusmod ut proident. Non officia veniam sint laboris eu nostrud. Cillum consectetur consectetur veniam eu exercitation irure in aute anim aute adipisicing aliqua veniam. Amet occaecat amet id consectetur ut aliqua enim ullamco nisi mollit aute sit dolor occaecat.\r\n", "meta": { "naam_overledene": "Stein Hayden", @@ -734,7 +735,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'81'", + "grafnummer": "81", "vak": "D", "geometrieen": [], } @@ -750,9 +751,9 @@ { "id": 161, "uuid": "96c7f0b7-cfc8-4e8a-9e8e-bc29fede2acf", - "aangemaakt_op": "2017-12-05T01:06:58 -01:00", - "aangepast_op": "2014-06-16T09:24:34 -02:00", - "origineel_aangemaakt": "2021-09-26T10:12:27 -02:00", + "aangemaakt_op": "2017-12-05T01:06:58", + "aangepast_op": "2014-06-16T09:24:34", + "origineel_aangemaakt": "2021-09-26T10:12:27", "tekst": "Do nisi cupidatat aute nostrud. Aute pariatur labore magna reprehenderit qui. Minim consequat culpa ea eu ea do quis exercitation irure sint proident duis. Incididunt pariatur officia ut dolor ad ex. Pariatur duis tempor consectetur veniam est cillum aliqua esse ipsum.\r\n", "meta": { "naam_overledene": "Sparks Mccall", @@ -773,7 +774,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "De Zuiderbegraafplaats", - "grafnummer": "'125'", + "grafnummer": "125", "vak": "B", "geometrieen": [], } @@ -794,9 +795,9 @@ { "id": 395, "uuid": "351a59d6-f21e-4ba7-8f3c-e771a8506ce6", - "aangemaakt_op": "2018-08-04T12:46:14 -02:00", - "aangepast_op": "2020-04-10T07:47:30 -02:00", - "origineel_aangemaakt": "2015-12-08T08:02:12 -01:00", + "aangemaakt_op": "2018-08-04T12:46:14", + "aangepast_op": "2020-04-10T07:47:30", + "origineel_aangemaakt": "2015-12-08T08:02:12", "tekst": "Minim cillum veniam adipisicing minim irure enim excepteur nulla minim commodo irure. Laboris ex proident sint laboris tempor nisi aliqua consequat voluptate ut. Cillum labore cupidatat ad excepteur.\r\n", "meta": { "naam_overledene": "Solis Chambers", @@ -817,7 +818,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Crooswijk", - "grafnummer": "'278'", + "grafnummer": "278", "vak": "G", "geometrieen": [], } @@ -833,9 +834,9 @@ { "id": 394, "uuid": "0736fed7-33f2-4adb-8253-7c47034e6ee6", - "aangemaakt_op": "2014-04-03T11:08:21 -02:00", - "aangepast_op": "2018-02-10T07:36:13 -01:00", - "origineel_aangemaakt": "2015-06-20T07:51:07 -02:00", + "aangemaakt_op": "2014-04-03T11:08:21", + "aangepast_op": "2018-02-10T07:36:13", + "origineel_aangemaakt": "2015-06-20T07:51:07", "tekst": "Veniam anim culpa veniam proident ut cupidatat. Culpa mollit proident magna deserunt ipsum fugiat. Consectetur ipsum irure ipsum est quis excepteur cillum. Voluptate exercitation velit esse proident exercitation voluptate tempor tempor labore irure aute adipisicing ut. Excepteur culpa et nisi deserunt proident consectetur aute enim incididunt sint eu ad magna. Sint consectetur ad anim ullamco ut.\r\n", "meta": { "naam_overledene": "Bettye Cherry", @@ -856,7 +857,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "De Zuiderbegraafplaats", - "grafnummer": "'110'", + "grafnummer": "110", "vak": "E", "geometrieen": [], } @@ -872,9 +873,9 @@ { "id": 145, "uuid": "42de4a4e-a58b-4948-b0e0-e47c94c8d9aa", - "aangemaakt_op": "2021-03-17T10:32:18 -01:00", - "aangepast_op": "2015-04-07T02:49:03 -02:00", - "origineel_aangemaakt": "2015-02-01T10:00:14 -01:00", + "aangemaakt_op": "2021-03-17T10:32:18", + "aangepast_op": "2015-04-07T02:49:03", + "origineel_aangemaakt": "2015-02-01T10:00:14", "tekst": "Occaecat nisi nisi tempor enim ipsum elit id pariatur. Nulla nisi aute nulla ea irure esse officia quis exercitation consequat. Do sunt et sunt deserunt qui.\r\n", "meta": { "naam_overledene": "Wilson Bird", @@ -895,7 +896,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Hoek van Holland", - "grafnummer": "'204'", + "grafnummer": "204", "vak": "C", "geometrieen": [], } @@ -911,9 +912,9 @@ { "id": 473, "uuid": "fb2626fb-5aee-49c8-96eb-8d7621151530", - "aangemaakt_op": "2016-08-02T11:12:55 -02:00", - "aangepast_op": "2014-07-03T12:51:45 -02:00", - "origineel_aangemaakt": "2021-05-17T03:19:15 -02:00", + "aangemaakt_op": "2016-08-02T11:12:55", + "aangepast_op": "2014-07-03T12:51:45", + "origineel_aangemaakt": "2021-05-17T03:19:15", "tekst": "Fugiat irure consequat consequat eiusmod. Adipisicing cupidatat esse incididunt dolor voluptate ex laboris. Irure fugiat ullamco laboris magna sunt id nostrud et do ut. Aute officia minim deserunt fugiat culpa et sit officia elit labore excepteur.\r\n", "meta": { "naam_overledene": "Weaver Adams", @@ -934,7 +935,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Rozenburg", - "grafnummer": "'25'", + "grafnummer": "25", "vak": "G", "geometrieen": [], } @@ -965,9 +966,9 @@ { "id": 290, "uuid": "4372ce36-1e01-463f-85db-23ca04a31ce8", - "aangemaakt_op": "2020-04-16T01:53:20 -02:00", - "aangepast_op": "2017-09-03T03:16:23 -02:00", - "origineel_aangemaakt": "2016-10-01T07:55:41 -02:00", + "aangemaakt_op": "2020-04-16T01:53:20", + "aangepast_op": "2017-09-03T03:16:23", + "origineel_aangemaakt": "2016-10-01T07:55:41", "tekst": "Officia excepteur ex cupidatat aliqua esse. Magna aute ullamco sint incididunt exercitation. Labore nulla deserunt incididunt ex nostrud excepteur. Est amet commodo mollit incididunt.\r\n", "meta": { "naam_overledene": "Glenda England", @@ -988,7 +989,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'142'", + "grafnummer": "142", "vak": "A", "geometrieen": [], } @@ -1014,9 +1015,9 @@ { "id": 318, "uuid": "5f652aa9-01a6-49e0-9428-f6409aac8ad9", - "aangemaakt_op": "2021-03-04T08:24:39 -01:00", - "aangepast_op": "2016-08-09T09:06:01 -02:00", - "origineel_aangemaakt": "2014-05-05T09:26:17 -02:00", + "aangemaakt_op": "2021-03-04T08:24:39", + "aangepast_op": "2016-08-09T09:06:01", + "origineel_aangemaakt": "2014-05-05T09:26:17", "tekst": "Nisi qui voluptate eiusmod enim dolore ipsum culpa sit. Fugiat voluptate velit aliqua quis officia cupidatat ea do ex dolore duis adipisicing occaecat nostrud. Cupidatat dolor anim ex amet tempor. Sit nisi irure ea ipsum qui occaecat ipsum cupidatat. Minim ea do deserunt irure et qui nostrud proident velit aliqua elit nostrud.\r\n", "meta": { "naam_overledene": "Morton Wiggins", @@ -1037,7 +1038,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'116'", + "grafnummer": "116", "vak": "F", "geometrieen": [], } @@ -1058,9 +1059,9 @@ { "id": 161, "uuid": "ab1709f0-b559-458b-9f56-b6757486ae4c", - "aangemaakt_op": "2019-07-21T10:54:54 -02:00", - "aangepast_op": "2021-12-09T01:56:27 -01:00", - "origineel_aangemaakt": "2021-06-10T08:39:51 -02:00", + "aangemaakt_op": "2019-07-21T10:54:54", + "aangepast_op": "2021-12-09T01:56:27", + "origineel_aangemaakt": "2021-06-10T08:39:51", "tekst": "Ex proident aute aute magna in quis in proident exercitation aliqua ex dolor deserunt. Incididunt labore Lorem id deserunt in irure velit ut deserunt ullamco. Sunt labore pariatur nulla minim aliqua anim nostrud. Exercitation incididunt in cupidatat id eu. Tempor labore tempor eu ea irure. Aliqua anim cillum pariatur voluptate magna consectetur cillum ut dolore exercitation.\r\n", "meta": { "naam_overledene": "Juliet Peters", @@ -1081,7 +1082,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'203'", + "grafnummer": "203", "vak": "G", "geometrieen": [], } @@ -1102,9 +1103,9 @@ { "id": 283, "uuid": "6b56323e-48a8-4430-b527-5c4da27fc76b", - "aangemaakt_op": "2016-07-26T01:28:04 -02:00", - "aangepast_op": "2015-11-04T03:46:18 -01:00", - "origineel_aangemaakt": "2017-12-21T03:54:18 -01:00", + "aangemaakt_op": "2016-07-26T01:28:04", + "aangepast_op": "2015-11-04T03:46:18", + "origineel_aangemaakt": "2017-12-21T03:54:18", "tekst": "Cupidatat magna sit duis sunt in velit laboris enim dolor. In proident eiusmod nostrud adipisicing elit labore magna culpa incididunt ad cillum proident dolor elit. Culpa do nulla ut anim eu commodo eiusmod sint occaecat nisi. Lorem ad irure sit mollit est sunt ut exercitation dolore non. Est ea aliquip enim id eiusmod occaecat. Mollit ad duis deserunt veniam velit culpa aliquip excepteur cupidatat ea consectetur nostrud excepteur.\r\n", "meta": { "naam_overledene": "Leola Francis", @@ -1125,7 +1126,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'289'", + "grafnummer": "289", "vak": "B", "geometrieen": [], } @@ -1146,9 +1147,9 @@ { "id": 391, "uuid": "4e38f247-594d-4f7f-a177-a7bbfaac17b3", - "aangemaakt_op": "2017-04-06T07:53:41 -02:00", - "aangepast_op": "2020-02-12T05:45:01 -01:00", - "origineel_aangemaakt": "2016-05-21T08:47:08 -02:00", + "aangemaakt_op": "2017-04-06T07:53:41", + "aangepast_op": "2020-02-12T05:45:01", + "origineel_aangemaakt": "2016-05-21T08:47:08", "tekst": "Nulla nisi non laborum cillum. Velit ex cupidatat id amet reprehenderit reprehenderit ut eu in. Veniam reprehenderit aliqua dolor do tempor non ullamco qui. Do ut laboris aute laborum qui ex cupidatat sit nulla Lorem ad aute labore dolor.\r\n", "meta": { "naam_overledene": "Bettie Mercer", @@ -1169,7 +1170,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'137'", + "grafnummer": "137", "vak": "E", "geometrieen": [], } @@ -1190,9 +1191,9 @@ { "id": 109, "uuid": "71bffefd-24e1-4f81-bd22-813c435f9a3f", - "aangemaakt_op": "2014-06-30T05:02:35 -02:00", - "aangepast_op": "2019-08-25T06:41:57 -02:00", - "origineel_aangemaakt": "2014-06-26T09:32:03 -02:00", + "aangemaakt_op": "2014-06-30T05:02:35", + "aangepast_op": "2019-08-25T06:41:57", + "origineel_aangemaakt": "2014-06-26T09:32:03", "tekst": "Ea proident Lorem sint pariatur exercitation veniam duis. Eiusmod tempor irure labore Lorem cillum anim Lorem culpa duis anim. Pariatur minim dolore cupidatat ullamco consequat cupidatat ad cupidatat nisi elit non consectetur ex id. Voluptate sit sint duis anim nostrud aute. Minim eu dolore elit officia cillum officia irure. Mollit fugiat minim incididunt sint duis cupidatat aliquip.\r\n", "meta": { "naam_overledene": "Cathy Spence", @@ -1213,7 +1214,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'109'", + "grafnummer": "109", "vak": "G", "geometrieen": [], } @@ -1234,9 +1235,9 @@ { "id": 349, "uuid": "bf422202-186b-48e7-84e1-4b9d5c74e61a", - "aangemaakt_op": "2014-08-20T12:49:32 -02:00", - "aangepast_op": "2016-03-20T02:58:02 -01:00", - "origineel_aangemaakt": "2015-05-26T02:31:09 -02:00", + "aangemaakt_op": "2014-08-20T12:49:32", + "aangepast_op": "2016-03-20T02:58:02", + "origineel_aangemaakt": "2015-05-26T02:31:09", "tekst": "Irure commodo sit quis nisi dolor in ullamco est eu incididunt proident. Dolor est reprehenderit cillum do aliquip amet velit laborum ipsum. Pariatur exercitation mollit ad eiusmod qui deserunt occaecat esse ea. Aliquip consectetur commodo enim ad proident aute anim. Tempor minim deserunt labore cillum officia magna mollit irure proident et voluptate do. Non tempor nisi anim laborum nostrud adipisicing eiusmod consectetur in nulla incididunt ut velit duis.\r\n", "meta": { "naam_overledene": "Faye Emerson", @@ -1257,7 +1258,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Hoogvliet", - "grafnummer": "'39'", + "grafnummer": "39", "vak": "D", "geometrieen": [], } @@ -1278,9 +1279,9 @@ { "id": 452, "uuid": "e17d8758-8192-4d1d-ab70-4bae9a1b7b21", - "aangemaakt_op": "2021-03-10T06:40:59 -01:00", - "aangepast_op": "2014-07-17T04:11:04 -02:00", - "origineel_aangemaakt": "2018-06-24T06:14:11 -02:00", + "aangemaakt_op": "2021-03-10T06:40:59", + "aangepast_op": "2014-07-17T04:11:04", + "origineel_aangemaakt": "2018-06-24T06:14:11", "tekst": "Id cupidatat enim do nulla pariatur eiusmod ex velit minim cupidatat exercitation nulla sunt occaecat. Deserunt dolore mollit tempor est ipsum enim veniam sunt adipisicing. Proident sint eu nostrud cupidatat consequat ex irure fugiat ea ipsum aliqua nulla ad. Commodo non culpa sint sint elit est. Commodo magna est anim eiusmod deserunt ad sint adipisicing ullamco anim. Magna minim cillum excepteur amet officia ullamco excepteur excepteur ullamco mollit.\r\n", "meta": { "naam_overledene": "Lee Levy", @@ -1301,7 +1302,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Schiebroek", - "grafnummer": "'86'", + "grafnummer": "86", "vak": "C", "geometrieen": [], } @@ -1322,9 +1323,9 @@ { "id": 411, "uuid": "18e8b3a2-b24f-4e6d-8940-5de1f57406ec", - "aangemaakt_op": "2017-09-22T09:14:44 -02:00", - "aangepast_op": "2015-08-12T07:03:13 -02:00", - "origineel_aangemaakt": "2019-03-26T05:13:33 -01:00", + "aangemaakt_op": "2017-09-22T09:14:44", + "aangepast_op": "2015-08-12T07:03:13", + "origineel_aangemaakt": "2019-03-26T05:13:33", "tekst": "Quis Lorem excepteur enim anim sint ex elit consequat amet et. Aliquip voluptate ea id voluptate aliquip cupidatat in. Enim tempor pariatur proident exercitation anim nostrud officia ea. Ut sint nulla do adipisicing tempor.\r\n", "meta": { "naam_overledene": "Holmes Lindsay", @@ -1345,7 +1346,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Overschie", - "grafnummer": "'196'", + "grafnummer": "196", "vak": "B", "geometrieen": [], } @@ -1361,9 +1362,9 @@ { "id": 369, "uuid": "f19d17f7-a8eb-4066-97f7-7ba60d0a36e9", - "aangemaakt_op": "2019-06-24T07:44:26 -02:00", - "aangepast_op": "2022-07-16T12:10:50 -02:00", - "origineel_aangemaakt": "2018-05-02T10:59:07 -02:00", + "aangemaakt_op": "2019-06-24T07:44:26", + "aangepast_op": "2022-07-16T12:10:50", + "origineel_aangemaakt": "2018-05-02T10:59:07", "tekst": "Nostrud excepteur ipsum culpa deserunt proident incididunt aute aute eiusmod. Exercitation amet minim consequat consequat minim tempor aliqua enim labore mollit dolor sint non fugiat. Sunt qui et laborum eu culpa voluptate sint aute fugiat nulla anim aliqua. Ut nostrud voluptate id veniam cillum sunt veniam voluptate deserunt voluptate irure cillum commodo ut.\r\n", "meta": { "naam_overledene": "Bradley Larsen", @@ -1384,7 +1385,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "De Zuiderbegraafplaats", - "grafnummer": "'276'", + "grafnummer": "276", "vak": "G", "geometrieen": [], } @@ -1405,9 +1406,9 @@ { "id": 267, "uuid": "59ded033-8ffa-4ca1-9910-efc069bedfd1", - "aangemaakt_op": "2023-01-16T08:50:15 -01:00", - "aangepast_op": "2023-01-14T07:02:36 -01:00", - "origineel_aangemaakt": "2017-02-27T09:40:51 -01:00", + "aangemaakt_op": "2023-01-16T08:50:15", + "aangepast_op": "2023-01-14T07:02:36", + "origineel_aangemaakt": "2017-02-27T09:40:51", "tekst": "Magna elit aliqua cupidatat labore culpa quis id. Amet aliqua culpa consequat officia deserunt cupidatat est cupidatat consectetur id. Anim minim magna nostrud magna nulla consectetur amet mollit. Do veniam cupidatat eu elit aliquip ex Lorem consequat minim. Proident sunt elit sint laboris deserunt sit esse velit fugiat nostrud. Incididunt eu aliqua amet anim reprehenderit sint sit elit culpa esse.\r\n", "meta": { "naam_overledene": "Lawson Rogers", @@ -1428,7 +1429,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Rozenburg", - "grafnummer": "'174'", + "grafnummer": "174", "vak": "E", "geometrieen": [], } @@ -1444,9 +1445,9 @@ { "id": 76, "uuid": "d4b8e517-a022-4ed7-85ef-9755938d3ca0", - "aangemaakt_op": "2015-09-23T03:11:21 -02:00", - "aangepast_op": "2020-11-01T05:46:10 -01:00", - "origineel_aangemaakt": "2019-06-08T01:04:20 -02:00", + "aangemaakt_op": "2015-09-23T03:11:21", + "aangepast_op": "2020-11-01T05:46:10", + "origineel_aangemaakt": "2019-06-08T01:04:20", "tekst": "Quis cillum labore dolor culpa commodo voluptate esse cillum culpa anim laboris sit qui. Proident ad occaecat aliqua eiusmod amet in labore nulla eu aliqua. Aliquip eu laborum amet adipisicing Lorem eiusmod esse laborum ex nisi excepteur aliquip.\r\n", "meta": { "naam_overledene": "Alison Meadows", @@ -1467,7 +1468,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'65'", + "grafnummer": "65", "vak": "F", "geometrieen": [], } @@ -1483,9 +1484,9 @@ { "id": 362, "uuid": "247daca1-6d2b-4a00-9fc9-71911607d75d", - "aangemaakt_op": "2021-11-06T04:15:21 -01:00", - "aangepast_op": "2017-05-13T07:38:44 -02:00", - "origineel_aangemaakt": "2020-11-08T02:39:07 -01:00", + "aangemaakt_op": "2021-11-06T04:15:21", + "aangepast_op": "2017-05-13T07:38:44", + "origineel_aangemaakt": "2020-11-08T02:39:07", "tekst": "Do ullamco in esse ullamco nisi. Mollit est reprehenderit aliquip sit commodo fugiat cillum nisi officia veniam id laborum. Exercitation mollit tempor fugiat Lorem minim tempor. Proident consequat sint duis mollit exercitation elit fugiat incididunt commodo incididunt. Veniam consequat est eu eu laborum proident exercitation sint Lorem duis eiusmod ea anim irure. Ipsum cupidatat do et magna labore.\r\n", "meta": { "naam_overledene": "Rhodes Moss", @@ -1506,7 +1507,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Hoogvliet", - "grafnummer": "'184'", + "grafnummer": "184", "vak": "D", "geometrieen": [], } @@ -1552,9 +1553,9 @@ { "id": 497, "uuid": "0443b92e-4777-41a0-8a63-a110050ccee2", - "aangemaakt_op": "2016-06-14T12:05:24 -02:00", - "aangepast_op": "2020-08-18T05:23:57 -02:00", - "origineel_aangemaakt": "2019-10-09T11:22:37 -02:00", + "aangemaakt_op": "2016-06-14T12:05:24", + "aangepast_op": "2020-08-18T05:23:57", + "origineel_aangemaakt": "2019-10-09T11:22:37", "tekst": "Adipisicing excepteur ullamco et ex Lorem nulla aliqua. Exercitation Lorem qui est dolore ullamco pariatur consectetur Lorem ea dolore officia nisi minim amet. Ullamco esse nostrud consequat commodo nulla occaecat Lorem.\r\n", "meta": { "naam_overledene": "Figueroa Gay", @@ -1575,7 +1576,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "De Zuiderbegraafplaats", - "grafnummer": "'80'", + "grafnummer": "80", "vak": "E", "geometrieen": [], } @@ -1591,9 +1592,9 @@ { "id": 133, "uuid": "7df26ac1-ae81-4361-8496-c1e199478089", - "aangemaakt_op": "2022-09-28T02:15:57 -02:00", - "aangepast_op": "2023-01-17T04:08:58 -01:00", - "origineel_aangemaakt": "2014-11-26T02:31:38 -01:00", + "aangemaakt_op": "2022-09-28T02:15:57", + "aangepast_op": "2023-01-17T04:08:58", + "origineel_aangemaakt": "2014-11-26T02:31:38", "tekst": "Eiusmod nulla non sunt incididunt sint minim veniam nulla non ullamco. Consectetur adipisicing ut elit consequat consectetur magna aliquip eu nisi ullamco non. Nisi adipisicing fugiat voluptate enim incididunt duis fugiat. Irure do ut sint deserunt ipsum ullamco. Occaecat enim laborum consectetur mollit aliqua ipsum.\r\n", "meta": { "naam_overledene": "Marguerite Matthews", @@ -1614,7 +1615,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Schiebroek", - "grafnummer": "'200'", + "grafnummer": "200", "vak": "A", "geometrieen": [], } @@ -1630,9 +1631,9 @@ { "id": 444, "uuid": "2888b347-d7cd-492c-8892-91cd660e2c7e", - "aangemaakt_op": "2018-07-24T12:18:08 -02:00", - "aangepast_op": "2014-01-18T04:00:08 -01:00", - "origineel_aangemaakt": "2018-05-21T10:11:56 -02:00", + "aangemaakt_op": "2018-07-24T12:18:08", + "aangepast_op": "2014-01-18T04:00:08", + "origineel_aangemaakt": "2018-05-21T10:11:56", "tekst": "In non ullamco nisi veniam nostrud est veniam non aliqua qui tempor. Officia et duis labore deserunt laboris laboris. Aute commodo laborum fugiat ut consectetur Lorem labore. Pariatur fugiat reprehenderit ullamco excepteur. Ad elit Lorem pariatur labore nisi proident Lorem veniam commodo laboris. Cupidatat est magna ipsum non. Dolore occaecat dolor commodo pariatur occaecat adipisicing tempor laboris duis.\r\n", "meta": { "naam_overledene": "Angela Gilliam", @@ -1653,7 +1654,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats en crematorium Hofwijk", - "grafnummer": "'56'", + "grafnummer": "56", "vak": "D", "geometrieen": [], } @@ -1669,9 +1670,9 @@ { "id": 132, "uuid": "925b2128-5061-4fb8-8ae0-7102545249a9", - "aangemaakt_op": "2019-08-16T01:10:36 -02:00", - "aangepast_op": "2015-08-07T05:00:52 -02:00", - "origineel_aangemaakt": "2016-08-11T09:15:48 -02:00", + "aangemaakt_op": "2019-08-16T01:10:36", + "aangepast_op": "2015-08-07T05:00:52", + "origineel_aangemaakt": "2016-08-11T09:15:48", "tekst": "Quis commodo duis veniam ad ut ea cupidatat non ex nisi minim qui. Dolor est adipisicing minim do commodo eu sunt nisi aliquip adipisicing. Aliqua consectetur in eiusmod ullamco dolore est ut ad deserunt elit veniam fugiat. Consectetur elit non aliqua laborum ex nulla anim duis ex laboris aliqua. Cupidatat excepteur qui exercitation dolor aute sint dolore eiusmod. Non ut ipsum ad veniam tempor occaecat in nulla et deserunt. Laboris anim velit ad sint labore ad ullamco minim do consequat in dolore sint veniam.\r\n", "meta": { "naam_overledene": "Jane Foster", @@ -1692,7 +1693,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oudeland, Hoogvliet", - "grafnummer": "'299'", + "grafnummer": "299", "vak": "F", "geometrieen": [], } @@ -1738,9 +1739,9 @@ { "id": 477, "uuid": "0801ee9f-9bfe-4e59-975e-028f9a9179c9", - "aangemaakt_op": "2022-05-07T06:55:15 -02:00", - "aangepast_op": "2018-10-20T07:15:19 -02:00", - "origineel_aangemaakt": "2020-12-24T02:20:04 -01:00", + "aangemaakt_op": "2022-05-07T06:55:15", + "aangepast_op": "2018-10-20T07:15:19", + "origineel_aangemaakt": "2020-12-24T02:20:04", "tekst": "Excepteur cillum aliqua et laborum. Nulla sunt reprehenderit elit labore elit pariatur voluptate aute labore. Ipsum deserunt sit Lorem adipisicing laboris ea et labore incididunt ut et sint qui.\r\n", "meta": { "naam_overledene": "Angelia Leblanc", @@ -1761,7 +1762,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Pernis", - "grafnummer": "'293'", + "grafnummer": "293", "vak": "C", "geometrieen": [], } @@ -1822,9 +1823,9 @@ { "id": 382, "uuid": "c7e70076-e252-41b6-ae7c-0b8b296ec8e6", - "aangemaakt_op": "2022-08-10T02:34:34 -02:00", - "aangepast_op": "2021-06-23T05:00:05 -02:00", - "origineel_aangemaakt": "2015-04-07T08:46:27 -02:00", + "aangemaakt_op": "2022-08-10T02:34:34", + "aangepast_op": "2021-06-23T05:00:05", + "origineel_aangemaakt": "2015-04-07T08:46:27", "tekst": "Laboris elit excepteur exercitation ullamco labore culpa. Incididunt est est ea excepteur eu consectetur nulla sint excepteur sit. Reprehenderit adipisicing excepteur laboris reprehenderit incididunt enim magna. Ea sint aute Lorem fugiat adipisicing ad ea voluptate aute. Tempor non sunt velit culpa commodo.\r\n", "meta": { "naam_overledene": "Muriel Perez", @@ -1845,7 +1846,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Rozenburg", - "grafnummer": "'294'", + "grafnummer": "294", "vak": "C", "geometrieen": [], } @@ -1891,9 +1892,9 @@ { "id": 39, "uuid": "3d080670-1ce1-4f38-a2de-930b9c66c112", - "aangemaakt_op": "2022-09-08T04:44:46 -02:00", - "aangepast_op": "2017-11-23T02:23:10 -01:00", - "origineel_aangemaakt": "2019-03-04T05:11:39 -01:00", + "aangemaakt_op": "2022-09-08T04:44:46", + "aangepast_op": "2017-11-23T02:23:10", + "origineel_aangemaakt": "2019-03-04T05:11:39", "tekst": "Consequat quis esse magna irure sint quis nisi amet anim excepteur ad in. Quis nostrud occaecat irure deserunt laborum non magna sint sunt. Irure in occaecat ea aliqua ut incididunt consequat deserunt commodo sint et irure exercitation incididunt. Ea nostrud proident est nisi do. Sit sit laborum deserunt velit culpa proident minim irure dolor duis ad. Officia cillum do ipsum eiusmod deserunt aliqua dolor dolore dolore commodo nulla nostrud deserunt quis.\r\n", "meta": { "naam_overledene": "Rosalind Jacobs", @@ -1914,7 +1915,7 @@ "bron": "geselecteerd_door_gebruiker", "plaatsnaam": "Rotterdam", "begraafplaats": "Begraafplaats Oud-Pernis", - "grafnummer": "'132'", + "grafnummer": "132", "vak": "D", "geometrieen": [], } diff --git a/app/apps/regie/templates/base.html b/app/apps/regie/templates/base.html index 6f6c6525..b6f17f9b 100644 --- a/app/apps/regie/templates/base.html +++ b/app/apps/regie/templates/base.html @@ -5,17 +5,39 @@