Skip to content

Commit ec1bbb9

Browse files
committed
✨ [feat][backend] Add Event.cleared_at
1 parent 438ae4f commit ec1bbb9

4 files changed

Lines changed: 41 additions & 0 deletions

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""add event cleared_at
2+
3+
Revision ID: 0039
4+
Revises: 0038
5+
Create Date: 2026-07-19 03:48:43.469123
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
11+
from alembic import op
12+
13+
# revision identifiers, used by Alembic.
14+
revision = "0039"
15+
down_revision = "0038"
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.add_column(
23+
"event", sa.Column("cleared_at", sa.DateTime(timezone=True), nullable=True)
24+
)
25+
# ### end Alembic commands ###
26+
27+
28+
def downgrade():
29+
# ### commands auto generated by Alembic - please adjust! ###
30+
op.drop_column("event", "cleared_at")
31+
# ### end Alembic commands ###

backend/kayman/schemas/event.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class EventBase(SQLModel):
2525
timestamp: datetime
2626
timezone: TimeZoneName
2727
description: str | None = None
28+
cleared_at: datetime | None = None
2829

2930

3031
class Event(EventBase, table=True):
@@ -34,6 +35,9 @@ class Event(EventBase, table=True):
3435
sa_column=Column(DateTime(timezone=True), nullable=False)
3536
)
3637
timezone: TimeZoneName = Field(sa_column=Column(SATimezone(), nullable=False))
38+
cleared_at: datetime | None = Field(
39+
default=None, sa_column=Column(DateTime(timezone=True), nullable=True)
40+
)
3741
# Auto calculated for Expense or Income
3842
# Manually logged for Transfer or Exchange
3943
transactions: list["Transaction"] = Relationship(back_populates="event")
@@ -53,3 +57,4 @@ class EventUpdate(SQLModel):
5357
timestamp: datetime | None = None
5458
timezone: TimeZoneName | None = None
5559
description: str | None = None
60+
cleared_at: datetime | None = None

backend/kayman/tests/crud/test_event.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,14 @@ def test_read_events_for_update(session: Session):
171171
# Datetime fields use commit=False: SQLite drops tzinfo on the
172172
# post-commit refresh, so keep the in-memory tz-aware value to compare.
173173
("timestamp", lambda: datetime(2026, 6, 1, tzinfo=UTC), False),
174+
("cleared_at", lambda: datetime(2026, 6, 1, tzinfo=UTC), False),
174175
],
175176
ids=[
176177
"type",
177178
"timezone",
178179
"description",
179180
"timestamp",
181+
"cleared_at",
180182
],
181183
)
182184
def test_update_event_field(session: Session, field, make_value, commit):
@@ -185,12 +187,14 @@ def test_update_event_field(session: Session, field, make_value, commit):
185187
timestamp=datetime(2025, 1, 1, 12, 0),
186188
timezone="UTC",
187189
description="original description",
190+
cleared_at=datetime(2025, 1, 1, 12, 0),
188191
)
189192
originals = {
190193
"type": event.type,
191194
"timestamp": event.timestamp,
192195
"timezone": event.timezone,
193196
"description": event.description,
197+
"cleared_at": event.cleared_at,
194198
}
195199
new_value = make_value()
196200

backend/kayman/tests/factories/event.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Meta:
1515
timestamp = factory.Faker("date_time")
1616
timezone = "UTC"
1717
type = factory.Faker("random_element", elements=list(EventType))
18+
cleared_at = factory.Faker("date_time")
1819

1920
@classmethod
2021
def build_details(cls, type=EventType.Expense, entry_num=1, transaction_num=1):

0 commit comments

Comments
 (0)