diff --git a/sync/models/base.py b/sync/models/base.py index 46955a1..cefd9f6 100644 --- a/sync/models/base.py +++ b/sync/models/base.py @@ -40,9 +40,15 @@ class BaseModel(models.Model): def update_data_access_list(self): related_instances = self.sharing_related_instances() - data_access_ids = [instance.data_access_ids for instance in related_instances if isinstance(instance, BaseModel)] - data_access_ids.extend(self.data_access_ids) - self.data_access_ids = data_access_ids + data_access_ids = {} + for instance in related_instances: + if isinstance(instance, BaseModel) and instance.data_access_ids: + data_access_ids.append(instance.data_access_ids) + + # print(f'related_instances = {related_instances}') + # data_access_ids = [instance.data_access_ids for instance in related_instances if isinstance(instance, BaseModel)] + # data_access_ids.extend(self.data_access_ids) + self.data_access_ids = list(data_access_ids) # DataAccess = apps.get_model('sync', 'DataAccess') # data_accesses = DataAccess.objects.filter(model_id__in=related_ids) diff --git a/sync/signals.py b/sync/signals.py index 7e275a8..0b9c6c4 100644 --- a/sync/signals.py +++ b/sync/signals.py @@ -11,7 +11,6 @@ from .ws_sender import websocket_sender from .registry import device_registry, related_users_registry import logging -import sys import traceback logger = logging.getLogger(__name__) @@ -34,29 +33,13 @@ def presave_handler(sender, instance, **kwargs): return users = related_users(instance) - related_users_registry.register(instance.id, users) if signal == pre_save: detect_foreign_key_changes_for_shared_instances(sender, instance) - sig_type = 'pre_save' - elif signal == pre_delete: - # if hasattr(instance, 'id'): - # try: - # data_access_list = DataAccess.objects.filter(model_id=instance.id) - # if data_access_list: - # logger.info(f'>>> {instance.__class__.__name__} {instance.id} : delete {data_access_list.count()} DataAccess') - # data_access_list.delete() - # except Exception as e: - # logger.info(f'*** ERRRRRRR: {e}') - # logger.info(traceback.format_exc()) - # raise - - sig_type = 'pre_delete' - # logger.info(f'* {sig_type} : {instance.__class__.__name__} > impacted users = {users}') except Exception as e: - logger.info(f'*** ERROR: {e}') + logger.info(f'*** presave_handler ERROR: {e}') raise @receiver([post_save, post_delete]) @@ -344,12 +327,10 @@ def related_users(instance): elif isinstance(instance, BaseModel): users.add(instance.related_user) data_access_list = DataAccess.objects.filter(id__in=instance.data_access_ids) - # print(f'instance = {instance.__class__.__name__}, data access count = {len(data_access_list)}') for data_access in data_access_list: users.add(data_access.related_user) users.update(data_access.shared_with.all()) - if isinstance(instance, DataAccess): users.update(instance.shared_with.all()) diff --git a/sync/views.py b/sync/views.py index c4dd8e3..100ff72 100644 --- a/sync/views.py +++ b/sync/views.py @@ -340,14 +340,17 @@ class LogProcessingResult: shared = defaultdict(dict) grants = defaultdict(dict) + try: # Process each grant instance - for model_name, instances in self.shared_instances.items(): - for model_id, instance in instances.items(): - serializer = get_serializer(instance, model_name) - shared[model_name][model_id] = serializer.data + for model_name, instances in self.shared_instances.items(): + for model_id, instance in instances.items(): + serializer = get_serializer(instance, model_name) + shared[model_name][model_id] = serializer.data - add_children_hierarchy(instance, grants) - add_parents_recursively(instance, grants) + add_children_hierarchy(instance, grants) + add_parents_recursively(instance, grants) + except Exception as e: + print(f'ERR = {e}') # Convert to lists for model_name in shared: @@ -363,7 +366,7 @@ class LogProcessingResult: revocations_parents_organizer = HierarchyOrganizer() # logger.info(f'$$$ process_revocations: {len(self.revoke_info)}') - sync_models = getattr(settings, 'SYNC_MODEL_CHILDREN_SHARING', {}) + # sync_models = getattr(settings, 'SYNC_MODEL_CHILDREN_SHARING', {}) # First, collect all revocations for model_name, items in self.revoke_info.items():