diff --git a/AKModel/models.py b/AKModel/models.py index a612f49e9ac2f1f24876fc56f1260c3fa2c2de7b..27075105b2910f6aebf77039a83afe17939f13b5 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -4,7 +4,7 @@ import json import math from dataclasses import dataclass from datetime import datetime, timedelta -from typing import Iterable, Generator +from typing import Any, Iterable, Generator from django.db import models, transaction from django.apps import apps @@ -889,7 +889,7 @@ class Room(models.Model): def __str__(self): return self.title - def as_json(self) -> str: + def as_json_dict(self) -> dict[str, Any]: """Return a json string representation of this room object. :return: The json string representation is constructed @@ -924,7 +924,7 @@ class Room(models.Model): if not any(constr.startswith("proxy") for constr in data["fulfilled_room_constraints"]): data["fulfilled_room_constraints"].append("no-proxy") - return json.dumps(data) + return data class AKSlot(models.Model): @@ -1021,7 +1021,7 @@ class AKSlot(models.Model): self.duration = min(self.duration, event_duration_hours) super().save(force_insert, force_update, using, update_fields) - def as_json(self) -> str: + def as_json_dict(self) -> dict[str, Any]: """Return a json string representation of the AK object of this slot. :return: The json string representation is constructed @@ -1093,7 +1093,7 @@ class AKSlot(models.Model): if not any(constr.startswith("proxy") for constr in data["room_constraints"]): data["room_constraints"].append("no-proxy") - return json.dumps(data) + return data class AKOrgaMessage(models.Model): """ diff --git a/AKModel/templates/admin/AKModel/ak_json_export.html b/AKModel/templates/admin/AKModel/ak_json_export.html index 38e5526edc8364faf75491e68cb893b10d64751a..65e459a5b3f7509ed98a1329e2d89f06fa2abb54 100644 --- a/AKModel/templates/admin/AKModel/ak_json_export.html +++ b/AKModel/templates/admin/AKModel/ak_json_export.html @@ -3,18 +3,18 @@ {% load tz %} {% block content %} + +<p> +Exported JSON: +<pre> +{{ json_data_oneline }} +</pre> +</p> + +<p> +Exported JSON (indented for better readability): <pre> - {"aks": [ - {% for slot in slots %}{{ slot.as_json }}{% if not forloop.last %}, - {% endif %}{% endfor %} - ], - "rooms": [ - {% for room in rooms %}{{ room.as_json }}{% if not forloop.last %}, - {% endif %}{% endfor %} - ], - "participants": {{ participants }}, - "timeslots": {{ timeslots }}, - "info": {{ info_dict }} - } +{{ json_data }} </pre> +</p> {% endblock %} diff --git a/AKModel/views/ak.py b/AKModel/views/ak.py index 40a6e10201b69784e27d20e53a8209fd07ecf430..518ddbb52f5cb7da144fdfccbd9926ef21e87b0f 100644 --- a/AKModel/views/ak.py +++ b/AKModel/views/ak.py @@ -86,16 +86,14 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["participants"] = json.dumps([]) - - rooms = Room.objects.filter(event=self.event) - context["rooms"] = rooms timeslots = { "info": {"duration": float(self.event.export_slot)}, "blocks": [], } + rooms = Room.objects.filter(event=self.event) + ak_availabilities = { ak.pk: Availability.union(ak.availabilities.all()) for ak in AK.objects.filter(event=self.event).all() @@ -179,17 +177,25 @@ class AKJSONExportView(AdminViewMixin, FilterByEventSlugMixin, ListView): timeslots["info"]["blocknames"] = block_names - context["timeslots"] = json.dumps(timeslots) - info_dict = { "title": self.event.name, "slug": self.event.slug } + for attr in ["contact_email", "place"]: if hasattr(self.event, attr) and getattr(self.event, attr): info_dict[attr] = getattr(self.event, attr) - context["info_dict"] = json.dumps(info_dict) + data = { + "participants": [], + "rooms": [r.as_json_dict() for r in rooms], + "timeslots": timeslots, + "info": info_dict, + "aks": [ak.as_json_dict() for ak in context["slots"]], + } + + context["json_data_oneline"] = json.dumps(data) + context["json_data"] = json.dumps(data, indent=2) return context