@@ -27,18 +27,23 @@ def post(self, request):
27
27
else :
28
28
csv_obj = UploadedCSV .objects .get (pk = request .POST ["csv_id" ])
29
29
# We always get a CSV file - parse it.
30
- reader = csv .reader ([x + "\n " for x in str ( csv_obj .csv ).split ("\n " )])
30
+ reader = csv .reader ([x + "\n " for x in csv_obj .csv . decode ( "utf8" ).split ("\n " )])
31
31
rows = list (reader )
32
32
headers = rows [0 ]
33
33
column_choices = [("" , "---" )] + list (enumerate (headers ))
34
34
# Make form with question mapping fields
35
35
fields = collections .OrderedDict (
36
- (name , forms .ChoiceField (choices = column_choices , required = required , label = label ))
36
+ (
37
+ name ,
38
+ forms .ChoiceField (
39
+ choices = column_choices , required = required , label = label
40
+ ),
41
+ )
37
42
for name , required , label in self .get_targets ()
38
43
)
39
44
form_input = {"csv_id" : csv_obj .pk }
40
45
form_input .update (request .POST .items ())
41
- form = type ("BulkLoadMapForm" , (BulkLoadMapBaseForm , ), fields )(form_input )
46
+ form = type ("BulkLoadMapForm" , (BulkLoadMapBaseForm ,), fields )(form_input )
42
47
# Did they submit mappings for all questions? If not, show form
43
48
if form .is_valid ():
44
49
# Save and import!
@@ -57,15 +62,19 @@ def post(self, request):
57
62
except Exception as e :
58
63
errors .append ((i , row , e ))
59
64
csv_obj .delete ()
60
- return self .render_to_response ({
61
- "successful" : successful ,
62
- "errors" : errors ,
63
- })
65
+ return self .render_to_response (
66
+ {
67
+ "successful" : successful ,
68
+ "errors" : errors ,
69
+ }
70
+ )
64
71
else :
65
72
# Show mapping form
66
- return self .render_to_response ({
67
- "form" : form ,
68
- })
73
+ return self .render_to_response (
74
+ {
75
+ "form" : form ,
76
+ }
77
+ )
69
78
70
79
71
80
class BulkLoadApplicants (BulkLoader , TemplateView ):
@@ -88,23 +97,27 @@ def get_targets(self):
88
97
("timestamp" , False , "Timestamp" ),
89
98
]
90
99
for question in self .program .questions .all ():
91
- targets .append ((
92
- "q%s" % question .id ,
93
- True ,
94
- question .question ,
95
- ))
100
+ targets .append (
101
+ (
102
+ "q%s" % question .id ,
103
+ True ,
104
+ question .question ,
105
+ )
106
+ )
96
107
return targets
97
108
98
109
def process_row (self , row , target_map ):
99
110
if self .program .duplicate_emails :
100
111
applicant = None
101
112
else :
102
- applicant = Applicant .objects .filter (program = self .program , email = row [target_map ["email" ]]).first ()
113
+ applicant = Applicant .objects .filter (
114
+ program = self .program , email = row [target_map ["email" ]]
115
+ ).first ()
103
116
if not applicant :
104
117
applicant = Applicant (
105
- program = self .program ,
106
- name = row [target_map ["name" ]],
107
- email = row [target_map ["email" ]],
118
+ program = self .program ,
119
+ name = row [target_map ["name" ]],
120
+ email = row [target_map ["email" ]],
108
121
)
109
122
else :
110
123
applicant .name = row [target_map ["name" ]]
@@ -116,7 +129,9 @@ def process_row(self, row, target_map):
116
129
if target_map .get ("timestamp" , None ):
117
130
for time_format in self .time_formats :
118
131
try :
119
- applicant .applied = datetime .datetime .strptime (row [target_map ["timestamp" ]], time_format )
132
+ applicant .applied = datetime .datetime .strptime (
133
+ row [target_map ["timestamp" ]], time_format
134
+ )
120
135
except ValueError :
121
136
pass
122
137
applicant .save ()
@@ -126,22 +141,32 @@ def process_row(self, row, target_map):
126
141
raw_answer = row [target_map [key ]]
127
142
question = self .program .questions .get (pk = key .lstrip ("q" ))
128
143
if question .type == "boolean" :
129
- answer = str (not any ((raw_answer .lower ().strip () == no_word ) for no_word in ("no" , "false" , "off" , "" , "0" )))
144
+ answer = str (
145
+ not any (
146
+ (raw_answer .lower ().strip () == no_word )
147
+ for no_word in ("no" , "false" , "off" , "" , "0" )
148
+ )
149
+ )
130
150
elif question .type == "integer" :
131
151
if not raw_answer .strip ():
132
152
answer = None
133
153
else :
134
154
try :
135
155
answer = str (int (raw_answer .strip ()))
136
156
except ValueError :
137
- raise ValueError ("Invalid integer value for question %s: %s" % (question .question , raw_answer ))
157
+ raise ValueError (
158
+ "Invalid integer value for question %s: %s"
159
+ % (question .question , raw_answer )
160
+ )
138
161
else :
139
162
answer = raw_answer
140
- answer_obj = Answer .objects .filter (applicant = applicant , question = question ).first ()
163
+ answer_obj = Answer .objects .filter (
164
+ applicant = applicant , question = question
165
+ ).first ()
141
166
if not answer_obj :
142
167
answer_obj = Answer (
143
- applicant = applicant ,
144
- question = question ,
168
+ applicant = applicant ,
169
+ question = question ,
145
170
)
146
171
answer_obj .answer = answer or ""
147
172
answer_obj .save ()
@@ -154,7 +179,6 @@ class BulkLoadScores(BulkLoader, TemplateView):
154
179
155
180
template_name = "program-bulk-scores.html"
156
181
157
-
158
182
def get_targets (self ):
159
183
return [
160
184
("email" , True , "Email" ),
@@ -165,7 +189,9 @@ def get_targets(self):
165
189
def process_row (self , row , target_map ):
166
190
applicant = Applicant .objects .get (email = row [target_map ["email" ]])
167
191
168
- score = Score .objects .get_or_create (applicant = applicant , user = self .request .user )[0 ]
192
+ score = Score .objects .get_or_create (
193
+ applicant = applicant , user = self .request .user
194
+ )[0 ]
169
195
score_value = row [target_map ["score" ]]
170
196
try :
171
197
score .score = float (score_value )
0 commit comments