diff --git a/log_management/admin.py b/log_management/admin.py index 44865db3..467c6d09 100644 --- a/log_management/admin.py +++ b/log_management/admin.py @@ -31,6 +31,14 @@ def export_anonymous_chrono_data_all(self, request, queryset): export_anonymous_chrono_data_all.short_description = \ 'export_anonymous_chrono_data_all' +def export_anonymous_chrono_data_selected(self, request, queryset): + targetIds = list(queryset.all().values_list('id', flat=True)) + export_anonymous_chrono_data.delay(request.user.id, targetIds=targetIds) + + +export_anonymous_chrono_data_selected.short_description = \ + 'export_anonymous_chrono_data_selected' + class LogAdmin(admin.ModelAdmin): list_display = ('source', 'level', 'error_code', 'message', 'created') @@ -61,6 +69,7 @@ class ActionLogAdmin(admin.ModelAdmin): actions = [ export_anonymous_chrono_data_month, export_anonymous_chrono_data_all, + export_anonymous_chrono_data_selected, ] list_display = ( 'id', diff --git a/log_management/models.py b/log_management/models.py index 97acc10d..242f7bea 100644 --- a/log_management/models.py +++ b/log_management/models.py @@ -154,25 +154,25 @@ class Meta: verbose_name_plural = _("Action Logs") @classmethod - def anonymize_data(cls, start_date=None, end_date=None): + def anonymize_data(cls, start_date=None, end_date=None, targetIds=None): """ Return a list of dict, one per ActionLog, where any reference to a user has been modified to a new UUID. We only want either the user or the session in a user column :params start_date: date to filter the range :params end_date: date to filter the range + :params targetIds: a list of ids to filter the data return nothing but will send an email when export is ready """ anonymized_data = [] user_uuid_matching = {} session_uuid_matching = {} + queryset = cls.objects.filter(id__in=targetIds) if targetIds else cls.objects.all() if start_date and end_date: - queryset = cls.objects.filter( + queryset = queryset.objects.filter( created__gte=start_date, created__lte=end_date, ) - else: - queryset = cls.objects.all() for action in queryset: anonymized_action = {} diff --git a/log_management/tasks.py b/log_management/tasks.py index 7394077f..99087394 100644 --- a/log_management/tasks.py +++ b/log_management/tasks.py @@ -9,7 +9,7 @@ @shared_task() -def export_anonymous_chrono_data(admin_id, start_date=None, end_date=None): +def export_anonymous_chrono_data(admin_id, start_date=None, end_date=None, targetIds=None): """ Allow an admin to export chrono data between 2 dates. Data will be anonymized and sent by email to the admin as CSV. @@ -26,7 +26,7 @@ def export_anonymous_chrono_data(admin_id, start_date=None, end_date=None): if end_date : end_date = datetime.datetime.strptime( end_date, '%Y-%m-%d %H:%M:%S %z') - anonymized_actions = ActionLog.anonymize_data(start_date, end_date) + anonymized_actions = ActionLog.anonymize_data(start_date, end_date, targetIds) # Create a csv export_data = []