From 87fc88021c64e4c190bebdf87add441d708e948c Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc" Date: Thu, 5 Dec 2019 21:22:08 -0600 Subject: [PATCH] Implement literal_column_headings setting --- src/pgwui_upload/templates/upload.mak | 30 ++++++- src/pgwui_upload/views/upload.py | 51 ++++++++++-- tests/views/test_upload.py | 112 +++++++++++++++++++++++++- 3 files changed, 184 insertions(+), 9 deletions(-) diff --git a/src/pgwui_upload/templates/upload.mak b/src/pgwui_upload/templates/upload.mak index 7530c52..96d1633 100644 --- a/src/pgwui_upload/templates/upload.mak +++ b/src/pgwui_upload/templates/upload.mak @@ -20,6 +20,11 @@ Template for generic upload page. Karl O. Pinc + + This template uses the following variables in it's context: + + ask_about_literal_cols + @@ -84,4 +89,27 @@ -${parent.upload_form([table_row, trim_row])} +<% form_elements = [table_row, trim_row] %> + +% if ask_about_literal_cols: + <%def name="literal_row(tab_index)"> + + + + + + + + + + + <% form_elements.append(literal_row) %> +% endif + +${parent.upload_form(form_elements)} diff --git a/src/pgwui_upload/views/upload.py b/src/pgwui_upload/views/upload.py index 90d024e..ae4722a 100644 --- a/src/pgwui_upload/views/upload.py +++ b/src/pgwui_upload/views/upload.py @@ -200,6 +200,18 @@ class TableUploadHandler(TabularFileUploadHandler): self.cur.execute(sql, (table, schema)) return self.cur.fetchone() is not None + def quote_columns(self): + '''Return boolean -- whether to take column names literally + ''' + settings = self.request.registry.settings + quoter_setting = settings.get('pgwui.literal_column_headings') + if quoter_setting == 'on': + return True + elif quoter_setting == 'ask': + return self.uf['literal_col_headings'] + else: + return False + def factory(self, ue): '''Make a db loader function from an UploadEngine. @@ -214,6 +226,13 @@ class TableUploadHandler(TabularFileUploadHandler): data = ue.data qualified_table = self.uf['table'] + quotecols = self.quote_columns() + if quotecols: + column_quoter = doublequote + else: + def column_quoter(x): + return x + schema, table = self.resolve_table(qualified_table) if not self.good_table(schema, table): @@ -227,8 +246,12 @@ class TableUploadHandler(TabularFileUploadHandler): column_sql = ('SELECT 1 FROM information_schema.columns' ' WHERE columns.table_name = %s' - ' AND columns.table_schema = %s' - ' AND columns.column_name = %s') + ' AND columns.table_schema = %s') + if quotecols: + column_sql += ' AND columns.column_name = %s' + else: + column_sql += ' AND columns.column_name = lower(%s::name)' + insert_stmt = 'INSERT INTO {0} ('.format(doublequote(qualified_table)) value_string = '' col_sep = '' @@ -240,15 +263,24 @@ class TableUploadHandler(TabularFileUploadHandler): bad_cols.append(col_name) else: # Add column to sql statement - insert_stmt += col_sep + doublequote(col_name) + insert_stmt += col_sep + column_quoter(col_name) value_string += col_sep + '%s' col_sep = ', ' if bad_cols: - detail = (('

The following columns are not in the ({0})' - ' table or you do not have permission to access' - ' them: