Skip to content

Commit

Permalink
being able to decode dates in custom payload of events
Browse files Browse the repository at this point in the history
  • Loading branch information
nilbacardit26 committed Mar 5, 2024
1 parent d074045 commit 2cbaabb
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 3 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
2.0.1 (unreleased)
------------------

- Nothing changed yet.
- Being able to decode dates and datetimes when indexing custom
payloads from events.


2.0.0 (2024-01-23)
Expand Down
1 change: 1 addition & 0 deletions guillotina_audit/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def base_settings_configurator(settings):
settings["applications"] = []
settings["applications"].append("guillotina")
settings["applications"].append("guillotina_audit")
settings["applications"].append("guillotina_audit.tests.test_package")
settings["audit"] = {
"connection_settings": {
"hosts": [f"http://{annotations['elasticsearch']['host']}"]
Expand Down
32 changes: 32 additions & 0 deletions guillotina_audit/tests/test_audit_basic.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from datetime import date
from datetime import datetime
from datetime import timedelta
from guillotina.component import query_utility
Expand Down Expand Up @@ -125,6 +126,24 @@ async def test_audit_basic(guillotina_es):
assert len(resp["hits"]["hits"]) == 1
assert status == 200

response, status = await guillotina_es(
"POST",
"/db/guillotina/",
data=json.dumps(
{
"@type": "Item",
"id": "foo_item",
"title": "Foo Item",
"guillotina.behaviors.dublincore.IDublinCore": {
"effective_date": "2023-01-01"
},
}
),
)
assert status == 201
await asyncio.sleep(2)
resp, status = await guillotina_es("GET", "/db/guillotina/@audit")


async def test_audit_wildcard(guillotina_es):
response, status = await guillotina_es(
Expand Down Expand Up @@ -192,3 +211,16 @@ async def test_audit_wildcard(guillotina_es):
assert resp["hits"]["hits"][0]["_source"]["creation_date"].startswith(
"2023-05-12T21:45:32"
)


async def test_json_dumps(guillotina_es):
response, status = await guillotina_es(
"POST", "/db/guillotina/@addons", data=json.dumps({"id": "audit"})
)
assert status == 200
await asyncio.sleep(2)
audit_utility = query_utility(IAuditUtility)
json.dumps(
{"datetime": datetime.now(), "date": date.today()},
default=audit_utility._custom_serializer,
)
27 changes: 27 additions & 0 deletions guillotina_audit/tests/test_package.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from guillotina import configure
from guillotina.content import Resource
from guillotina.interfaces import IContainer
from guillotina.interfaces import IResource
from guillotina.schema import Datetime
from zope.interface import implementer


class IFooContent(IResource):
foo_datetime = Datetime(title="Foo Datetime")


@implementer(IFooContent)
class FooContent(Resource):
pass


configure.register_configuration(
FooContent,
dict(
context=IContainer,
schema=IFooContent,
type_name="FooContent",
behaviors=["guillotina.behaviors.dublincore.IDublinCore"],
),
"contenttype",
)
15 changes: 13 additions & 2 deletions guillotina_audit/utility.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ async def initialize(self, app):
**app_settings.get("audit", {}).get("connection_settings")
)

def _custom_serializer(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
if isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
raise TypeError("Object of type %s is not JSON serializable" % type(obj))

async def create_index(self):
try:
await self.async_es.indices.create(
Expand Down Expand Up @@ -91,12 +98,16 @@ def log_entry(self, obj, event):
document["action"] = "modified"
document["creation_date"] = obj.modification_date
if self._settings.get("save_payload", False) is True:
document["payload"] = json.dumps(event.payload)
document["payload"] = json.dumps(
event.payload, default=self._custom_serializer
)
elif IObjectAddedEvent.providedBy(event):
document["action"] = "added"
document["creation_date"] = obj.creation_date
if self._settings.get("save_payload", False) is True:
document["payload"] = json.dumps(event.payload)
document["payload"] = json.dumps(
event.payload, default=self._custom_serializer
)
elif IObjectRemovedEvent.providedBy(event):
document["action"] = "removed"
document["creation_date"] = datetime.datetime.now(timezone.utc)
Expand Down

0 comments on commit 2cbaabb

Please sign in to comment.