From 0187a996f4db86e0432ab7d770bbac2d6763feeb Mon Sep 17 00:00:00 2001 From: thriuin Date: Thu, 29 May 2025 15:06:56 -0400 Subject: [PATCH 1/3] Open-4055: Use readable labels for the column headres in the exported file header. --- changes/open-4055.changes | 1 + search/tasks.py | 37 +++++++++++++++++++++++++++++++------ search/views.py | 10 +++++++++- 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 changes/open-4055.changes diff --git a/changes/open-4055.changes b/changes/open-4055.changes new file mode 100644 index 0000000..4dbf4ed --- /dev/null +++ b/changes/open-4055.changes @@ -0,0 +1 @@ +For Search Results exports, use the readable label for the field instead of the database code field name for the exported file header. \ No newline at end of file diff --git a/search/tasks.py b/search/tasks.py index c581954..39f73b1 100644 --- a/search/tasks.py +++ b/search/tasks.py @@ -13,16 +13,39 @@ import time -def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0): +def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0, field_list={}): if len(sr.docs) == 0: return False if not os.path.exists(cached_filename): # Write out the header with the UTF8 byte-order marker for Excel first with open(cached_filename, 'w', newline='', encoding='utf8') as csv_file: cache_writer = csv.writer(csv_file, dialect='excel', quoting=csv.QUOTE_NONE) + #### the values from the dict docs[0] can be used to find the column headers + ## in the field_list dict. + label_header = [] headers = list(sr.docs[0]) - headers[0] = u'\N{BOM}' + headers[0] - cache_writer.writerow(headers) + for col in headers: + if col.lower() == 'id': + label_header.append('ID') + elif col in field_list: + if field_list[col]: + label_header.append(field_list[col]) + else: + label_header.append(col.capitalize()) + elif col[-3:] in ('_fr', '_en'): + if col[:-3] in field_list: + label_header.append(field_list[col[:-3]]) + else: + label_header.append(col[:-3]) + elif col[-4:] in ('_fra', '_eng'): + if col[:-4] in field_list: + label_header.append(field_list[col[:-3]]) + else: + label_header.append(col[:-4]) + else: + label_header.append(col.replace('_', ' ').capitalize()) + label_header[0] = u'\N{BOM}' + label_header[0] + cache_writer.writerow(label_header) # Use a CSV writer with forced quoting for the body of the file with open(cached_filename, 'a', newline='', encoding='utf8') as csv_file: @@ -38,11 +61,13 @@ def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0): pass return True +## OPEN-4055: Accept a list of Fields for the exported search results @shared_task() -def export_search_results_csv(request_url, query, lang, core): +def export_search_results_csv(request_url, query, lang, core, fieldlist: dict): cache_dir = settings.EXPORT_FILE_CACHE_DIR hashed_query = hashlib.sha1(request_url.encode('utf8')).hexdigest() - cached_filename = os.path.join(cache_dir, f"{core}_{hashed_query}_{lang}.csv") + fileroot = core.replace("search_", "rechercher_") if lang == "fr" else core + cached_filename = os.path.join(cache_dir, f"{fileroot}_{hashed_query}_{lang}.csv") static_filename = f'{settings.EXPORT_FILE_CACHE_URL}/{core}_{hashed_query}_{lang}.csv' # Check the cache. If the results already exist,then just return the filename, no need to query Solr @@ -55,7 +80,7 @@ def export_search_results_csv(request_url, query, lang, core): solr = SolrClient(settings.SOLR_SERVER_URL) solr_response = solr.query(core, query, request_handler='export') - if cache_search_results_file(cached_filename=cached_filename, sr=solr_response): + if cache_search_results_file(cached_filename=cached_filename, sr=solr_response, field_list=fieldlist): return f"{static_filename}" else: return "" diff --git a/search/views.py b/search/views.py index 59195a5..55b0d8f 100644 --- a/search/views.py +++ b/search/views.py @@ -792,7 +792,15 @@ def post(self, request, *args, **kwargs): facets) request_url = request.POST.get('export_search_path') - task = export_search_results_csv.delay(request_url, solr_query, lang, core_name) + ## OPEN 4055 - Pass in the list if Field codes so that the readable title can be user in the exported + ## csv file. We can't pass in DB objects, so build a simple dict + field_names = {} + for field in self.fields[search_type]: + if lang == 'fr': + field_names[field] = self.fields[search_type][field].label_fr + else: + field_names[field] = self.fields[search_type][field].label_en + task = export_search_results_csv.delay(request_url, solr_query, lang, core_name, field_names) if settings.SEARCH_LANG_USE_PATH: if lang == 'fr': return redirect(f'/rechercher/fr/{search_type}/telecharger/{task}') From aed4ed02b2612983a6aa54aff7020409465f101b Mon Sep 17 00:00:00 2001 From: thriuin Date: Wed, 2 Jul 2025 09:25:34 -0400 Subject: [PATCH 2/3] Upddating search export labels --- search/tasks.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/search/tasks.py b/search/tasks.py index 39f73b1..e80b83b 100644 --- a/search/tasks.py +++ b/search/tasks.py @@ -13,7 +13,7 @@ import time -def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0, field_list={}): +def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0, field_list={}, lang='en'): if len(sr.docs) == 0: return False if not os.path.exists(cached_filename): @@ -24,26 +24,31 @@ def cache_search_results_file(cached_filename: str, sr: SolrResponse, rows=0, fi ## in the field_list dict. label_header = [] headers = list(sr.docs[0]) - for col in headers: - if col.lower() == 'id': + for colname in headers: + colname = colname.strip(" _,").lower() + if colname.lower() == 'id': label_header.append('ID') - elif col in field_list: - if field_list[col]: - label_header.append(field_list[col]) + elif colname == "year" and lang == "fr": + label_header.append('Année') + elif colname in field_list: + if field_list[colname]: + label_header.append(field_list[colname]) else: - label_header.append(col.capitalize()) - elif col[-3:] in ('_fr', '_en'): - if col[:-3] in field_list: - label_header.append(field_list[col[:-3]]) + label_header.append(colname.capitalize()) + elif colname[-3:] in ('_fr', '_en'): + if colname[:-3] in field_list: + label_header.append(field_list[colname[:-3]]) else: - label_header.append(col[:-3]) - elif col[-4:] in ('_fra', '_eng'): - if col[:-4] in field_list: - label_header.append(field_list[col[:-3]]) + label_header.append(colname[:-3]) + elif colname[-4:] in ('_fra', '_eng'): + if colname[:-4] in field_list: + label_header.append(field_list[colname[:-3]]) + elif colname[:-1] in field_list: + label_header.append(field_list[colname[:-1]]) else: - label_header.append(col[:-4]) + label_header.append(colname[:-4]) else: - label_header.append(col.replace('_', ' ').capitalize()) + label_header.append(colname.replace('_', ' ').capitalize()) label_header[0] = u'\N{BOM}' + label_header[0] cache_writer.writerow(label_header) @@ -68,7 +73,7 @@ def export_search_results_csv(request_url, query, lang, core, fieldlist: dict): hashed_query = hashlib.sha1(request_url.encode('utf8')).hexdigest() fileroot = core.replace("search_", "rechercher_") if lang == "fr" else core cached_filename = os.path.join(cache_dir, f"{fileroot}_{hashed_query}_{lang}.csv") - static_filename = f'{settings.EXPORT_FILE_CACHE_URL}/{core}_{hashed_query}_{lang}.csv' + static_filename = f'{settings.EXPORT_FILE_CACHE_URL}/{fileroot}_{hashed_query}_{lang}.csv' # Check the cache. If the results already exist,then just return the filename, no need to query Solr if os.path.exists(cached_filename): @@ -80,7 +85,8 @@ def export_search_results_csv(request_url, query, lang, core, fieldlist: dict): solr = SolrClient(settings.SOLR_SERVER_URL) solr_response = solr.query(core, query, request_handler='export') - if cache_search_results_file(cached_filename=cached_filename, sr=solr_response, field_list=fieldlist): + # Either create and cache the the search results or return the cached file + if cache_search_results_file(cached_filename=cached_filename, sr=solr_response, field_list=fieldlist, lang=lang): return f"{static_filename}" else: return "" From ee4c6c9d6d4c371b628d39ddd8007b753ec1c74f Mon Sep 17 00:00:00 2001 From: thriuin Date: Wed, 2 Jul 2025 14:09:34 -0400 Subject: [PATCH 3/3] OPEN 4055: PR 50 --- changes/{open-4055.changes => 0050.changes} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changes/{open-4055.changes => 0050.changes} (100%) diff --git a/changes/open-4055.changes b/changes/0050.changes similarity index 100% rename from changes/open-4055.changes rename to changes/0050.changes