- Added migration to create economic_change_requests table for tracking change requests for customers and products. - Introduced new permissions for requesting and approving changes in e-conomic. - Developed frontend JavaScript functionality for managing economic catalog, including handling change requests and displaying their statuses. - Created browser tests to validate UI interactions related to product management and change requests. - Added unit tests for backend logic to ensure proper handling of product numbers, price rules, and economic write policies.
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""The deliberately narrow set of external e-conomic mutations BMC Hub permits."""
|
|
from contextlib import contextmanager
|
|
from contextvars import ContextVar
|
|
import re
|
|
|
|
from fastapi import HTTPException
|
|
|
|
# Reading any endpoint is allowed. Writes are an explicit allow-list, not a
|
|
# deny-list, so a new endpoint cannot accidentally become writable.
|
|
ALLOWED_WRITES = {
|
|
('POST', 'customers'),
|
|
('POST', 'products'),
|
|
('POST', 'orders/drafts'),
|
|
}
|
|
|
|
_approved_four_eyes_write = ContextVar('approved_four_eyes_write', default=False)
|
|
_FOUR_EYES_UPDATES = re.compile(r'^(?:customers|products)/[^/]+$')
|
|
|
|
|
|
@contextmanager
|
|
def approved_four_eyes_write():
|
|
"""Permit one approved customer/product update in the current async context."""
|
|
token = _approved_four_eyes_write.set(True)
|
|
try:
|
|
yield
|
|
finally:
|
|
_approved_four_eyes_write.reset(token)
|
|
|
|
|
|
def assert_economic_write_allowed(method: str, path: str) -> None:
|
|
clean_path = path.split('?', 1)[0].strip('/')
|
|
operation = (method.upper(), clean_path)
|
|
approved_update = (
|
|
operation[0] == 'PUT'
|
|
and _FOUR_EYES_UPDATES.fullmatch(clean_path)
|
|
and _approved_four_eyes_write.get()
|
|
)
|
|
if operation not in ALLOWED_WRITES and not approved_update:
|
|
raise HTTPException(
|
|
status_code=403,
|
|
detail='e-conomic er låst: Hub må kun oprette kunder, varer og ordrekladder',
|
|
)
|