|
|
|
|
@ -13,24 +13,6 @@ from .registry import device_registry, related_users_registry |
|
|
|
|
|
|
|
|
|
User = get_user_model() |
|
|
|
|
|
|
|
|
|
### Device |
|
|
|
|
|
|
|
|
|
@receiver(post_save, sender=Device) |
|
|
|
|
def device_created(sender, instance, **kwargs): |
|
|
|
|
if not instance.user: |
|
|
|
|
return |
|
|
|
|
evaluate_if_user_should_sync(instance.user) |
|
|
|
|
|
|
|
|
|
@receiver(pre_delete, sender=Device) |
|
|
|
|
def device_pre_delete(sender, instance, **kwargs): |
|
|
|
|
instance._user = instance.user if instance.user else None |
|
|
|
|
|
|
|
|
|
@receiver(post_delete, sender=Device) |
|
|
|
|
def device_post_delete(sender, instance, **kwargs): |
|
|
|
|
if not hasattr(instance, '_user') or not instance._user: |
|
|
|
|
return |
|
|
|
|
evaluate_if_user_should_sync(instance._user) |
|
|
|
|
|
|
|
|
|
### Sync |
|
|
|
|
|
|
|
|
|
@receiver([pre_save, pre_delete]) |
|
|
|
|
@ -139,9 +121,11 @@ def save_model_log(users, model_operation, model_name, model_id, store_id): |
|
|
|
|
|
|
|
|
|
device_id = device_registry.get_device_id(model_id) |
|
|
|
|
|
|
|
|
|
# print(f'>> creating Model Log for: {model_operation} {model_name}') |
|
|
|
|
|
|
|
|
|
with transaction.atomic(): |
|
|
|
|
for user in users: |
|
|
|
|
# print(f'>>> create log for {user.username} : {model_operation} {model_name}') |
|
|
|
|
# print(f' * {user.username}') |
|
|
|
|
|
|
|
|
|
# if user.should_synchronize: |
|
|
|
|
model_log = ModelLog() |
|
|
|
|
@ -273,11 +257,14 @@ def handle_shared_with_changes(sender, instance, action, pk_set, **kwargs): |
|
|
|
|
|
|
|
|
|
@receiver(post_save, sender=DataAccess) |
|
|
|
|
def data_access_post_save(sender, instance, **kwargs): |
|
|
|
|
instance.add_references() # create DataAccess references on hierarchy |
|
|
|
|
|
|
|
|
|
if instance.related_user: |
|
|
|
|
evaluate_if_user_should_sync(instance.related_user) |
|
|
|
|
|
|
|
|
|
@receiver(pre_delete, sender=DataAccess) |
|
|
|
|
def revoke_access_after_delete(sender, instance, **kwargs): |
|
|
|
|
instance.cleanup_references() |
|
|
|
|
instance.create_revoke_access_log() |
|
|
|
|
related_users_registry.register(instance.id, instance.shared_with.all()) |
|
|
|
|
|
|
|
|
|
@ -300,13 +287,16 @@ def related_users(instance): |
|
|
|
|
# users.add(instance.last_updated_by) |
|
|
|
|
|
|
|
|
|
# look in hierarchy |
|
|
|
|
related_instances = instance.related_instances() |
|
|
|
|
# related_instances = instance.related_instances() |
|
|
|
|
# print(f'related_instances = {related_instances}') |
|
|
|
|
# related_users = [ri.related_user for ri in related_instances if isinstance(ri, BaseModel)] |
|
|
|
|
# users.update(related_users) |
|
|
|
|
|
|
|
|
|
data_access_list = DataAccess.objects.filter(id__in=instance.data_access_ids) |
|
|
|
|
|
|
|
|
|
# look in related DataAccess |
|
|
|
|
data_access_list = instances_related_data_access(instance, related_instances) |
|
|
|
|
# data_access_list = instances_related_data_access(instance, related_instances) |
|
|
|
|
# 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()) |
|
|
|
|
@ -318,9 +308,6 @@ def related_users(instance): |
|
|
|
|
|
|
|
|
|
def related_data_access(instance): |
|
|
|
|
related_instances = instance.related_instances() |
|
|
|
|
return instances_related_data_access(instance, related_instances) |
|
|
|
|
|
|
|
|
|
def instances_related_data_access(instance, related_instances): |
|
|
|
|
related_ids = [ri.id for ri in related_instances] |
|
|
|
|
related_ids.append(instance.id) |
|
|
|
|
return DataAccess.objects.filter(model_id__in=related_ids) |
|
|
|
|
@ -339,3 +326,21 @@ def evaluate_if_user_should_sync(user): |
|
|
|
|
user.should_synchronize = should_synchronize |
|
|
|
|
# if we go from True to False we might want to delete ModelLog once the last device has synchronized |
|
|
|
|
user.save() |
|
|
|
|
|
|
|
|
|
### Device |
|
|
|
|
|
|
|
|
|
@receiver(post_save, sender=Device) |
|
|
|
|
def device_created(sender, instance, **kwargs): |
|
|
|
|
if not instance.user: |
|
|
|
|
return |
|
|
|
|
evaluate_if_user_should_sync(instance.user) |
|
|
|
|
|
|
|
|
|
@receiver(pre_delete, sender=Device) |
|
|
|
|
def device_pre_delete(sender, instance, **kwargs): |
|
|
|
|
instance._user = instance.user if instance.user else None |
|
|
|
|
|
|
|
|
|
@receiver(post_delete, sender=Device) |
|
|
|
|
def device_post_delete(sender, instance, **kwargs): |
|
|
|
|
if not hasattr(instance, '_user') or not instance._user: |
|
|
|
|
return |
|
|
|
|
evaluate_if_user_should_sync(instance._user) |
|
|
|
|
|