diff --git a/docs/operations/import_export.md b/docs/operations/import_export.md index 7c3ee1159..806776c55 100644 --- a/docs/operations/import_export.md +++ b/docs/operations/import_export.md @@ -1,18 +1,19 @@ # Export / Import Tables -A means is provided to export and import individual tables from +A means is provided to export and import tables from one environment to another. This allows for replication of production data in a development environment. Import and export -are provided through the django admin interface, through a modified -library, django-import-export. Each supported model has an Import -and an Export button on the list view. +are provided through a modified library, django-import-export. +Simple scripts are provided as detailed below. ### Export -When exporting models from the source environment, make sure that -no filters are selected. This will ensure that all rows of the model -are exported. Due to database dependencies, the following models -need to be exported: +To export from the source environment, run the following command from src directory: +manage.py export_tables + +This exports a file, exported_tables.zip, to the tmp directory + +For reference, the zip file will contain the following tables in csv form: * User * Contact @@ -25,6 +26,17 @@ need to be exported: * Host * HostIP +After exporting the file from the target environment, scp the exported_tables.zip +file from the target environment to local. + +Get passcode by running: +cf ssh-code + +scp file from app (app is getgov-stable in example below) to local cwd: +scp -P 2222 -o User=cf:$(cf curl /v3/apps/$(cf app getgov-stable --guid)/processes | jq -r '.resources[] | select(.type=="web") | .guid')/0 ssh.fr.cloud.gov:app/tmp/exported_tables.zip . +when prompted, supply the passcode retrieved in the 'cf ssh-code' command + + ### Import When importing into the target environment, if the target environment @@ -34,7 +46,11 @@ that there are no database conflicts on import. #### Preparing Target Environment -Delete all rows from tables in the following order through django admin: +In order to delete all rows from the appropriate tables, run the following +command: +manage.py clean_tables + +For reference, this deletes all rows from the following tables: * DomainInformation * DomainRequest @@ -48,10 +64,23 @@ Delete all rows from tables in the following order through django admin: #### Importing into Target Environment -Once target environment is prepared, files can be imported in the following -order: +Once target environment is prepared, files can be imported. -* User (After importing User table, you need to delete all rows from Contact table before importing Contacts) +To scp the exported_tables.zip file from local to the sandbox, run the following: + +Get passcode by running: +cf ssh-code + +scp file from app (app is getgov-stable in example below) to local cwd: +scp -P 2222 -o User=cf:$(cf curl /v3/apps/$(cf app getgov-stable --guid)/processes | jq -r '.resources[] | select(.type=="web") | .guid')/0 tmp/exported_tables.zip ssh.fr.cloud.gov:app/tmp/exported_tables.zip +when prompted, supply the passcode retrieved in the 'cf ssh-code' command + +Then connect to a shell in the target environment, and run the following import command: +manage.py import_tables + +For reference, this imports tables in the following order: + +* User * Contact * Domain * Host diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 2d6559570..5b49b6811 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2244,10 +2244,18 @@ class DraftDomainAdmin(ListHeaderAdmin, ImportExportModelAdmin): # If no redirection is needed, return the original response return response +class PublicContactResource(resources.ModelResource): + """defines how each field in the referenced model should be mapped to the corresponding fields in the + import/export file""" -class PublicContactAdmin(ListHeaderAdmin): + class Meta: + model = models.PublicContact + +class PublicContactAdmin(ListHeaderAdmin, ImportExportModelAdmin): """Custom PublicContact admin class.""" + resource_classes = [PublicContactResource] + change_form_template = "django/admin/email_clipboard_change_form.html" autocomplete_fields = ["domain"] diff --git a/src/registrar/management/commands/export_tables.py b/src/registrar/management/commands/export_tables.py index 742fb93a4..33786f1b8 100644 --- a/src/registrar/management/commands/export_tables.py +++ b/src/registrar/management/commands/export_tables.py @@ -15,7 +15,7 @@ class Command(BaseCommand): """Generates CSV files for specified tables and creates a zip archive""" table_names = [ "User", "Contact", "Domain", "DomainRequest", "DomainInformation", - "UserDomainRole", "DraftDomain", "Website", "HostIp", "Host" + "UserDomainRole", "DraftDomain", "Website", "HostIp", "Host", "PublicContact" ] # Ensure the tmp directory exists