feat: phase 3 - field-level permissions with plugin field definitions, service-layer filtering, 20 core field definitions
This commit is contained in:
@@ -59,6 +59,31 @@ CORE_PERMISSIONS: list[dict[str, str]] = [
|
||||
]
|
||||
|
||||
|
||||
# ── Core field definitions for field-level permissions ──
|
||||
CORE_FIELD_DEFINITIONS: list[dict[str, str]] = [
|
||||
{"module": "companies", "field": "name", "label": "Name", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "account_number", "label": "Account Number", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "industry", "label": "Industry", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "phone", "label": "Phone", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "email", "label": "Email", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "website", "label": "Website", "sensitivity": "normal"},
|
||||
{"module": "companies", "field": "description", "label": "Description", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "first_name", "label": "First Name", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "last_name", "label": "Last Name", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "email", "label": "Email", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "phone", "label": "Phone", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "mobile", "label": "Mobile", "sensitivity": "sensitive"},
|
||||
{"module": "contacts", "field": "position", "label": "Position", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "department", "label": "Department", "sensitivity": "normal"},
|
||||
{"module": "contacts", "field": "linkedin_url", "label": "LinkedIn URL", "sensitivity": "sensitive"},
|
||||
{"module": "contacts", "field": "notes", "label": "Notes", "sensitivity": "sensitive"},
|
||||
{"module": "users", "field": "email", "label": "Email", "sensitivity": "normal"},
|
||||
{"module": "users", "field": "name", "label": "Name", "sensitivity": "normal"},
|
||||
{"module": "users", "field": "role", "label": "Role", "sensitivity": "normal"},
|
||||
{"module": "users", "field": "is_active", "label": "Active", "sensitivity": "normal"},
|
||||
]
|
||||
|
||||
|
||||
class PermissionRegistry:
|
||||
"""Central registry of all valid permissions (core + active plugins)."""
|
||||
|
||||
@@ -67,6 +92,8 @@ class PermissionRegistry:
|
||||
self._plugin_permissions: dict[str, list[dict[str, str]]] = {} # plugin_name → perms
|
||||
self._active_plugins: set[str] = set()
|
||||
self._initialized = False
|
||||
self._field_definitions: dict[str, list[dict[str, str]]] = {} # plugin_name → field_defs
|
||||
self._core_field_definitions: list[dict[str, str]] = list(CORE_FIELD_DEFINITIONS)
|
||||
|
||||
def initialize(self, active_plugin_names: set[str] | None = None) -> None:
|
||||
"""Build the registry from core permissions and active plugin manifests."""
|
||||
@@ -137,6 +164,18 @@ class PermissionRegistry:
|
||||
groups[cat].append(perm)
|
||||
return groups
|
||||
|
||||
def register_field_definitions(self, plugin_name: str, field_defs: list[dict[str, str]]) -> None:
|
||||
"""Register field definitions from a plugin."""
|
||||
self._field_definitions[plugin_name] = field_defs
|
||||
logger.info("Registered %d field definitions for plugin '%s'", len(field_defs), plugin_name)
|
||||
|
||||
def get_all_field_definitions(self) -> list[dict[str, str]]:
|
||||
"""Return all registered field definitions."""
|
||||
result = list(self._core_field_definitions)
|
||||
for defs in self._field_definitions.values():
|
||||
result.extend(defs)
|
||||
return result
|
||||
|
||||
|
||||
# Global instance
|
||||
_registry = PermissionRegistry()
|
||||
|
||||
Reference in New Issue
Block a user