Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/0050.changes
Original file line number Diff line number Diff line change
@@ -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.
45 changes: 38 additions & 7 deletions search/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,44 @@
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={}, lang='en'):
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 colname in headers:
colname = colname.strip(" _,").lower()
if colname.lower() == 'id':
label_header.append('ID')
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(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(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(colname[:-4])
else:
label_header.append(colname.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:
Expand All @@ -38,12 +66,14 @@ 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")
static_filename = f'{settings.EXPORT_FILE_CACHE_URL}/{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}/{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):
Expand All @@ -55,7 +85,8 @@ 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):
# 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 ""
Expand Down
10 changes: 9 additions & 1 deletion search/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}')
Expand Down
Loading