feat: add schema, sync support for Log.is_movement

This commit is contained in:
Lance Edgar 2026-03-02 20:27:22 -06:00
parent eb16990b0b
commit 0ac2485bff
8 changed files with 62 additions and 0 deletions

View file

@ -0,0 +1,37 @@
"""add Log.is_movement
Revision ID: 0771322957bd
Revises: 12de43facb95
Create Date: 2026-03-02 20:21:03.889847
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
import wuttjamaican.db.util
# revision identifiers, used by Alembic.
revision: str = "0771322957bd"
down_revision: Union[str, None] = "12de43facb95"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# log
op.add_column("log", sa.Column("is_movement", sa.Boolean(), nullable=True))
op.add_column(
"log_version",
sa.Column("is_movement", sa.Boolean(), autoincrement=False, nullable=True),
)
def downgrade() -> None:
# log
op.drop_column("log_version", "is_movement")
op.drop_column("log", "is_movement")

View file

@ -120,6 +120,14 @@ class Log(model.Base):
""",
)
is_movement = sa.Column(
sa.Boolean(),
nullable=True,
doc="""
Whether the log represents a movement to new location.
""",
)
is_group_assignment = sa.Column(
sa.Boolean(),
nullable=True,
@ -263,6 +271,7 @@ def add_log_proxies(subclass):
Log.make_proxy(subclass, "log", "log_type")
Log.make_proxy(subclass, "log", "message")
Log.make_proxy(subclass, "log", "timestamp")
Log.make_proxy(subclass, "log", "is_movement")
Log.make_proxy(subclass, "log", "is_group_assignment")
Log.make_proxy(subclass, "log", "status")
Log.make_proxy(subclass, "log", "notes")

View file

@ -459,6 +459,7 @@ class ToFarmOSLog(ToFarmOS):
"uuid",
"name",
"timestamp",
"is_movement",
"is_group_assignment",
"status",
"notes",
@ -518,6 +519,7 @@ class ToFarmOSLog(ToFarmOS):
"uuid": UUID(log["id"]),
"name": log["attributes"]["name"],
"timestamp": self.normalize_datetime(log["attributes"]["timestamp"]),
"is_movement": log["attributes"]["is_movement"],
"is_group_assignment": log["attributes"]["is_group_assignment"],
"status": log["attributes"]["status"],
"notes": notes,
@ -531,6 +533,8 @@ class ToFarmOSLog(ToFarmOS):
attrs["name"] = source_data["name"]
if "timestamp" in self.fields:
attrs["timestamp"] = self.format_datetime(source_data["timestamp"])
if "is_movement" in self.fields:
attrs["is_movement"] = source_data["is_movement"]
if "is_group_assignment" in self.fields:
attrs["is_group_assignment"] = source_data["is_group_assignment"]
if "status" in self.fields:

View file

@ -361,6 +361,7 @@ class FromWuttaFarmLog(FromWuttaFarm):
"uuid",
"name",
"timestamp",
"is_movement",
"is_group_assignment",
"status",
"notes",
@ -371,6 +372,7 @@ class FromWuttaFarmLog(FromWuttaFarm):
"uuid": log.farmos_uuid or self.app.make_true_uuid(),
"name": log.message,
"timestamp": log.timestamp,
"is_movement": log.is_movement,
"is_group_assignment": log.is_group_assignment,
"status": log.status,
"notes": log.notes,

View file

@ -959,6 +959,7 @@ class LogImporterBase(FromFarmOS, ToWutta):
"log_type",
"message",
"timestamp",
"is_movement",
"is_group_assignment",
"notes",
"status",

View file

@ -279,6 +279,7 @@ class Normalizer(GenericHandler):
"quantities": quantity_objects,
"quantity_uuids": quantity_uuids,
"is_group_assignment": log["attributes"]["is_group_assignment"],
"is_movement": log["attributes"]["is_movement"],
"quick": log["attributes"]["quick"],
"status": log["attributes"]["status"],
"notes": notes,

View file

@ -94,6 +94,7 @@ class LogMasterView(FarmOSMasterView):
"status",
"log_type_name",
"owners",
"is_movement",
"is_group_assignment",
"quick",
"drupal_id",
@ -234,6 +235,9 @@ class LogMasterView(FarmOSMasterView):
# quantities
f.set_node("quantities", FarmOSQuantityRefs(self.request))
# is_movement
f.set_node("is_movement", colander.Boolean())
# is_group_assignment
f.set_node("is_group_assignment", colander.Boolean())

View file

@ -133,6 +133,7 @@ class LogMasterView(WuttaFarmMasterView):
"status",
"log_type",
"owners",
"is_movement",
"is_group_assignment",
"quick",
"farmos_uuid",
@ -312,6 +313,9 @@ class LogMasterView(WuttaFarmMasterView):
# status
f.set_node("status", WuttaDictEnum(self.request, enum.LOG_STATUS))
# is_movement
f.set_node("is_movement", colander.Boolean())
# is_group_assignment
f.set_node("is_group_assignment", colander.Boolean())