|
|
|
|
@ -17,28 +17,23 @@ User = get_user_model() |
|
|
|
|
|
|
|
|
|
@receiver([pre_save, pre_delete]) |
|
|
|
|
def presave_handler(sender, instance, **kwargs): |
|
|
|
|
synchronization_prepare(sender, instance, **kwargs) |
|
|
|
|
|
|
|
|
|
def synchronization_prepare(sender, instance, **kwargs): |
|
|
|
|
# some other classes are excluded in settings_app.py: SYNC_APPS |
|
|
|
|
if not isinstance(instance, (BaseModel, User)): |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
# print(f'*** synchronization_prepare for instance: {instance}') |
|
|
|
|
signal = kwargs.get('signal') |
|
|
|
|
|
|
|
|
|
# avoid crash in manage.py createsuperuser + delete user in the admin |
|
|
|
|
if isinstance(instance, User) and (instance._state.db is None or signal == pre_delete): |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
# some other classes are excluded in settings_app.py: SYNC_APPS |
|
|
|
|
if not isinstance(instance, BaseModel) and not isinstance(instance, User): |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
users = related_users(instance) |
|
|
|
|
# print(f'* impacted users = {users}') |
|
|
|
|
related_users_registry.register(instance.id, users) |
|
|
|
|
# user_ids = [user.id for user in users] |
|
|
|
|
|
|
|
|
|
if signal == pre_save: |
|
|
|
|
detect_foreign_key_changes(sender, instance) |
|
|
|
|
detect_foreign_key_changes_for_shared_instances(sender, instance) |
|
|
|
|
|
|
|
|
|
@receiver([post_save, post_delete]) |
|
|
|
|
def synchronization_notifications(sender, instance, created=False, **kwargs): |
|
|
|
|
@ -123,19 +118,35 @@ def save_model_log(users, model_operation, model_name, model_id, store_id): |
|
|
|
|
|
|
|
|
|
# print(f'>> creating Model Log for: {model_operation} {model_name}') |
|
|
|
|
|
|
|
|
|
logs_to_create = [ |
|
|
|
|
ModelLog( |
|
|
|
|
user=user, |
|
|
|
|
operation=model_operation, |
|
|
|
|
model_name=model_name, |
|
|
|
|
model_id=model_id, |
|
|
|
|
store_id=store_id, |
|
|
|
|
device_id=device_id |
|
|
|
|
) |
|
|
|
|
for user in users |
|
|
|
|
# if user.should_synchronize |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
with transaction.atomic(): |
|
|
|
|
for user in users: |
|
|
|
|
# print(f' * {user.username}') |
|
|
|
|
|
|
|
|
|
# if user.should_synchronize: |
|
|
|
|
model_log = ModelLog() |
|
|
|
|
model_log.user = user |
|
|
|
|
model_log.operation = model_operation |
|
|
|
|
model_log.model_name = model_name |
|
|
|
|
model_log.model_id = model_id |
|
|
|
|
model_log.store_id = store_id |
|
|
|
|
model_log.device_id = device_id |
|
|
|
|
model_log.save() |
|
|
|
|
ModelLog.objects.bulk_create(logs_to_create) |
|
|
|
|
|
|
|
|
|
# with transaction.atomic(): |
|
|
|
|
# for user in users: |
|
|
|
|
# # print(f' * {user.username}') |
|
|
|
|
|
|
|
|
|
# # if user.should_synchronize: |
|
|
|
|
# model_log = ModelLog() |
|
|
|
|
# model_log.user = user |
|
|
|
|
# model_log.operation = model_operation |
|
|
|
|
# model_log.model_name = model_name |
|
|
|
|
# model_log.model_id = model_id |
|
|
|
|
# model_log.store_id = store_id |
|
|
|
|
# model_log.device_id = device_id |
|
|
|
|
# model_log.save() |
|
|
|
|
|
|
|
|
|
# print(f'ML users = {len(users)}') |
|
|
|
|
# existing_log = ModelLog.objects.filter(users__in=users, model_id=model_id, operation=model_operation).first() |
|
|
|
|
@ -157,7 +168,7 @@ def save_model_log(users, model_operation, model_name, model_id, store_id): |
|
|
|
|
# model_log.save() |
|
|
|
|
# model_log.users.set(users) |
|
|
|
|
|
|
|
|
|
def detect_foreign_key_changes(sender, instance): |
|
|
|
|
def detect_foreign_key_changes_for_shared_instances(sender, instance): |
|
|
|
|
if not hasattr(instance, 'pk') or not instance.pk: |
|
|
|
|
return |
|
|
|
|
if not isinstance(instance, BaseModel): |
|
|
|
|
@ -296,7 +307,7 @@ def related_users(instance): |
|
|
|
|
|
|
|
|
|
# look in related DataAccess |
|
|
|
|
# data_access_list = instances_related_data_access(instance, related_instances) |
|
|
|
|
print(f'instance = {instance.__class__.__name__}, data access count = {len(data_access_list)}') |
|
|
|
|
# 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()) |
|
|
|
|
|