|
7 | 7 | from django.contrib.admin.utils import model_ngettext |
8 | 8 | from django.contrib.auth import get_user_model |
9 | 9 | from django.core.exceptions import PermissionDenied |
| 10 | +from django.http import HttpResponseRedirect |
10 | 11 | from django.templatetags.static import static |
11 | 12 | from django.urls import reverse |
12 | 13 | from django.utils.safestring import mark_safe |
@@ -338,13 +339,15 @@ class RadiusBatchAdmin(MultitenantAdminMixin, TimeStampedEditableAdmin): |
338 | 339 | "name", |
339 | 340 | "organization", |
340 | 341 | "strategy", |
| 342 | + "status", |
341 | 343 | "expiration_date", |
342 | 344 | "created", |
343 | 345 | "modified", |
344 | 346 | ] |
345 | 347 | fields = [ |
346 | 348 | "strategy", |
347 | 349 | "organization", |
| 350 | + "status", |
348 | 351 | "name", |
349 | 352 | "csvfile", |
350 | 353 | "prefix", |
@@ -393,25 +396,21 @@ def number_of_users(self, obj): |
393 | 396 | number_of_users.short_description = _("number of users") |
394 | 397 |
|
395 | 398 | def get_fields(self, request, obj=None): |
396 | | - fields = super().get_fields(request, obj)[:] |
| 399 | + fields = super().get_fields(request, obj) |
397 | 400 | if not obj: |
| 401 | + fields = fields[:] |
398 | 402 | fields.remove("users") |
| 403 | + fields.remove("status") |
399 | 404 | return fields |
400 | 405 |
|
401 | 406 | def save_model(self, request, obj, form, change): |
402 | | - data = form.cleaned_data |
403 | | - strategy = data.get("strategy") |
404 | | - if not change: |
405 | | - if strategy == "csv": |
406 | | - if data.get("csvfile", False): |
407 | | - csvfile = data.get("csvfile") |
408 | | - obj.csvfile_upload(csvfile) |
409 | | - elif strategy == "prefix": |
410 | | - prefix = data.get("prefix") |
411 | | - n = data.get("number_of_users") |
412 | | - obj.prefix_add(prefix, n) |
413 | | - else: |
414 | | - obj.save() |
| 407 | + if change: |
| 408 | + super().save_model(request, obj, form, change) |
| 409 | + return |
| 410 | + # Save the object initially to get a PK |
| 411 | + super().save_model(request, obj, form, change) |
| 412 | + num_users = form.cleaned_data.get("number_of_users", 0) |
| 413 | + obj.schedule_processing(number_of_users=num_users) |
415 | 414 |
|
416 | 415 | def delete_model(self, request, obj): |
417 | 416 | obj.users.all().delete() |
@@ -466,16 +465,46 @@ def get_readonly_fields(self, request, obj=None): |
466 | 465 | readonly_fields = super(RadiusBatchAdmin, self).get_readonly_fields( |
467 | 466 | request, obj |
468 | 467 | ) |
469 | | - if obj: |
| 468 | + if obj and obj.status != "pending": |
470 | 469 | return ( |
471 | 470 | "strategy", |
472 | 471 | "prefix", |
473 | 472 | "csvfile", |
474 | 473 | "number_of_users", |
475 | 474 | "users", |
476 | 475 | "expiration_date", |
| 476 | + "name", |
| 477 | + "organization", |
| 478 | + "status", |
477 | 479 | ) + readonly_fields |
478 | | - return readonly_fields |
| 480 | + elif obj: |
| 481 | + return ("status",) + readonly_fields |
| 482 | + return ("status",) + readonly_fields |
| 483 | + |
| 484 | + def has_delete_permission(self, request, obj=None): |
| 485 | + if obj and obj.status == "processing": |
| 486 | + return False |
| 487 | + return super().has_delete_permission(request, obj) |
| 488 | + |
| 489 | + def response_add(self, request, obj, post_url_continue=None): |
| 490 | + if obj.status != "pending": |
| 491 | + return super().response_add(request, obj, post_url_continue) |
| 492 | + opts = self.model._meta |
| 493 | + msg = _( |
| 494 | + 'The batch user creation "{obj}" was added successfully ' |
| 495 | + "and is now being processed in the background." |
| 496 | + ).format(obj=obj) |
| 497 | + if "_continue" in request.POST: |
| 498 | + self.message_user(request, msg, messages.SUCCESS) |
| 499 | + post_url_continue = reverse( |
| 500 | + f"admin:{opts.app_label}_{opts.model_name}_change", |
| 501 | + args=(obj.pk,), |
| 502 | + current_app=self.admin_site.name, |
| 503 | + ) |
| 504 | + return HttpResponseRedirect(post_url_continue) |
| 505 | + else: |
| 506 | + self.message_user(request, msg, messages.SUCCESS) |
| 507 | + return self.response_post_save_add(request, obj) |
479 | 508 |
|
480 | 509 |
|
481 | 510 | # Inlines for UserAdmin & OrganizationAdmin |
|
0 commit comments