|
1 | | -from django.db.models.signals import m2m_changed |
| 1 | +from django.db.models.signals import m2m_changed, pre_delete |
2 | 2 | from django.dispatch import receiver |
3 | 3 | from guardian.shortcuts import assign_perm, remove_perm |
4 | 4 |
|
@@ -59,6 +59,17 @@ def update_input_image_permissions( |
59 | 59 | ) |
60 | 60 |
|
61 | 61 |
|
| 62 | +def _get_image_civs(*, jobs): |
| 63 | + queryset = ComponentInterfaceValue.objects.filter( |
| 64 | + image__isnull=False |
| 65 | + ).select_related("image") |
| 66 | + |
| 67 | + input_civs = queryset.filter(algorithms_jobs_as_input__in=jobs) |
| 68 | + output_civs = queryset.filter(algorithms_jobs_as_output__in=jobs) |
| 69 | + |
| 70 | + return {*input_civs, *output_civs} |
| 71 | + |
| 72 | + |
62 | 73 | def _update_image_permissions( |
63 | 74 | *, jobs, component_interface_values, exclude_jobs: bool |
64 | 75 | ): |
@@ -96,17 +107,23 @@ def update_group_permissions( |
96 | 107 | for group in groups: |
97 | 108 | operation("view_job", group, job) |
98 | 109 |
|
99 | | - queryset = ComponentInterfaceValue.objects.filter( |
100 | | - image__isnull=False |
101 | | - ).select_related("image") |
| 110 | + component_interface_values = _get_image_civs(jobs=jobs) |
| 111 | + |
| 112 | + _update_image_permissions( |
| 113 | + jobs=jobs, |
| 114 | + component_interface_values=component_interface_values, |
| 115 | + exclude_jobs=action == "pre_clear", |
| 116 | + ) |
102 | 117 |
|
103 | | - input_civs = queryset.filter(algorithms_jobs_as_input__in=jobs) |
104 | | - output_civs = queryset.filter(algorithms_jobs_as_output__in=jobs) |
105 | 118 |
|
106 | | - component_interface_values = {*input_civs, *output_civs} |
| 119 | +@receiver(pre_delete, sender=Job) |
| 120 | +def update_permissions_on_job_deletion(*_, instance: Job, signal, **__): |
| 121 | + jobs = [instance] |
| 122 | + |
| 123 | + component_interface_values = _get_image_civs(jobs=jobs) |
107 | 124 |
|
108 | 125 | _update_image_permissions( |
109 | 126 | jobs=jobs, |
110 | 127 | component_interface_values=component_interface_values, |
111 | | - exclude_jobs=action == "pre_clear", |
| 128 | + exclude_jobs=signal == pre_delete, |
112 | 129 | ) |
0 commit comments