def event_details(request, event_id=None): # Set a detail/attribute if request.method == "POST": try: event = Event.objects.get(pk=event_id) data = json.loads(request.read()) payload = { "event_id": event.id, "details": [], } for detail in data["details"]: details_type = detail["details_type"] key = detail["name"] value = detail["value"] mode = detail["mode"] if details_type == "attribute": attributes = Attribute.objects.filter(event=event, key=key) if not attributes or mode == "append": attribute = Attribute(event=event, key=key, value=value) attribute.save() elif mode == "set": for attribute in attributes[1:]: attribute.delete() attribute = attributes[0] attribute.value = value attribute.save() elif details_type == "stream": stream = Stream.objects.filter(event=event, name=key) if stream: stream = stream.get() stream_text = value if mode == "append": stream_text = stream.text + stream_text stream.text = stream_text else: stream = Stream(event=event, name=key, text=value) stream.save() payload["details"].append(detail) publish("event_details", "update", payload, event_id=event.id) return json_response({"msg": ""}) except IntegrityError as err: return json_response({"msg": str(err)}, "error", 400) except DatabaseError as err: return json_response({"msg": str(err)}, "error", 500) # Get Details for an event if request.method == "GET": try: data = {} event = Event.objects.get(pk=event_id) data["event_id"] = event.id data["attributes"] = event.attributes() data["streams"] = [stream.to_dict() for stream in event.streams()] return json_response(data) except Event.DoesNotExist as err: return json_response({"msg": str(err)}, "error", 404)