Add feature to upload missing column values as NULL
authorKarl O. Pinc <kop@karlpinc.com>
Thu, 10 Oct 2024 18:28:31 +0000 (13:28 -0500)
committerKarl O. Pinc <kop@karlpinc.com>
Thu, 10 Oct 2024 18:28:31 +0000 (13:28 -0500)
src/pgwui_upload_core/check_settings.py
src/pgwui_upload_core/templates/upload.mak
src/pgwui_upload_core/views/upload.py

index a5743e81e8dbf20f3469495c0f72c18b6647acba..2d4da7381b996e45de59fab98fc316b4deab4aa0 100644 (file)
@@ -38,12 +38,14 @@ UPLOAD_SETTINGS = CORE_UPLOAD_SETTINGS.copy()
 UPLOAD_SETTINGS.append('trim')
 UPLOAD_SETTINGS.append('null')
 UPLOAD_SETTINGS.append('literal_column_headings')
+UPLOAD_SETTINGS.append('add_missing_columns')
 
 REQUIRED_SETTINGS = CORE_REQUIRED_SETTINGS
 BOOLEAN_SETTINGS = CORE_BOOLEAN_SETTINGS
 
 BOOLEAN_CHOICE_SETTINGS = ['trim',
                            'null',
+                           'add_missing_columns',
                            'literal_column_headings']
 
 
index 70b7370450f8e3c6e9e7eda7e6e815658a7b8c77..69e1825ddd6c38151a05561b2eda6c82e7aecc86 100644 (file)
   % endif
 </%def>
 
+<%def name="add_missing_columns_row(tab_index)">
+  % if show_choice(pgwui, 'add_missing_columns'):
+    <tr>
+      <%self.lib:td_label for_id="add_missing_columns_id">
+        Add Missing Columns
+      </%self.lib:td_label>
+      <%self.lib:td_input tab_index="${tab_index}">
+        <input name="add_missing_columns"
+               tabindex="${tab_index.val}"
+               id="add_missing_columns_id"
+               type="checkbox"
+               ${add_missing_columns | n}
+               />
+      </%self.lib:td_input>
+    </tr>
+  % endif
+</%def>
+
 <%def name="submit(tab_index)">
   <input value="Upload" tabindex="${tab_index.val}" type="submit" />
   <% tab_index.inc() %>
     format_row(tab_index)
     nulls_row(tab_index)
     trim_row(tab_index)
+    add_missing_columns_row(tab_index)
     literal_row(tab_index)
     file_row(tab_index)
     %>
index 17a4522e78d1a811274ee0428ecdfb893e4d172b..111666306942763f7c843ce6204a704e3fcee260 100644 (file)
@@ -78,6 +78,8 @@ class UploadCoreInitialPost(pgwui_core.forms.UploadNullFileInitialPost):
         self.upload_fmt = self.find_upload_fmt(upload_settings)
         self.upload_null = self.boolean_choice(upload_settings, 'null')
         self.trim_upload = self.boolean_choice(upload_settings, 'trim')
+        self.add_missing_columns = self.boolean_choice(
+            upload_settings, 'add_missing_columns')
         self.literal_col_headings = self.boolean_choice(
             upload_settings, 'literal_column_headings')
         return self
@@ -370,7 +372,8 @@ def set_upload_response(component, request, response):
     response['pgwui']['upload_settings'] = upload_settings
 
 
-def match_insert_to_dataline(udl, insert_stmt, source_file=None):
+def match_insert_to_dataline(
+        udl, insert_stmt, add_missing_columns, source_file=None):
     '''Make sure the UploadDataLine has the number of values expected
     by the insert statement
     '''
@@ -390,6 +393,10 @@ def match_insert_to_dataline(udl, insert_stmt, source_file=None):
                 udl.lineno, 'Too many data columns', descr=descr,
                 detail=detail, data=udl.raw)
         else:
-            raise core_ex.TooFewColsError(
-                udl.lineno, 'Too few data columns', descr=descr,
-                detail=detail, data=udl.raw)
+            if add_missing_columns:
+                udl.tuples.extend([None for pos in
+                                   range(insert_stmt.cols - data_cols)])
+            else:
+                raise core_ex.TooFewColsError(
+                    udl.lineno, 'Too few data columns', descr=descr,
+                    detail=detail, data=udl.raw)