Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recommended Headers check #483

Merged
merged 28 commits into from
Aug 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4cb67ae
WIP
anissa-agahchen Aug 26, 2021
048a9ab
Merge branch 'dev' of https://github.com/bcgov/biohubbc into out-of-r…
anissa-agahchen Aug 26, 2021
08b30f7
fixed
anissa-agahchen Aug 27, 2021
4910398
fix multiple row errors generated with lacking header
anissa-agahchen Aug 27, 2021
c96e324
tighten up messaging:
anissa-agahchen Aug 27, 2021
7fc4f02
Merge branch 'dev' of https://github.com/bcgov/biohubbc into out-of-r…
anissa-agahchen Aug 27, 2021
fb2ba7f
minor additions
anissa-agahchen Aug 27, 2021
72baa01
WIP
anissa-agahchen Aug 30, 2021
e378d4a
resolved merge conflicts
anissa-agahchen Aug 30, 2021
520ac77
code sowkring
anissa-agahchen Aug 30, 2021
cd17a5d
format
anissa-agahchen Aug 30, 2021
5ea11d5
search for regular expression
anissa-agahchen Aug 31, 2021
9aa0335
update query for get endpoint
anissa-agahchen Aug 31, 2021
92e4547
front-end grouping done for warnings vs errors
anissa-agahchen Aug 31, 2021
d962c5a
remove unused files
anissa-agahchen Aug 31, 2021
5f80322
minor adjustment
anissa-agahchen Aug 31, 2021
308f472
addressed feedback
anissa-agahchen Aug 31, 2021
fe99b71
clean up
anissa-agahchen Aug 31, 2021
4e062b3
feedback
anissa-agahchen Aug 31, 2021
f14abb9
Merge branch 'dev' of https://github.com/bcgov/biohubbc into formatti…
anissa-agahchen Aug 31, 2021
e965d6b
feedback
anissa-agahchen Aug 31, 2021
6b254fd
Merge branch 'dev' of https://github.com/bcgov/biohubbc into formatti…
anissa-agahchen Aug 31, 2021
1e00bb5
clean up
anissa-agahchen Aug 31, 2021
c7e143d
initial pass
anissa-agahchen Aug 31, 2021
734d0f3
Merge branch 'formatting-errors' of https://github.com/bcgov/biohubbc…
anissa-agahchen Aug 31, 2021
35d5382
WIP
anissa-agahchen Aug 31, 2021
2dd07d6
merge
anissa-agahchen Aug 31, 2021
6ec5c63
fixed
anissa-agahchen Aug 31, 2021
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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,4 @@ dist

# n8N - ignore root level temp config folder
.n8n
n8n/.config/
21 changes: 16 additions & 5 deletions api/src/utils/media/csv/dwc/dwc-archive-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { CSVValidator } from '../csv-file';
import {
getDuplicateHeadersValidator,
getValidHeadersValidator,
hasRequiredHeadersValidator
hasRequiredHeadersValidator,
hasRecommendedHeadersValidator
} from '../validation/csv-header-validator';
import {
getCodeValueFieldsValidator,
Expand Down Expand Up @@ -77,8 +78,7 @@ const getRequiredHeaders = (dwcClass: DWC_CLASS): string[] => {
'verbatimElevation',
'coordinateUncertaintyInMeters',
'coordinatePrecision',
'verbatimLocality',
'locationRemarks'
'verbatimLocality'
];
case DWC_CLASS.OCCURRENCE:
return [
Expand All @@ -89,8 +89,7 @@ const getRequiredHeaders = (dwcClass: DWC_CLASS): string[] => {
'associatedTaxa',
'sex',
'lifeStage',
'individualCount',
'identifiedBy'
'individualCount'
];
case DWC_CLASS.MEASUREMENTORFACT:
return ['measurementID', 'occurrenceID', 'measurementType', 'measurementUnit', 'measurementValue'];
Expand All @@ -103,6 +102,17 @@ const getRequiredHeaders = (dwcClass: DWC_CLASS): string[] => {
}
};

const getRecommendedHeaders = (dwcClass: DWC_CLASS): string[] => {
switch (dwcClass) {
case DWC_CLASS.EVENT:
return ['locationRemarks'];
case DWC_CLASS.OCCURRENCE:
return ['identifiedBy'];
default:
return [];
}
};

const getRequiredFieldsByHeader = (dwcClass: DWC_CLASS): string[] => {
switch (dwcClass) {
case DWC_CLASS.EVENT:
Expand Down Expand Up @@ -160,6 +170,7 @@ export const getDWCCSVValidators = (dwcClass: DWC_CLASS): CSVValidator[] => {
return [
getDuplicateHeadersValidator(),
hasRequiredHeadersValidator(getRequiredHeaders(dwcClass)),
hasRecommendedHeadersValidator(getRecommendedHeaders(dwcClass)),
getValidHeadersValidator(getValidHeaders(dwcClass)),
getRequiredFieldsValidator(getRequiredFieldsByHeader(dwcClass)),
getCodeValueFieldsValidator(getCodeValuesByHeader(dwcClass)),
Expand Down
44 changes: 44 additions & 0 deletions api/src/utils/media/csv/validation/csv-header-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,50 @@ export const hasRequiredHeadersValidator = (requiredHeaders?: string[]): CSVVali
};
};

/**
* For each `recommendedHeaders`, adds an error if the header is not present in the csv.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* For each `recommendedHeaders`, adds an error if the header is not present in the csv.
* For each of the `recommendedHeaders`, adds an error if the header is not present in the csv.

*
* @param {string[]} [recommendedHeaders]
* @return {*} {CSVValidator}
*/
export const hasRecommendedHeadersValidator = (recommendedHeaders?: string[]): CSVValidator => {
return (csvWorksheet) => {
if (!recommendedHeaders?.length) {
return csvWorksheet;
}

const headers = csvWorksheet.getHeaders();

if (!headers?.length) {
csvWorksheet.csvValidation.addHeaderErrors(
recommendedHeaders.map((recommendedHeader) => {
return {
errorCode: 'Missing Recommended Header',
message: 'Missing recommended header',
col: recommendedHeader
};
})
);

return csvWorksheet;
}

for (const recommendedHeader of recommendedHeaders) {
if (!headers.includes(recommendedHeader)) {
csvWorksheet.csvValidation.addHeaderErrors([
{
errorCode: 'Missing Recommended Header',
message: 'Missing recommended header',
col: recommendedHeader
}
]);
}
}

return csvWorksheet;
};
};

/**
* Adds an error for any header that is not found in the provided `validHeaders` array.
*
Expand Down
21 changes: 16 additions & 5 deletions api/src/utils/media/csv/xlsx/xlsx-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import { CSVValidator, XLSX_CLASS } from '../csv-file';
import {
getDuplicateHeadersValidator,
getValidHeadersValidator,
hasRequiredHeadersValidator
hasRequiredHeadersValidator,
hasRecommendedHeadersValidator
} from '../validation/csv-header-validator';
import {
getCodeValueFieldsValidator,
Expand Down Expand Up @@ -152,8 +153,7 @@ export const getRequiredHeaders = (xlsxClass: XLSX_CLASS): string[] => {
'Sample Station Label',
'UTM Zone Sample Station',
'Easting Sample Station',
'Northing Sample Station',
'Design Type Given'
'Northing Sample Station'
];
case XLSX_CLASS.GENERAL_SURVEY:
return [
Expand All @@ -176,14 +176,24 @@ export const getRequiredHeaders = (xlsxClass: XLSX_CLASS): string[] => {
'Site UTM Zone',
'Site Easting',
'Site Northing',
'Species',
'Date & Time'
'Species'
];
default:
return [];
}
};

export const getRecommendedHeaders = (xlsxClass: XLSX_CLASS): string[] => {
switch (xlsxClass) {
case XLSX_CLASS.SAMPLE_STATION_INFORMATION:
return ['Design Type Given'];
case XLSX_CLASS.SITE_INCIDENTAL_OBSERVATIONS:
return ['Date & Time'];
default:
return [];
}
};

export const getRequiredFieldsByHeader = (xlsxClass: XLSX_CLASS): string[] => {
switch (xlsxClass) {
case XLSX_CLASS.SAMPLE_STATION_INFORMATION:
Expand Down Expand Up @@ -253,6 +263,7 @@ export const getXLSXCSVValidators = (xlsxClass: XLSX_CLASS): CSVValidator[] => {
return [
getDuplicateHeadersValidator(),
hasRequiredHeadersValidator(getRequiredHeaders(xlsxClass)),
hasRecommendedHeadersValidator(getRecommendedHeaders(xlsxClass)),
getValidHeadersValidator(getValidHeaders(xlsxClass)),
getRequiredFieldsValidator(getRequiredFieldsByHeader(xlsxClass)),
getCodeValueFieldsValidator(getCodeValuesByHeader(xlsxClass)),
Expand Down
4 changes: 4 additions & 0 deletions app/src/features/surveys/view/SurveyObservations.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,10 @@ const SurveyObservations = () => {
type: ['Missing Required Field', 'Missing Required Header'],
label: 'Mandatory fields have not been filled out'
},
recommended: {
type: ['Missing Recommended Header'],
label: 'Recommended fields have not been filled out'
},
value_not_from_list: {
type: ['Invalid Value'],
label: "Values have not been selected from the field's dropdown list"
Expand Down