permissions.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. """Permission definitions for the group-based access control system.
  2. This module defines all permissions using a string enum with `resource:action` naming.
  3. Permissions are additive across groups - a user has all permissions from all their groups.
  4. """
  5. from backend.app.core.compat import StrEnum
  6. class Permission(StrEnum):
  7. """All available permissions in the system.
  8. Permissions follow the pattern: resource:action
  9. Actions typically include: read, create, update, delete, plus resource-specific actions.
  10. """
  11. # Printers
  12. PRINTERS_READ = "printers:read"
  13. PRINTERS_CREATE = "printers:create"
  14. PRINTERS_UPDATE = "printers:update"
  15. PRINTERS_DELETE = "printers:delete"
  16. PRINTERS_CONTROL = "printers:control" # Printer controls: stop/pause/resume, lights, motors, drying, etc.
  17. PRINTERS_FILES = "printers:files" # Send files to printer
  18. PRINTERS_AMS_RFID = "printers:ams_rfid" # Re-read AMS RFID tags
  19. PRINTERS_CLEAR_PLATE = "printers:clear_plate" # Confirm plate cleared for next print
  20. # Archives
  21. # ARCHIVES_READ kept for backward-compat with legacy custom roles, but new
  22. # role bootstraps use the ownership-split variants below. seed_default_groups
  23. # migrates pre-existing role rows: Administrators → ALL, everyone else → OWN.
  24. ARCHIVES_READ = "archives:read"
  25. ARCHIVES_READ_OWN = "archives:read_own"
  26. ARCHIVES_READ_ALL = "archives:read_all"
  27. ARCHIVES_CREATE = "archives:create"
  28. ARCHIVES_UPDATE_OWN = "archives:update_own"
  29. ARCHIVES_UPDATE_ALL = "archives:update_all"
  30. ARCHIVES_DELETE_OWN = "archives:delete_own"
  31. ARCHIVES_DELETE_ALL = "archives:delete_all"
  32. ARCHIVES_REPRINT_OWN = "archives:reprint_own" # Reprint own archives; queue:create is also required to enqueue
  33. ARCHIVES_REPRINT_ALL = "archives:reprint_all" # Reprint any archive; queue:create is also required to enqueue
  34. ARCHIVES_PURGE = "archives:purge"
  35. # Queue
  36. QUEUE_READ = "queue:read"
  37. QUEUE_READ_OWN = "queue:read_own"
  38. QUEUE_READ_ALL = "queue:read_all"
  39. QUEUE_CREATE = "queue:create" # Create queue items, including ASAP items eligible for immediate dispatch
  40. QUEUE_UPDATE_OWN = "queue:update_own"
  41. QUEUE_UPDATE_ALL = "queue:update_all"
  42. QUEUE_DELETE_OWN = "queue:delete_own"
  43. QUEUE_DELETE_ALL = "queue:delete_all"
  44. QUEUE_REORDER = "queue:reorder"
  45. # Without it, every job the user queues waits until someone with
  46. # queue:update_all starts it (#1620). Only the waiting is enforced here;
  47. # queue:create still decides whether they may queue at all.
  48. QUEUE_START_UNREVIEWED = "queue:start_unreviewed"
  49. # Library
  50. LIBRARY_READ = "library:read"
  51. LIBRARY_READ_OWN = "library:read_own"
  52. LIBRARY_READ_ALL = "library:read_all"
  53. LIBRARY_UPLOAD = "library:upload" # Upload/import/slice library files; queue:create is also required to print
  54. LIBRARY_UPDATE_OWN = "library:update_own"
  55. LIBRARY_UPDATE_ALL = "library:update_all"
  56. LIBRARY_DELETE_OWN = "library:delete_own"
  57. LIBRARY_DELETE_ALL = "library:delete_all"
  58. # Admin-only: bulk purge of old files + trash retention settings (#1008).
  59. # Routine per-user trash management (restore-own, hard-delete-own) is
  60. # gated by the existing LIBRARY_DELETE_* permissions instead.
  61. LIBRARY_PURGE = "library:purge"
  62. # Projects
  63. PROJECTS_READ = "projects:read"
  64. PROJECTS_CREATE = "projects:create"
  65. PROJECTS_UPDATE = "projects:update"
  66. PROJECTS_DELETE = "projects:delete"
  67. # Filaments
  68. FILAMENTS_READ = "filaments:read"
  69. FILAMENTS_CREATE = "filaments:create"
  70. FILAMENTS_UPDATE = "filaments:update"
  71. FILAMENTS_DELETE = "filaments:delete"
  72. # Inventory (Spool Inventory, Spool Catalog, Color Catalog)
  73. INVENTORY_READ = "inventory:read"
  74. INVENTORY_CREATE = "inventory:create"
  75. INVENTORY_UPDATE = "inventory:update"
  76. INVENTORY_DELETE = "inventory:delete"
  77. INVENTORY_VIEW_ASSIGNMENTS = "inventory:view_assignments" # View spool-to-AMS assignments on printer cards
  78. INVENTORY_FORECAST_READ = "inventory:forecast_read" # View forecast/reorder intelligence panel
  79. INVENTORY_FORECAST_WRITE = "inventory:forecast_write" # Modify SKU settings, lead times, shopping list
  80. # Smart Plugs
  81. SMART_PLUGS_READ = "smart_plugs:read"
  82. SMART_PLUGS_CREATE = "smart_plugs:create"
  83. SMART_PLUGS_UPDATE = "smart_plugs:update"
  84. SMART_PLUGS_DELETE = "smart_plugs:delete"
  85. SMART_PLUGS_CONTROL = "smart_plugs:control" # Turn on/off
  86. # Camera
  87. CAMERA_VIEW = "camera:view"
  88. # Maintenance
  89. MAINTENANCE_READ = "maintenance:read"
  90. MAINTENANCE_CREATE = "maintenance:create"
  91. MAINTENANCE_UPDATE = "maintenance:update"
  92. MAINTENANCE_DELETE = "maintenance:delete"
  93. # K-Profiles
  94. KPROFILES_READ = "kprofiles:read"
  95. KPROFILES_CREATE = "kprofiles:create"
  96. KPROFILES_UPDATE = "kprofiles:update"
  97. KPROFILES_DELETE = "kprofiles:delete"
  98. # Notifications
  99. NOTIFICATIONS_READ = "notifications:read"
  100. NOTIFICATIONS_CREATE = "notifications:create"
  101. NOTIFICATIONS_UPDATE = "notifications:update"
  102. NOTIFICATIONS_DELETE = "notifications:delete"
  103. NOTIFICATIONS_USER_EMAIL = "notifications:user_email" # Receive per-user print email notifications
  104. # Notification Templates
  105. NOTIFICATION_TEMPLATES_READ = "notification_templates:read"
  106. NOTIFICATION_TEMPLATES_UPDATE = "notification_templates:update"
  107. # External Links
  108. EXTERNAL_LINKS_READ = "external_links:read"
  109. EXTERNAL_LINKS_CREATE = "external_links:create"
  110. EXTERNAL_LINKS_UPDATE = "external_links:update"
  111. EXTERNAL_LINKS_DELETE = "external_links:delete"
  112. # Discovery (network scanning)
  113. DISCOVERY_SCAN = "discovery:scan"
  114. # Firmware
  115. FIRMWARE_READ = "firmware:read"
  116. FIRMWARE_UPDATE = "firmware:update"
  117. # AMS History
  118. AMS_HISTORY_READ = "ams_history:read"
  119. PRINTER_SENSOR_HISTORY_READ = "printer_sensor_history:read"
  120. # Stats/Metrics
  121. STATS_READ = "stats:read"
  122. STATS_FILTER_BY_USER = "stats:filter_by_user"
  123. # Cost Centers
  124. COST_CENTERS_READ_OWN = "cost_centers:read_own"
  125. COST_CENTERS_READ_ALL = "cost_centers:read_all"
  126. COST_CENTERS_MODIFY = "cost_centers:modify"
  127. COST_CENTERS_CREATE = "cost_centers:create"
  128. # System Info
  129. SYSTEM_READ = "system:read"
  130. # Settings (admin-level)
  131. SETTINGS_READ = "settings:read"
  132. SETTINGS_UPDATE = "settings:update"
  133. SETTINGS_BACKUP = "settings:backup"
  134. SETTINGS_RESTORE = "settings:restore"
  135. # GitHub Backup (admin-level)
  136. GITHUB_BACKUP = "github:backup"
  137. GITHUB_RESTORE = "github:restore"
  138. # Cloud Auth (admin-level)
  139. CLOUD_AUTH = "cloud:auth"
  140. ORCA_CLOUD_AUTH = "orca_cloud:auth"
  141. # MakerWorld Integration
  142. MAKERWORLD_VIEW = "makerworld:view" # Resolve MakerWorld URLs and view model metadata
  143. MAKERWORLD_IMPORT = "makerworld:import" # Download 3MFs from MakerWorld into the library
  144. # Manyfold Integration (#1471)
  145. MANYFOLD_VIEW = "manyfold:view" # Browse and search the connected Manyfold library
  146. MANYFOLD_IMPORT = "manyfold:import" # Download Manyfold files into the library
  147. # API Keys (admin-level)
  148. API_KEYS_READ = "api_keys:read"
  149. API_KEYS_CREATE = "api_keys:create"
  150. API_KEYS_UPDATE = "api_keys:update"
  151. API_KEYS_DELETE = "api_keys:delete"
  152. # Users (admin-level)
  153. USERS_READ = "users:read"
  154. # Narrow read: id + username only, no emails/roles/groups/permissions (#1894).
  155. # Exists so an id -> name mapping can be resolved without handing out the
  156. # full user objects. Pairs with STATS_FILTER_BY_USER, which is useless
  157. # without a way to discover the ids it filters on.
  158. USERS_READ_SLIM = "users:read_slim"
  159. USERS_CREATE = "users:create"
  160. USERS_UPDATE = "users:update"
  161. USERS_DELETE = "users:delete"
  162. # Groups (admin-level)
  163. GROUPS_READ = "groups:read"
  164. GROUPS_CREATE = "groups:create"
  165. GROUPS_UPDATE = "groups:update"
  166. GROUPS_DELETE = "groups:delete"
  167. # Slicer Pipelines (#1425)
  168. PIPELINES_READ = "pipelines:read" # View pipeline definitions and run history
  169. PIPELINES_WRITE = "pipelines:write" # Create / edit / delete pipeline definitions
  170. PIPELINES_RUN = "pipelines:run" # Kick off a pipeline run (PR C); separate because spending filament is a different trust dimension than authoring the recipe
  171. # WebSocket connection
  172. WEBSOCKET_CONNECT = "websocket:connect"
  173. # Permission categories for UI organization
  174. PERMISSION_CATEGORIES = {
  175. "Printers": [
  176. Permission.PRINTERS_READ,
  177. Permission.PRINTERS_CREATE,
  178. Permission.PRINTERS_UPDATE,
  179. Permission.PRINTERS_DELETE,
  180. Permission.PRINTERS_CONTROL,
  181. Permission.PRINTERS_FILES,
  182. Permission.PRINTERS_AMS_RFID,
  183. Permission.PRINTERS_CLEAR_PLATE,
  184. ],
  185. "Archives": [
  186. Permission.ARCHIVES_READ, # legacy — kept for back-compat with custom roles
  187. Permission.ARCHIVES_READ_OWN,
  188. Permission.ARCHIVES_READ_ALL,
  189. Permission.ARCHIVES_CREATE,
  190. Permission.ARCHIVES_UPDATE_OWN,
  191. Permission.ARCHIVES_UPDATE_ALL,
  192. Permission.ARCHIVES_DELETE_OWN,
  193. Permission.ARCHIVES_DELETE_ALL,
  194. Permission.ARCHIVES_REPRINT_OWN,
  195. Permission.ARCHIVES_REPRINT_ALL,
  196. Permission.ARCHIVES_PURGE,
  197. ],
  198. "Queue": [
  199. Permission.QUEUE_READ, # legacy — kept for back-compat with custom roles
  200. Permission.QUEUE_READ_OWN,
  201. Permission.QUEUE_READ_ALL,
  202. Permission.QUEUE_CREATE,
  203. Permission.QUEUE_UPDATE_OWN,
  204. Permission.QUEUE_UPDATE_ALL,
  205. Permission.QUEUE_DELETE_OWN,
  206. Permission.QUEUE_DELETE_ALL,
  207. Permission.QUEUE_REORDER,
  208. Permission.QUEUE_START_UNREVIEWED,
  209. ],
  210. "Library": [
  211. Permission.LIBRARY_READ, # legacy — kept for back-compat with custom roles
  212. Permission.LIBRARY_READ_OWN,
  213. Permission.LIBRARY_READ_ALL,
  214. Permission.LIBRARY_UPLOAD,
  215. Permission.LIBRARY_UPDATE_OWN,
  216. Permission.LIBRARY_UPDATE_ALL,
  217. Permission.LIBRARY_DELETE_OWN,
  218. Permission.LIBRARY_DELETE_ALL,
  219. Permission.LIBRARY_PURGE,
  220. ],
  221. "Projects": [
  222. Permission.PROJECTS_READ,
  223. Permission.PROJECTS_CREATE,
  224. Permission.PROJECTS_UPDATE,
  225. Permission.PROJECTS_DELETE,
  226. ],
  227. "Filaments": [
  228. Permission.FILAMENTS_READ,
  229. Permission.FILAMENTS_CREATE,
  230. Permission.FILAMENTS_UPDATE,
  231. Permission.FILAMENTS_DELETE,
  232. ],
  233. "Inventory": [
  234. Permission.INVENTORY_READ,
  235. Permission.INVENTORY_CREATE,
  236. Permission.INVENTORY_UPDATE,
  237. Permission.INVENTORY_DELETE,
  238. Permission.INVENTORY_VIEW_ASSIGNMENTS,
  239. Permission.INVENTORY_FORECAST_READ,
  240. Permission.INVENTORY_FORECAST_WRITE,
  241. ],
  242. "Smart Plugs": [
  243. Permission.SMART_PLUGS_READ,
  244. Permission.SMART_PLUGS_CREATE,
  245. Permission.SMART_PLUGS_UPDATE,
  246. Permission.SMART_PLUGS_DELETE,
  247. Permission.SMART_PLUGS_CONTROL,
  248. ],
  249. "Camera": [
  250. Permission.CAMERA_VIEW,
  251. ],
  252. "Maintenance": [
  253. Permission.MAINTENANCE_READ,
  254. Permission.MAINTENANCE_CREATE,
  255. Permission.MAINTENANCE_UPDATE,
  256. Permission.MAINTENANCE_DELETE,
  257. ],
  258. "K-Profiles": [
  259. Permission.KPROFILES_READ,
  260. Permission.KPROFILES_CREATE,
  261. Permission.KPROFILES_UPDATE,
  262. Permission.KPROFILES_DELETE,
  263. ],
  264. "Notifications": [
  265. Permission.NOTIFICATIONS_READ,
  266. Permission.NOTIFICATIONS_CREATE,
  267. Permission.NOTIFICATIONS_UPDATE,
  268. Permission.NOTIFICATIONS_DELETE,
  269. Permission.NOTIFICATIONS_USER_EMAIL,
  270. Permission.NOTIFICATION_TEMPLATES_READ,
  271. Permission.NOTIFICATION_TEMPLATES_UPDATE,
  272. ],
  273. "External Links": [
  274. Permission.EXTERNAL_LINKS_READ,
  275. Permission.EXTERNAL_LINKS_CREATE,
  276. Permission.EXTERNAL_LINKS_UPDATE,
  277. Permission.EXTERNAL_LINKS_DELETE,
  278. ],
  279. "Discovery": [
  280. Permission.DISCOVERY_SCAN,
  281. ],
  282. "Firmware": [
  283. Permission.FIRMWARE_READ,
  284. Permission.FIRMWARE_UPDATE,
  285. ],
  286. "Stats & History": [
  287. Permission.AMS_HISTORY_READ,
  288. Permission.PRINTER_SENSOR_HISTORY_READ,
  289. Permission.STATS_READ,
  290. Permission.STATS_FILTER_BY_USER,
  291. ],
  292. "Finance": [
  293. Permission.COST_CENTERS_READ_OWN,
  294. Permission.COST_CENTERS_READ_ALL,
  295. Permission.COST_CENTERS_MODIFY,
  296. Permission.COST_CENTERS_CREATE,
  297. ],
  298. "System": [
  299. Permission.SYSTEM_READ,
  300. ],
  301. "Settings": [
  302. Permission.SETTINGS_READ,
  303. Permission.SETTINGS_UPDATE,
  304. Permission.SETTINGS_BACKUP,
  305. Permission.SETTINGS_RESTORE,
  306. ],
  307. "Backup": [
  308. Permission.GITHUB_BACKUP,
  309. Permission.GITHUB_RESTORE,
  310. ],
  311. "Cloud": [
  312. Permission.CLOUD_AUTH,
  313. Permission.ORCA_CLOUD_AUTH,
  314. ],
  315. "MakerWorld": [
  316. Permission.MAKERWORLD_VIEW,
  317. Permission.MAKERWORLD_IMPORT,
  318. ],
  319. "Manyfold": [
  320. Permission.MANYFOLD_VIEW,
  321. Permission.MANYFOLD_IMPORT,
  322. ],
  323. "API Keys": [
  324. Permission.API_KEYS_READ,
  325. Permission.API_KEYS_CREATE,
  326. Permission.API_KEYS_UPDATE,
  327. Permission.API_KEYS_DELETE,
  328. ],
  329. "User Management": [
  330. Permission.USERS_READ,
  331. Permission.USERS_READ_SLIM,
  332. Permission.USERS_CREATE,
  333. Permission.USERS_UPDATE,
  334. Permission.USERS_DELETE,
  335. Permission.GROUPS_READ,
  336. Permission.GROUPS_CREATE,
  337. Permission.GROUPS_UPDATE,
  338. Permission.GROUPS_DELETE,
  339. ],
  340. "Slicer Pipelines": [
  341. Permission.PIPELINES_READ,
  342. Permission.PIPELINES_WRITE,
  343. Permission.PIPELINES_RUN,
  344. ],
  345. "WebSocket": [
  346. Permission.WEBSOCKET_CONNECT,
  347. ],
  348. }
  349. # All permissions as a list
  350. ALL_PERMISSIONS = [p.value for p in Permission]
  351. # Default group definitions
  352. DEFAULT_GROUPS = {
  353. "Administrators": {
  354. "description": "Full access to all features and settings",
  355. "permissions": ALL_PERMISSIONS, # All permissions
  356. "is_system": True,
  357. },
  358. "Operators": {
  359. "description": "Can control printers, manage queue and archives, view settings",
  360. "permissions": [
  361. # Printers - full control
  362. Permission.PRINTERS_READ.value,
  363. Permission.PRINTERS_CREATE.value,
  364. Permission.PRINTERS_UPDATE.value,
  365. Permission.PRINTERS_DELETE.value,
  366. Permission.PRINTERS_CONTROL.value,
  367. Permission.PRINTERS_FILES.value,
  368. Permission.PRINTERS_AMS_RFID.value,
  369. Permission.PRINTERS_CLEAR_PLATE.value,
  370. # Archives - own items only
  371. Permission.ARCHIVES_READ_OWN.value,
  372. Permission.ARCHIVES_CREATE.value,
  373. Permission.ARCHIVES_UPDATE_OWN.value,
  374. Permission.ARCHIVES_DELETE_OWN.value,
  375. Permission.ARCHIVES_REPRINT_OWN.value,
  376. # Queue - own items only
  377. Permission.QUEUE_READ_OWN.value,
  378. Permission.QUEUE_CREATE.value,
  379. Permission.QUEUE_UPDATE_OWN.value,
  380. Permission.QUEUE_DELETE_OWN.value,
  381. Permission.QUEUE_REORDER.value,
  382. Permission.QUEUE_START_UNREVIEWED.value,
  383. # Library - own items only
  384. Permission.LIBRARY_READ_OWN.value,
  385. Permission.LIBRARY_UPLOAD.value,
  386. Permission.LIBRARY_UPDATE_OWN.value,
  387. Permission.LIBRARY_DELETE_OWN.value,
  388. # MakerWorld integration
  389. Permission.MAKERWORLD_VIEW.value,
  390. Permission.MAKERWORLD_IMPORT.value,
  391. # Manyfold integration
  392. Permission.MANYFOLD_VIEW.value,
  393. Permission.MANYFOLD_IMPORT.value,
  394. # Orca Cloud — needed for the Slice modal's Orca Cloud preset
  395. # picker to populate. Workshops that use Orca Cloud presets
  396. # need every operator to be able to authenticate. Bambu Cloud
  397. # (CLOUD_AUTH) stays admin-only — that one is a more sensitive
  398. # account binding.
  399. Permission.ORCA_CLOUD_AUTH.value,
  400. # Projects - full access
  401. Permission.PROJECTS_READ.value,
  402. Permission.PROJECTS_CREATE.value,
  403. Permission.PROJECTS_UPDATE.value,
  404. Permission.PROJECTS_DELETE.value,
  405. # Filaments - full access
  406. Permission.FILAMENTS_READ.value,
  407. Permission.FILAMENTS_CREATE.value,
  408. Permission.FILAMENTS_UPDATE.value,
  409. Permission.FILAMENTS_DELETE.value,
  410. # Inventory - full access
  411. Permission.INVENTORY_READ.value,
  412. Permission.INVENTORY_CREATE.value,
  413. Permission.INVENTORY_UPDATE.value,
  414. Permission.INVENTORY_DELETE.value,
  415. Permission.INVENTORY_VIEW_ASSIGNMENTS.value,
  416. Permission.INVENTORY_FORECAST_READ.value,
  417. Permission.INVENTORY_FORECAST_WRITE.value,
  418. # Smart Plugs - full access
  419. Permission.SMART_PLUGS_READ.value,
  420. Permission.SMART_PLUGS_CREATE.value,
  421. Permission.SMART_PLUGS_UPDATE.value,
  422. Permission.SMART_PLUGS_DELETE.value,
  423. Permission.SMART_PLUGS_CONTROL.value,
  424. # Camera - view
  425. Permission.CAMERA_VIEW.value,
  426. # Maintenance - full access
  427. Permission.MAINTENANCE_READ.value,
  428. Permission.MAINTENANCE_CREATE.value,
  429. Permission.MAINTENANCE_UPDATE.value,
  430. Permission.MAINTENANCE_DELETE.value,
  431. # K-Profiles - full access
  432. Permission.KPROFILES_READ.value,
  433. Permission.KPROFILES_CREATE.value,
  434. Permission.KPROFILES_UPDATE.value,
  435. Permission.KPROFILES_DELETE.value,
  436. # Notifications - full access
  437. Permission.NOTIFICATIONS_READ.value,
  438. Permission.NOTIFICATIONS_CREATE.value,
  439. Permission.NOTIFICATIONS_UPDATE.value,
  440. Permission.NOTIFICATIONS_DELETE.value,
  441. Permission.NOTIFICATIONS_USER_EMAIL.value,
  442. Permission.NOTIFICATION_TEMPLATES_READ.value,
  443. Permission.NOTIFICATION_TEMPLATES_UPDATE.value,
  444. # External Links - full access
  445. Permission.EXTERNAL_LINKS_READ.value,
  446. Permission.EXTERNAL_LINKS_CREATE.value,
  447. Permission.EXTERNAL_LINKS_UPDATE.value,
  448. Permission.EXTERNAL_LINKS_DELETE.value,
  449. # Discovery
  450. Permission.DISCOVERY_SCAN.value,
  451. # Firmware - read only
  452. Permission.FIRMWARE_READ.value,
  453. # Stats & History
  454. Permission.AMS_HISTORY_READ.value,
  455. Permission.PRINTER_SENSOR_HISTORY_READ.value,
  456. Permission.STATS_READ.value,
  457. Permission.SYSTEM_READ.value,
  458. # Finance - own visibility
  459. Permission.COST_CENTERS_READ_OWN.value,
  460. # Settings - read only
  461. Permission.SETTINGS_READ.value,
  462. # Slicer Pipelines - full access
  463. Permission.PIPELINES_READ.value,
  464. Permission.PIPELINES_WRITE.value,
  465. Permission.PIPELINES_RUN.value,
  466. # WebSocket
  467. Permission.WEBSOCKET_CONNECT.value,
  468. ],
  469. "is_system": True,
  470. },
  471. "Viewers": {
  472. "description": "Read-only access to printers, archives, and queue",
  473. "permissions": [
  474. # Read-only access
  475. Permission.PRINTERS_READ.value,
  476. Permission.ARCHIVES_READ_OWN.value,
  477. Permission.QUEUE_READ_OWN.value,
  478. Permission.LIBRARY_READ_OWN.value,
  479. Permission.PROJECTS_READ.value,
  480. Permission.FILAMENTS_READ.value,
  481. Permission.INVENTORY_READ.value,
  482. Permission.INVENTORY_VIEW_ASSIGNMENTS.value,
  483. Permission.INVENTORY_FORECAST_READ.value,
  484. Permission.SMART_PLUGS_READ.value,
  485. Permission.CAMERA_VIEW.value,
  486. Permission.MAINTENANCE_READ.value,
  487. Permission.KPROFILES_READ.value,
  488. Permission.NOTIFICATIONS_READ.value,
  489. Permission.NOTIFICATION_TEMPLATES_READ.value,
  490. Permission.EXTERNAL_LINKS_READ.value,
  491. Permission.FIRMWARE_READ.value,
  492. Permission.AMS_HISTORY_READ.value,
  493. Permission.PRINTER_SENSOR_HISTORY_READ.value,
  494. Permission.STATS_READ.value,
  495. Permission.SYSTEM_READ.value,
  496. Permission.SETTINGS_READ.value,
  497. # Slicer Pipelines - read only
  498. Permission.PIPELINES_READ.value,
  499. Permission.WEBSOCKET_CONNECT.value,
  500. # MakerWorld browsing only (no import — that writes to library)
  501. Permission.MAKERWORLD_VIEW.value,
  502. # Manyfold browsing only, for the same reason
  503. Permission.MANYFOLD_VIEW.value,
  504. ],
  505. "is_system": True,
  506. },
  507. }