Files
Agri-tech/agri_seedling/hooks.py
T
2026-08-27 10:59:50 +03:00

151 lines
5.8 KiB
Python

from . import __version__ as app_version
app_name = "agri_seedling"
app_title = "Agri Seedling"
app_publisher = "Agri Seedling Operations Team"
app_description = "Farm Management System — field activities, resource tracking, dispatch and reporting"
app_email = "sysadmin@agriseedling.com"
app_license = "Proprietary"
# Apps
# ------------------
# required_apps = ["erpnext"]
# Includes in <head>
# ------------------
# app_include_css = "/assets/agri_seedling/css/agri_seedling.css"
# app_include_js = "/assets/agri_seedling/js/agri_seedling.js"
# Home Pages
# ----------
# role_home_page = {"Field Worker": "agri-seedling-mobile"}
# Fixtures — exported with `bench export-fixtures`, keeps Roles/Custom Fields
# in version control across environments
# ---------------------------------------------------------------------------
fixtures = [
{"dt": "Role", "filters": [["role_name", "in", [
"Admin",
"Stock Manager",
"Inventory Manager",
"Accountant",
"Field Worker",
]]]},
"Notification",
{"dt": "Print Format", "filters": [["module", "=", "Agri Seedling"]]},
]
# Document Events
# ---------------
# Hook on document methods and events. Mirrors Chapter 4/6/9 of the manual:
# stock deduction, notifications, and immutability of submitted spray logs.
doc_events = {
"Scouting Report": {
"on_submit": "agri_seedling.agri_seedling.utils.notifications.notify_scouting_alert",
},
"Spray Log Morning": {
"validate": "agri_seedling.agri_seedling.utils.compliance.enforce_ppe_checklist",
"on_submit": [
"agri_seedling.agri_seedling.utils.stock.deduct_spray_resources",
"agri_seedling.agri_seedling.utils.compliance.start_reentry_interval_lock",
],
"on_cancel": "agri_seedling.agri_seedling.utils.stock.reverse_spray_resources",
},
"Spray Log Evening": {
"validate": "agri_seedling.agri_seedling.utils.compliance.enforce_ppe_checklist",
"on_submit": [
"agri_seedling.agri_seedling.utils.stock.deduct_spray_resources",
"agri_seedling.agri_seedling.utils.compliance.start_reentry_interval_lock",
],
"on_cancel": "agri_seedling.agri_seedling.utils.stock.reverse_spray_resources",
},
"Planting Record": {
"on_submit": [
"agri_seedling.agri_seedling.utils.stock.deduct_seed_stock",
"agri_seedling.agri_seedling.utils.tray_registry.create_tray_entries",
],
},
"Dispatch Record": {
"on_submit": [
"agri_seedling.agri_seedling.utils.stock.deduct_dispatch_resources",
"agri_seedling.agri_seedling.utils.notifications.notify_dispatch_complete",
],
},
"Order Patch": {
"on_submit": "agri_seedling.agri_seedling.utils.notifications.notify_order_patched",
},
"Tray Recycling Record": {
"on_submit": "agri_seedling.agri_seedling.utils.tray_registry.return_trays_to_stock",
},
"Resource Inventory": {
"on_update": "agri_seedling.agri_seedling.utils.stock.check_low_stock_threshold",
},
}
# Scheduled Tasks
# ---------------
# Maps to Chapter 6 (notification triggers) and Chapter 5 (reorder alerts)
scheduler_events = {
"cron": {
# Daily 18:00 — resource consumption report to Stock Manager + Admin
"0 18 * * *": [
"agri_seedling.agri_seedling.report.daily_resource_consumption.daily_resource_consumption.send_daily_report"
],
# Every 15 min — release zones whose Re-Entry Interval has expired
"*/15 * * * *": [
"agri_seedling.agri_seedling.utils.compliance.release_expired_reentry_locks"
],
},
"daily": [
"agri_seedling.agri_seedling.utils.stock.run_low_stock_scan",
"agri_seedling.agri_seedling.utils.jigs.check_jig_maintenance_due",
"agri_seedling.agri_seedling.utils.sync.warn_stale_offline_records",
],
"hourly": [
"agri_seedling.agri_seedling.utils.tasks.send_due_activity_reminders",
],
}
# Permission Query Conditions
# ---------------------------
# Row-level isolation for Field Workers (Sec 9.2): can only read own submissions.
permission_query_conditions = {
"Scouting Report": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Spray Log Morning": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Spray Log Evening": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Planting Record": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Soaking Record": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Greenhouse Watering Log": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Seedling Watering Log": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Cover Log": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
"Tray Recycling Record": "agri_seedling.agri_seedling.utils.permissions.field_worker_match_condition",
}
has_permission = {
"Scouting Report": "agri_seedling.agri_seedling.utils.permissions.field_worker_has_permission",
}
# Authentication / Session
# ------------------------
# Field Worker (Guest User) sessions expire at midnight — see Sec 9.1
# Implemented via a login hook that sets a short-lived session for the
# "Field Worker" role; see agri_seedling/utils/auth.py
on_session_creation = "agri_seedling.agri_seedling.utils.auth.set_field_worker_session_expiry"
# Before Request — X-Worker-Token auth hook for mobile field-worker app
# ---------------------------------------------------------------------------
# Validates the X-Worker-Token header on every request and upgrades the session
# from Guest to the proxy user so whitelisted API methods can execute.
before_request = [
"agri_seedling.agri_seedling.auth_hooks.authenticate_worker_token",
]
# Website Route Rules (kept minimal — mobile app is the field-worker client)
# ---------------------------------------------------------------------------
website_route_rules = []
# override_whitelisted_methods = {
# "agri_seedling.api.mobile_sync.push_activity": "agri_seedling.agri_seedling.api.mobile_sync.push_activity",
# }