diff --git a/src/Pipfile b/src/Pipfile index 9366423f1..0c0e84500 100644 --- a/src/Pipfile +++ b/src/Pipfile @@ -32,6 +32,7 @@ fred-epplib = {git = "https://github.com/cisagov/epplib.git", ref = "master"} pyzipper="*" tblib = "*" django-admin-multiple-choice-list-filter = "*" +django-import-export = "*" [dev-packages] django-debug-toolbar = "*" diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 31f031456..7fbf4dff4 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -28,12 +28,20 @@ from django.utils.safestring import mark_safe from django.utils.html import escape from django.contrib.auth.forms import UserChangeForm, UsernameField from django_admin_multiple_choice_list_filter.list_filters import MultipleChoiceListFilter +from import_export import resources +from import_export.admin import ImportExportModelAdmin from django.utils.translation import gettext_lazy as _ logger = logging.getLogger(__name__) +class UserResource(resources.ModelResource): + + class Meta: + model = models.User + + class MyUserAdminForm(UserChangeForm): """This form utilizes the custom widget for its class's ManyToMany UIs. @@ -468,9 +476,11 @@ class UserContactInline(admin.StackedInline): model = models.Contact -class MyUserAdmin(BaseUserAdmin): +class MyUserAdmin(BaseUserAdmin, ImportExportModelAdmin): """Custom user admin class to use our inlines.""" + resource_classes = [UserResource] + form = MyUserAdminForm class Meta: @@ -848,9 +858,17 @@ class WebsiteAdmin(ListHeaderAdmin): return response -class UserDomainRoleAdmin(ListHeaderAdmin): +class UserDomainRoleResource(resources.ModelResource): + + class Meta: + model = models.UserDomainRole + + +class UserDomainRoleAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Custom user domain role admin class.""" + resource_classes = [UserDomainRoleResource] + class Meta: """Contains meta information about this class""" @@ -931,9 +949,17 @@ class DomainInvitationAdmin(ListHeaderAdmin): change_form_template = "django/admin/email_clipboard_change_form.html" -class DomainInformationAdmin(ListHeaderAdmin): +class DomainInformationResource(resources.ModelResource): + + class Meta: + model = models.DomainInformation + + +class DomainInformationAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Customize domain information admin class.""" + resource_classes = [DomainInformationResource] + form = DomainInformationAdminForm # Columns @@ -1060,9 +1086,17 @@ class DomainInformationAdmin(ListHeaderAdmin): return readonly_fields # Read-only fields for analysts -class DomainRequestAdmin(ListHeaderAdmin): +class DomainRequestResource(resources.ModelResource): + + class Meta: + model = models.DomainRequest + + +class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Custom domain requests admin class.""" + resource_classes = [DomainRequestResource] + form = DomainRequestAdminForm change_form_template = "django/admin/domain_request_change_form.html" @@ -1590,9 +1624,17 @@ class DomainInformationInline(admin.StackedInline): return DomainInformationAdmin.get_readonly_fields(self, request, obj=None) -class DomainAdmin(ListHeaderAdmin): +class DomainResource(resources.ModelResource): + + class Meta: + model = models.Domain + + +class DomainAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Custom domain admin class to add extra buttons.""" + resource_classes = [DomainResource] + class ElectionOfficeFilter(admin.SimpleListFilter): """Define a custom filter for is_election_board""" diff --git a/src/registrar/config/settings.py b/src/registrar/config/settings.py index 54b65e83e..62e676839 100644 --- a/src/registrar/config/settings.py +++ b/src/registrar/config/settings.py @@ -148,6 +148,8 @@ INSTALLED_APPS = [ "corsheaders", # library for multiple choice filters in django admin "django_admin_multiple_choice_list_filter", + # library for export and import of data + 'import_export', ] # Middleware are routines for processing web requests.