mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 19:21:33 +02:00
* feat: add ScheduledDrying model for delayed drying runs (#2638) * Release the printer when a scheduled dry ends (#2638) _check_scheduled_dryings marks a printer as drying in _drying_in_progress, which is shared with auto-drying. Auto-drying prunes that map in _sync_drying_state(), but that call sits behind its enabled check, and this is the first writer that runs whether auto-drying is on or not. With it off -- the default -- nothing dropped the entry short of a print being dispatched to the same printer, so the next scheduled run parked on "already_drying" forever and queue_drying_block held that printer's prints too. A nightly off-peak dry with no printing in between is exactly the workflow this feature is for: night one worked, every night after it silently did not. The check now releases what it acquired, covering both a run that ends mid-pass and one cancelled through the route between passes. The retention prune ran on every pass. Issuing the DELETE is what opens a write transaction, this method is called every 3s while the queue dispatches, and rows only become prunable a week after they finish, so it is now gated to hourly on a monotonic stamp -- with the first pass after a restart still reaping whatever the dead process left behind. Both drying paths now pick the blocking dry_sf_reason through one rule. The immediate endpoint quoted whichever code the firmware listed first while the scheduler prioritised power over retract, so one blocked AMS read two ways depending on which button you pressed. drying_preflight.primary_reason_code holds the order and both call it, including the flame button's tooltip, which had no wording for filament at the outlet at all and sent those users to the generic "can't start drying right now". scheduled_drying joins the model list in init_db. The table was already created -- importing the package registers it -- but it was the only model relying on that indirection. Tests: the release (completion and route-cancel), the prune throttle, the shared reason rule, the tooltip priority, and four driving the real check_queue, which nothing covered before -- a pass with no rows still dispatching prints, a due row dispatching, and a failed row not stalling the queue behind it. Each one fails against the code it guards. --------- Co-authored-by: MartinNYHC <martin@bambuddy.cool> Co-authored-by: maziggy <mz@v8w.de>
98 lines
3.6 KiB
Python
98 lines
3.6 KiB
Python
from backend.app.models.ams_history import AMSSensorHistory
|
|
from backend.app.models.ams_label import AmsLabel
|
|
from backend.app.models.api_key import APIKey
|
|
from backend.app.models.archive import PrintArchive
|
|
from backend.app.models.auth_ephemeral import AuthEphemeralToken, AuthRateLimitEvent
|
|
from backend.app.models.color_catalog import ColorCatalogEntry
|
|
from backend.app.models.filament import Filament
|
|
from backend.app.models.github_backup import GitHubBackupConfig, GitHubBackupLog
|
|
from backend.app.models.group import Group, user_groups
|
|
from backend.app.models.kprofile_note import KProfileNote
|
|
from backend.app.models.library import FileVariantGroup, LibraryFile, LibraryFolder
|
|
from backend.app.models.local_preset import LocalPreset
|
|
from backend.app.models.location import Location
|
|
from backend.app.models.long_lived_token import LongLivedToken
|
|
from backend.app.models.maintenance import MaintenanceHistory, MaintenanceType, PrinterMaintenance
|
|
from backend.app.models.notification import NotificationLog
|
|
from backend.app.models.notification_template import NotificationTemplate
|
|
from backend.app.models.oidc_provider import OIDCProvider, UserOIDCLink
|
|
from backend.app.models.orca_base_cache import OrcaBaseProfile
|
|
from backend.app.models.pending_upload import PendingUpload
|
|
from backend.app.models.pipeline_run import PipelineJob, PipelineRun
|
|
from backend.app.models.print_batch import PrintBatch, PrintBatchPlate
|
|
from backend.app.models.printer import Printer
|
|
from backend.app.models.printer_ha_sensor import PrinterHASensor
|
|
from backend.app.models.printer_sensor_history import PrinterSensorHistory
|
|
from backend.app.models.project import Project
|
|
from backend.app.models.scheduled_drying import ScheduledDrying
|
|
from backend.app.models.settings import Settings
|
|
from backend.app.models.slicer_pipeline import SlicerPipeline
|
|
from backend.app.models.smart_plug import SmartPlug
|
|
from backend.app.models.smart_plug_energy_snapshot import SmartPlugEnergySnapshot
|
|
from backend.app.models.sponsor_toast_state import SponsorToastState
|
|
from backend.app.models.spool import Spool
|
|
from backend.app.models.spool_assignment import SpoolAssignment
|
|
from backend.app.models.spool_catalog import SpoolCatalogEntry
|
|
from backend.app.models.spool_k_profile import SpoolKProfile
|
|
from backend.app.models.spool_usage_history import SpoolUsageHistory
|
|
from backend.app.models.spoolbuddy_device import SpoolBuddyDevice
|
|
from backend.app.models.user import User
|
|
from backend.app.models.user_email_pref import UserEmailPreference
|
|
from backend.app.models.user_otp_code import UserOTPCode
|
|
from backend.app.models.user_totp import UserTOTP
|
|
|
|
__all__ = [
|
|
"Printer",
|
|
"PrintArchive",
|
|
"Filament",
|
|
"Settings",
|
|
"SmartPlug",
|
|
"SmartPlugEnergySnapshot",
|
|
"MaintenanceType",
|
|
"PrinterMaintenance",
|
|
"MaintenanceHistory",
|
|
"KProfileNote",
|
|
"NotificationTemplate",
|
|
"NotificationLog",
|
|
"Project",
|
|
"APIKey",
|
|
"AMSSensorHistory",
|
|
"PrinterSensorHistory",
|
|
"PrinterHASensor",
|
|
"ScheduledDrying",
|
|
"AmsLabel",
|
|
"PendingUpload",
|
|
"PrintBatch",
|
|
"PrintBatchPlate",
|
|
"LibraryFolder",
|
|
"LibraryFile",
|
|
"FileVariantGroup",
|
|
"Location",
|
|
"User",
|
|
"Group",
|
|
"user_groups",
|
|
"GitHubBackupConfig",
|
|
"GitHubBackupLog",
|
|
"LocalPreset",
|
|
"OIDCProvider",
|
|
"UserOIDCLink",
|
|
"OrcaBaseProfile",
|
|
"PipelineJob",
|
|
"PipelineRun",
|
|
"SlicerPipeline",
|
|
"Spool",
|
|
"SpoolKProfile",
|
|
"SpoolAssignment",
|
|
"SpoolCatalogEntry",
|
|
"SpoolUsageHistory",
|
|
"ColorCatalogEntry",
|
|
"SpoolBuddyDevice",
|
|
"SponsorToastState",
|
|
"UserEmailPreference",
|
|
"UserOTPCode",
|
|
"UserTOTP",
|
|
"AuthEphemeralToken",
|
|
"AuthRateLimitEvent",
|
|
"LongLivedToken",
|
|
]
|