diff --git a/src/open_inwoner/cms/objects/cms_plugins.py b/src/open_inwoner/cms/objects/cms_plugins.py
index 2fc06260cb..d136659684 100644
--- a/src/open_inwoner/cms/objects/cms_plugins.py
+++ b/src/open_inwoner/cms/objects/cms_plugins.py
@@ -1,9 +1,10 @@
+import json
from django.utils.translation import ugettext_lazy as _
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
-from .models import ObjectsList
+from .models import ComponentChoices, ObjectsList
@plugin_pool.register_plugin
@@ -12,3 +13,28 @@ class ObjectsListPlugin(CMSPluginBase):
name = _("Object List Plugin")
render_template = "cms/objects/objects_list.html"
cache = False
+
+ def _get_render_template(self, context, instance, placeholder):
+ default_template = super()._get_render_template(context, instance, placeholder)
+ if component := instance.component:
+ match component:
+ case ComponentChoices.link:
+ return "cms/objects/objects_list.html"
+ case ComponentChoices.map:
+ return "cms/objects/objects_map.html"
+
+ return default_template
+
+ def render(self, context, instance, placeholder):
+ request = context["request"]
+ context["instance"] = instance
+ context["objects"] = []
+
+ if request.user.is_authenticated and (bsn := request.user.bsn):
+ objects = instance.get_objects_by_bsn(bsn)
+ match instance.component:
+ case ComponentChoices.link:
+ context["objects"] = instance.convert_objects_to_actiondata(objects)
+ case ComponentChoices.map:
+ context["objects"] = instance.convert_objects_to_geodata(objects)
+ return context
diff --git a/src/open_inwoner/cms/objects/models.py b/src/open_inwoner/cms/objects/models.py
index d2da14c207..554fff3b7b 100644
--- a/src/open_inwoner/cms/objects/models.py
+++ b/src/open_inwoner/cms/objects/models.py
@@ -1,20 +1,130 @@
-import os
-
+import json
+from glom import glom
+from glom.core import PathAccessError, PathAssignError
from django.db import models
from django.utils.translation import ugettext_lazy as _
+from djchoices import ChoiceItem, DjangoChoices
+
from cms.models import CMSPlugin
from objectsapiclient.models import Configuration, ObjectTypeField
+class StatusChoices(DjangoChoices):
+ open = ChoiceItem("open", _("Open"))
+ submitted = ChoiceItem("ingediend", _("Submitted"))
+ processed = ChoiceItem("verwerkt", _("Processed"))
+ closed = ChoiceItem("gesloten", _("Closed"))
+
+
+class DateOrderChoices(DjangoChoices):
+ ascend = ChoiceItem("+", _("Ascend"))
+ descent = ChoiceItem("-", _("Descent"))
+
+
+class ComponentChoices(DjangoChoices):
+ link = ChoiceItem("link", _("Link"))
+ map = ChoiceItem("map", _("Map"))
+
+
class ObjectsList(CMSPlugin):
title = models.CharField(_("Title"), max_length=250)
object_type = ObjectTypeField() # Stores the UUID of the selected object_type
+ status = models.CharField(
+ _("Status"),
+ max_length=250,
+ choices=StatusChoices.choices,
+ blank=True,
+ )
+ component = models.CharField(
+ _("Component"),
+ max_length=30,
+ choices=ComponentChoices.choices,
+ default=ComponentChoices.link,
+ )
+ date_order = models.CharField(
+ _("Date Order"),
+ max_length=1,
+ choices=DateOrderChoices.choices,
+ default=DateOrderChoices.descent,
+ )
+ bsn_path = models.CharField(
+ _("BSN Path"),
+ max_length=250,
+ help_text=_("The python path to the bsn value"),
+ blank=True,
+ )
+ object_title = models.CharField(
+ _("Object Title"), max_length=250, default="data.title"
+ )
+ object_date = models.CharField(_("Object Date"), max_length=250, default="start_at")
+ object_link = models.CharField(
+ _("Object Link"), max_length=250, default="data.formulier.value"
+ )
+
+ def _return_self(self):
+ return f"{self.title}, {self.object_type}, {self.bsn_path}"
def get_objects(self):
return Configuration.get_solo().client.get_objects(
object_type_uuid=self.object_type
)
+ def get_objects_by_bsn(self, bsn):
+ data_attrs = []
+
+ if self.object_type and self.bsn_path:
+ data_attrs.append(self.bsn_path + "__exact__" + str(bsn))
+ if self.status:
+ data_attrs.append("status__exact__" + self.status)
+
+ return Configuration.get_solo().client.get_objects_by_bsn(
+ object_type_uuid=self.object_type,
+ ordering=self.date_order + "record__startAt",
+ data_attrs=",".join(data_attrs),
+ )
+
+ def convert_objects_to_actiondata(self, objects):
+ object_list = []
+ for object in objects:
+ try:
+ object_list.append(
+ {
+ "title": glom(object.record, self.object_title),
+ "date": glom(object.record, self.object_date),
+ "link": glom(object.record, self.object_link),
+ }
+ )
+ except (PathAccessError, PathAssignError):
+ pass
+
+ return object_list
+
+ def convert_objects_to_geodata(self, objects):
+ features = []
+ for object in objects:
+ if geometry := object.record.get("geometry"):
+ try:
+ features.append(
+ {
+ "type": "Feature",
+ "geometry": geometry,
+ "properties": {
+ "name": glom(object.record, self.object_title),
+ "date": glom(object.record, self.object_date),
+ "link": glom(object.record, self.object_link),
+ },
+ }
+ )
+ except (PathAccessError, PathAssignError):
+ pass
+
+ return json.dumps(
+ {
+ "type": "FeatureCollection",
+ "features": features,
+ }
+ )
+
def __str__(self):
return self.title
diff --git a/src/open_inwoner/components/templates/components/DenhaagAction/DenhaagAction.html b/src/open_inwoner/components/templates/components/DenhaagAction/DenhaagAction.html
new file mode 100644
index 0000000000..bd5d5972d3
--- /dev/null
+++ b/src/open_inwoner/components/templates/components/DenhaagAction/DenhaagAction.html
@@ -0,0 +1,15 @@
+{% load l10n i18n %}
+
+
+
${displayDate}
${displayAddress1}
${displayAddress2}
@@ -130,6 +135,9 @@ class Map { ${displayEmail} + + +Er staan geen taken gevonden
+ {% endif %}Er staan geen taken gevonden
+ {% endif %} +