Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • konstantin/akplanning
  • matedealer/akplanning
  • kif/akplanning
  • mirco/akplanning
  • lordofthevoid/akplanning
  • voidptr/akplanning
  • xayomer/akplanning-fork
  • mollux/akplanning
  • neumantm/akplanning
  • mmarx/akplanning
  • nerf/akplanning
  • felix_bonn/akplanning
  • sebastian.uschmann/akplanning
13 results
Show changes
Showing
with 268 additions and 60 deletions
......@@ -138,10 +138,18 @@ class EventAKsWidget(TemplateStatusWidget):
"text": _("Manage ak tracks"),
"url": reverse_lazy("admin:tracks_manage", kwargs={"event_slug": context["event"].slug}),
},
{
"text": _("Import AK schedule from JSON"),
"url": reverse_lazy("admin:ak_schedule_json_import", kwargs={"event_slug": context["event"].slug}),
},
{
"text": _("Export AKs as CSV"),
"url": reverse_lazy("admin:ak_csv_export", kwargs={"event_slug": context["event"].slug}),
},
{
"text": _("Export AKs as JSON"),
"url": reverse_lazy("admin:ak_json_export", kwargs={"event_slug": context["event"].slug}),
},
{
"text": _("Export AKs for Wiki"),
"url": reverse_lazy("admin:ak_wiki_export", kwargs={"slug": context["event"].slug}),
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-15 20:03+0200\n"
"POT-Creation-Date: 2024-05-27 01:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -38,7 +38,7 @@ msgstr "Veranstaltung"
#: AKPlan/templates/AKPlan/plan_index.html:59
#: AKPlan/templates/AKPlan/plan_room.html:13
#: AKPlan/templates/AKPlan/plan_room.html:59
#: AKPlan/templates/AKPlan/plan_wall.html:65
#: AKPlan/templates/AKPlan/plan_wall.html:67
msgid "Room"
msgstr "Raum"
......@@ -63,12 +63,12 @@ msgid "AK Wall"
msgstr "AK-Wall"
#: AKPlan/templates/AKPlan/plan_index.html:130
#: AKPlan/templates/AKPlan/plan_wall.html:130
#: AKPlan/templates/AKPlan/plan_wall.html:132
msgid "Current AKs"
msgstr "Aktuelle AKs"
#: AKPlan/templates/AKPlan/plan_index.html:137
#: AKPlan/templates/AKPlan/plan_wall.html:135
#: AKPlan/templates/AKPlan/plan_wall.html:137
msgid "Next AKs"
msgstr "Nächste AKs"
......@@ -99,7 +99,7 @@ msgstr "Eigenschaften"
msgid "Track"
msgstr "Track"
#: AKPlan/templates/AKPlan/plan_wall.html:145
#: AKPlan/templates/AKPlan/plan_wall.html:147
msgid "Reload page automatically?"
msgstr "Seite automatisch neu laden?"
......
from django.test import TestCase
from AKModel.tests import BasicViewTests
from AKModel.tests.test_views import BasicViewTests
class PlanViewTests(BasicViewTests, TestCase):
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-08-16 16:30+0200\n"
"POT-Creation-Date: 2024-05-27 01:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -17,10 +17,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: AKPlanning/settings.py:148
#: AKPlanning/settings.py:147
msgid "German"
msgstr "Deutsch"
#: AKPlanning/settings.py:149
#: AKPlanning/settings.py:148
msgid "English"
msgstr "Englisch"
......@@ -55,7 +55,9 @@ class EventsView(LoginRequiredMixin, EventSlugMixin, ListView):
model = AKSlot
def get_queryset(self):
return super().get_queryset().select_related('ak').filter(event=self.event, room__isnull=False)
return super().get_queryset().select_related('ak').filter(
event=self.event, room__isnull=False, start__isnull=False
)
def render_to_response(self, context, **response_kwargs):
return JsonResponse(
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-25 00:24+0200\n"
"POT-Creation-Date: 2025-02-27 15:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -27,14 +27,14 @@ msgstr "Ende"
#: AKScheduling/forms.py:26
msgid "Duration"
msgstr ""
msgstr "Dauer"
#: AKScheduling/forms.py:27
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:171
#: AKScheduling/forms.py:27 AKScheduling/forms.py:28
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:172
msgid "Room"
msgstr "Raum"
#: AKScheduling/forms.py:31
#: AKScheduling/forms.py:32
msgid "AK"
msgstr "AK"
......@@ -62,13 +62,13 @@ msgstr ""
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:44
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:105
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:240
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:375
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:241
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:378
msgid "No violations"
msgstr "Keine Verletzungen"
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:82
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:346
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:347
msgid "Violation(s)"
msgstr "Verletzung(en)"
......@@ -81,12 +81,12 @@ msgid "Reload now"
msgstr "Jetzt neu laden"
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:95
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:228
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:229
msgid "Violation"
msgstr "Verletzung"
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:96
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:369
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:372
msgid "Problem"
msgstr "Problem"
......@@ -100,13 +100,14 @@ msgstr "Seit"
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:111
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:256
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:332
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:48
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:333
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:58
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:34
msgid "Event Status"
msgstr "Event-Status"
#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:113
#: AKScheduling/views.py:50
msgid "Scheduling"
msgstr "Scheduling"
......@@ -116,7 +117,7 @@ msgstr "Abschicken"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:11
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:21
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:329
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:330
msgid "Scheduling for"
msgstr "Scheduling für"
......@@ -168,31 +169,31 @@ msgstr "Event (horizontal)"
msgid "Event (Vertical)"
msgstr "Event (vertikal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:271
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:272
msgid "Please choose AK"
msgstr "Bitte AK auswählen"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:291
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:292
msgid "Could not create slot"
msgstr "Konnte Slot nicht anlegen"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:307
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:308
msgid "Add slot"
msgstr "Slot hinzufügen"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:315
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:316
msgid "Add"
msgstr "Hinzufügen"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:316
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:317
msgid "Cancel"
msgstr "Abbrechen"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:343
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:344
msgid "Unscheduled"
msgstr "Nicht gescheduled"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:368
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:371
msgid "Level"
msgstr "Level"
......@@ -200,23 +201,23 @@ msgstr "Level"
msgid "AKs with public notes"
msgstr "AKs mit öffentlichen Kommentaren"
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:21
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:24
msgid "AKs without availabilities"
msgstr "AKs ohne Verfügbarkeiten"
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:28
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:33
msgid "Create default availabilities"
msgstr "Standardverfügbarkeiten anlegen"
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:31
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:36
msgid "AK wishes with slots"
msgstr "AK-Wünsche mit Slots"
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:38
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:46
msgid "Delete slots for wishes"
msgstr ""
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:40
#: AKScheduling/templates/admin/AKScheduling/special_attention.html:48
msgid "AKs without slots"
msgstr "AKs ohne Slots"
......@@ -239,6 +240,7 @@ msgstr[1] ""
" "
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:7
#: AKScheduling/views.py:25
msgid "Unscheduled AK Slots"
msgstr "Noch nicht geschedulte AK-Slots"
......@@ -246,19 +248,31 @@ msgstr "Noch nicht geschedulte AK-Slots"
msgid "Count"
msgstr "Anzahl"
#: AKScheduling/views.py:150
#: AKScheduling/views.py:91
msgid "Constraint violations for"
msgstr "Constraintverletzungen für"
#: AKScheduling/views.py:106
msgid "AKs requiring special attention for"
msgstr "AKs die besondere Aufmerksamkeit erfordern für"
#: AKScheduling/views.py:152
msgid "Interest updated"
msgstr "Interesse aktualisiert"
#: AKScheduling/views.py:201
#: AKScheduling/views.py:166
msgid "Enter interest"
msgstr "Interesse eingeben"
#: AKScheduling/views.py:210
msgid "Wishes"
msgstr "Wünsche"
#: AKScheduling/views.py:219
#: AKScheduling/views.py:228
msgid "Cleanup: Delete unscheduled slots for wishes"
msgstr "Aufräumen: Noch nicht geplante Slots für Wünsche löschen"
#: AKScheduling/views.py:226
#: AKScheduling/views.py:235
#, python-brace-format
msgid ""
"The following {count} unscheduled slots of wishes will be deleted:\n"
......@@ -270,15 +284,15 @@ msgstr ""
"\n"
" {slots}"
#: AKScheduling/views.py:233
#: AKScheduling/views.py:242
msgid "Unscheduled slots for wishes successfully deleted"
msgstr "Noch nicht geplante Slots für Wünsche erfolgreich gelöscht"
#: AKScheduling/views.py:247
#: AKScheduling/views.py:256
msgid "Create default availabilities for AKs"
msgstr "Standardverfügbarkeiten für AKs anlegen"
#: AKScheduling/views.py:254
#: AKScheduling/views.py:263
#, python-brace-format
msgid ""
"The following {count} AKs don't have any availability information. Create "
......@@ -291,17 +305,17 @@ msgstr ""
"\n"
" {aks}"
#: AKScheduling/views.py:274
#: AKScheduling/views.py:283
#, python-brace-format
msgid "Could not create default availabilities for AK: {ak}"
msgstr "Konnte keine Verfügbarkeit anlegen für AK: {ak}"
#: AKScheduling/views.py:279
#: AKScheduling/views.py:288
#, python-brace-format
msgid "Created default availabilities for {count} AKs"
msgstr "Standardverfügbarkeiten für {count} AKs angelegt"
#: AKScheduling/views.py:290
#: AKScheduling/views.py:299
msgid "Constraint Violations"
msgstr "Constraintverletzungen"
......
......@@ -288,6 +288,8 @@ def ak_requirements_changed_handler(sender, instance: AK, action: str, **kwargs)
for slot in slots_of_this_ak:
room = slot.room
if room is None:
continue
room_requirements = room.properties.all()
for requirement in instance.requirements.all():
......@@ -363,8 +365,8 @@ def akslot_changed_handler(sender, instance: AKSlot, **kwargs):
new_violations = []
# For all slots in this room...
if instance.room:
for other_slot in instance.room.akslot_set.all():
if instance.room and instance.start:
for other_slot in instance.room.akslot_set.filter(start__isnull=False):
if other_slot != instance:
# ... find overlapping slots...
if instance.overlaps(other_slot):
......
......@@ -4,7 +4,7 @@ from datetime import timedelta
from django.test import TestCase
from django.utils import timezone
from AKModel.tests import BasicViewTests
from AKModel.tests.test_views import BasicViewTests
from AKModel.models import AKSlot, Event, Room
class ModelViewTests(BasicViewTests, TestCase):
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-25 22:33+0100\n"
"POT-Creation-Date: 2025-02-27 15:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -414,6 +414,10 @@ msgstr ""
msgid "Currently planned AKs"
msgstr "Aktuell geplante AKs"
#: AKSubmission/views.py:233
msgid "AKs with Track"
msgstr "AK mit Track"
#: AKSubmission/views.py:302
msgid "Event inactive. Cannot create or update."
msgstr "Event inaktiv. Hinzufügen/Bearbeiten nicht möglich."
......
......@@ -5,7 +5,7 @@ from django.urls import reverse_lazy
from django.utils.datetime_safe import datetime
from AKModel.models import AK, AKSlot, Event
from AKModel.tests import BasicViewTests
from AKModel.tests.test_views import BasicViewTests
from AKSubmission.forms import AKSubmissionForm
......
......@@ -10,7 +10,7 @@ setup.
### System Requirements
* Python 3.8+ incl. development tools
* Python 3.10+ incl. development tools
* Virtualenv
* pdflatex & beamer
class (`texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-extra texlive-luatex`)
......@@ -37,7 +37,7 @@ Python requirements are listed in ``requirements.txt``. They can be installed wi
### Manual Setup
1. setup a virtual environment using the proper python version ``virtualenv venv -p python3.7``
1. setup a virtual environment using the proper python version ``virtualenv venv -p python3.10``
1. activate virtualenv ``source venv/bin/activate``
1. install python requirements ``pip install -r requirements.txt``
1. setup necessary database tables etc. ``python manage.py migrate``
......@@ -68,7 +68,7 @@ is not stored in any repository or similar, and disable DEBUG mode (``settings.p
1. create a folder, e.g. ``mkdir /srv/AKPlanning/``
1. change to the new directory ``cd /srv/AKPlanning/``
1. clone this repository ``git clone URL .``
1. setup a virtual environment using the proper python version ``virtualenv venv -p python3.7``
1. setup a virtual environment using the proper python version ``virtualenv venv -p python3.10``
1. activate virtualenv ``source venv/bin/activate``
1. update tools ``pip install --upgrade setuptools pip wheel``
1. install python requirements ``pip install -r requirements.txt``
......
......@@ -10,7 +10,7 @@ rm -rf venv/
# Setup Python Environment
# Requires: Virtualenv, appropriate Python installation
virtualenv venv -p python3.9
virtualenv venv -p python3.10
source venv/bin/activate
pip install --upgrade setuptools pip wheel
pip install -r requirements.txt
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-08-16 16:30+0200\n"
"POT-Creation-Date: 2025-02-27 15:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -18,24 +18,24 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: templates/base.html:43
#: templates/base.html:44
msgid ""
"Are you sure you want to change the language now? This will clear the form!"
msgstr "Wirklich jetzt die Sprache ändern? Das wird das Formular zurücksetzen!"
#: templates/base.html:108
#: templates/base.html:109
msgid "Go to backend"
msgstr "Zum Backend"
#: templates/base.html:109
#: templates/base.html:110
msgid "Docs"
msgstr "Doku"
#: templates/base.html:115
#: templates/base.html:116
msgid "Impress"
msgstr "Impressum"
#: templates/base.html:118
#: templates/base.html:119
msgid "This software is open source"
msgstr "Diese Software ist Open Source"
......
......@@ -16,6 +16,7 @@ django-libsass==0.9
django-betterforms==2.0.0
mysqlclient==2.2.0 # for production deployment
tzdata==2024.1
jsonschema==4.23.0
# Documentation
sphinxcontrib-django==2.5
......
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/ak.schema.json",
"title": "AK",
"type": "object",
"properties": {
"id": {
"$ref": "/schema/common/id.schema.json",
"description": "The unique identifier of an AK"
},
"duration": {
"description": "The number of consecutive slot units",
"type": "integer",
"exclusiveMinimum": 0
},
"room_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Room constraints required by this AK"
},
"time_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Time constraints required by this AK"
},
"properties": {
"type": "object",
"properties": {
"conflicts": {
"$ref": "/schema/common/id_array.schema.json",
"description": "IDs of all AKs that are in conflict with this AK"
},
"dependencies": {
"$ref": "/schema/common/id_array.schema.json",
"description": "IDs of all AKs that should be scheduled before this AK"
}
},
"required": ["conflicts", "dependencies"],
"additionalProperties": false
},
"info": {
"type": "object",
"properties": {
"name": {"description": "Name of the AK", "type": "string"},
"head": {"description": "Name of the head of the AK", "type": "string"},
"description": {"description": "Short description of the AK", "type": "string"},
"reso": {"description": "Whether this AK intends to introduce a resolution", "type": "boolean"},
"duration_in_hours": {"description": "AK duration in hours", "type": "number"},
"django_ak_id": {
"$ref": "/schema/common/id.schema.json",
"description": "Unique identifier of the AK object in the django database"
},
"types": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Types of this AK"
}
},
"required": ["name", "head", "description", "reso", "duration_in_hours", "django_ak_id", "types"],
"additionalProperties": false
}
},
"required": ["id", "duration", "room_constraints", "time_constraints", "properties", "info"],
"additionalProperties": false
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/common/constraints.schema.json",
"type": "array",
"items": {"type": "string"},
"uniqueItems": true
}
\ No newline at end of file
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/common/id.schema.json",
"type": "integer",
"minimum": 0
}
\ No newline at end of file
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/common/id_array.schema.json",
"type": "array",
"items": {"type": "integer"},
"uniqueItems": true
}
\ No newline at end of file
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/participant.schema.json",
"title": "Participant",
"type": "object",
"properties": {
"id": {
"$ref": "/schema/common/id.schema.json",
"description": "The unique identifier of a participant"
},
"preferences": {
"description": "AK preferences of the participant",
"type": "array",
"items": {
"type": "object",
"properties": {
"ak_id": {
"$ref": "/schema/common/id.schema.json",
"description": "The unique identifier of the AK"
},
"required": {
"type": "boolean",
"description": "whether this participant is required for the AK"
},
"preference_score": {
"type": "integer",
"description": "The prefeference score for this AK",
"default": 0,
"minimum": -1,
"maximum": 2,
"anyOf": [
{"const": -1}, {"const": 1}, {"const": 2}
]
}
},
"required": ["ak_id", "required", "preference_score"],
"additionalProperties": false
},
"uniqueItems": true
},
"room_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Room constraints required by this participant"
},
"time_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Time constraints required by this participant"
},
"info": {
"type": "object",
"properties": {"name": {"description": "Name of the person", "type": "string"}},
"required": ["name"],
"additionalProperties": false
}
},
"required": ["id", "room_constraints", "time_constraints", "info"],
"additionalProperties": false
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "/schema/room.schema.json",
"title": "Room",
"type": "object",
"properties": {
"id": {
"$ref": "/schema/common/id.schema.json",
"description": "The unique identifier of a room"
},
"capacity": {
"description": "The maximum number of total participants. Unbounded capacity is represented by -1",
"type": "integer",
"anyOf": [
{"minimum": 1}, {"const": -1}
]
},
"fulfilled_room_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Constraints fulfilled by this room"
},
"time_constraints": {
"$ref": "/schema/common/constraints.schema.json",
"description": "Time constraints required by this room"
},
"info": {
"type": "object",
"properties": {
"name": {"description": "Name of the room", "type": "string"}
},
"required": ["name"],
"additionalProperties": false
}
},
"required": ["id", "capacity", "fulfilled_room_constraints", "time_constraints", "info"],
"additionalProperties": false
}
\ No newline at end of file