-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresolvers.go
120 lines (110 loc) · 3.62 KB
/
resolvers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
s "strings"
log "github.com/sirupsen/logrus"
)
func resolveEmail(row *[]string) (string, error) {
// if no email, check for alternate
email := (*row)[rowFieldIndices.parentEmail]
if len(email) == 0 {
if len((*row)[rowFieldIndices.parentEmailAlt]) > 1 {
email = (*row)[rowFieldIndices.parentEmailAlt]
log.WithFields(log.Fields{
"altEmail": email,
"row": row,
}).Warn("no primary email found; using alt email")
}
}
if len(email) == 0 {
return "", &recordImportError{noEmail, "No email address found"}
}
return email, nil
}
func resolveParent(row *[]string) *parent {
pName := resolveParentName(row)
par := &parent{
name: pName,
address: address{
(*row)[rowFieldIndices.streetAddress],
(*row)[rowFieldIndices.city],
(*row)[rowFieldIndices.zip],
},
primaryPhone: (*row)[rowFieldIndices.primaryPhone],
parentType: (*row)[rowFieldIndices.parentType],
}
email, err := resolveEmail(row)
if err != nil {
if rie, ok := err.(*recordImportError); ok {
par.meta = make([]*recordImportError, 0)
par.meta = append(par.meta, rie)
}
} else {
par.email = email
}
return par
}
func resolveParentName(row *[]string) name {
// parentName:
// This implementation is based on value containing one string of "Firstname Lastname"
// this splits on the space, takes first part as parentFName and all the rest as parentLName
// * in case the value has no space, parentFName gets it all, parentLName is marked, and student.last is used
// * in case the value multiple spaces, only the first word goes into parentFName, rest to parentLName
parentName := (*row)[rowFieldIndices.parentName]
student := resolveStudentName(row)
var parentFName string
var parentLName string
if len(parentName) > 0 {
nameSplitIdx := s.Index(parentName, " ")
// if we got a split, break it into fname,lname
if nameSplitIdx > 0 {
parentFName = parentName[0:nameSplitIdx]
parentLName = parentName[nameSplitIdx+1:]
} else {
// no split, use the single value of
parentFName = parentName
parentLName = "[parent unspecified] student: " + student.last
log.WithFields(log.Fields{
"first name": parentFName,
"last name": parentLName,
"row": row,
}).Warn("could not identify multi-part parent name, using student's last name instead")
}
} else {
// parentName field empty. use student's name as a fallback
parentFName = "[parent unspecified] student: " + student.first
parentLName = "[parent unspecified] student: " + student.last
log.WithFields(log.Fields{
"first name": parentFName,
"last name": parentLName,
"row": row,
}).Warn("No parent name provided, using student's instead")
}
return name{parentFName, parentLName}
}
func resolveStudentName(row *[]string) name {
// stuName
// This implementation is based on value containing one string "Lastname, Firstname"
// this splits on ",", breaking out the single field into stuFName and stuLName fields
stuName := s.Split((*row)[rowFieldIndices.studentName], ",")
stuFName := s.TrimSpace(stuName[1])
stuLName := s.TrimSpace(stuName[0])
return name{stuFName, stuLName}
}
// resolves student AND puts student in studentMap which is used in all
// downstream operations
func resolveStudent(row *[]string) *student {
stuName := resolveStudentName(row)
studentCandidate := &student{
name: stuName,
teacher: (*row)[rowFieldIndices.teacher],
room: (*row)[rowFieldIndices.room],
grade: (*row)[rowFieldIndices.grade],
}
studentCandidate.parents = make([]*parent, 0, 2)
key := studentCandidate.key()
_, ok := studentMap[key]
if !ok {
studentMap[key] = studentCandidate
}
return studentMap[key]
}