OLD | NEW |
1 # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ | 1 # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ |
2 # | 2 # |
3 # Permission is hereby granted, free of charge, to any person obtaining a | 3 # Permission is hereby granted, free of charge, to any person obtaining a |
4 # copy of this software and associated documentation files (the | 4 # copy of this software and associated documentation files (the |
5 # "Software"), to deal in the Software without restriction, including | 5 # "Software"), to deal in the Software without restriction, including |
6 # without limitation the rights to use, copy, modify, merge, publish, dis- | 6 # without limitation the rights to use, copy, modify, merge, publish, dis- |
7 # tribute, sublicense, and/or sell copies of the Software, and to permit | 7 # tribute, sublicense, and/or sell copies of the Software, and to permit |
8 # persons to whom the Software is furnished to do so, subject to the fol- | 8 # persons to whom the Software is furnished to do so, subject to the fol- |
9 # lowing conditions: | 9 # lowing conditions: |
10 # | 10 # |
11 # The above copyright notice and this permission notice shall be included | 11 # The above copyright notice and this permission notice shall be included |
12 # in all copies or substantial portions of the Software. | 12 # in all copies or substantial portions of the Software. |
13 # | 13 # |
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | 15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | 16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | 17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
20 # IN THE SOFTWARE. | 20 # IN THE SOFTWARE. |
21 | 21 |
22 class Question(object): | 22 class Question(object): |
23 template = "<Question>%(items)s</Question>" | 23 template = "<Question>%(items)s</Question>" |
24 | 24 |
25 def __init__(self, identifier, content, answer_spec, is_required=False, disp
lay_name=None): | 25 def __init__(self, identifier, content, answer_spec, |
| 26 is_required=False, display_name=None): |
26 # copy all of the parameters into object attributes | 27 # copy all of the parameters into object attributes |
27 self.__dict__.update(vars()) | 28 self.__dict__.update(vars()) |
28 del self.self | 29 del self.self |
29 | 30 |
30 def get_as_params(self, label='Question'): | 31 def get_as_params(self, label='Question'): |
31 return { label : self.get_as_xml() } | 32 return { label : self.get_as_xml() } |
32 | 33 |
33 def get_as_xml(self): | 34 def get_as_xml(self): |
34 items = [ | 35 items = [ |
35 SimpleField('QuestionIdentifier', self.identifier), | 36 SimpleField('QuestionIdentifier', self.identifier), |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 return { label : self.get_as_xml() } | 170 return { label : self.get_as_xml() } |
170 | 171 |
171 def get_as_xml(self): | 172 def get_as_xml(self): |
172 content = super(Overview, self).get_as_xml() | 173 content = super(Overview, self).get_as_xml() |
173 return self.template % vars() | 174 return self.template % vars() |
174 | 175 |
175 class QuestionForm(ValidatingXML, list): | 176 class QuestionForm(ValidatingXML, list): |
176 """ | 177 """ |
177 From the AMT API docs: | 178 From the AMT API docs: |
178 | 179 |
179 The top-most element of the QuestionForm data structure is a QuestionForm el
ement. This | 180 The top-most element of the QuestionForm data structure is a |
180 element contains optional Overview elements and one or more Question element
s. There can be | 181 QuestionForm element. This element contains optional Overview |
181 any number of these two element types listed in any order. The following exa
mple structure has an | 182 elements and one or more Question elements. There can be any |
182 Overview element and a Question element followed by a second Overview elemen
t and Question | 183 number of these two element types listed in any order. The |
183 element--all within the same QuestionForm. | 184 following example structure has an Overview element and a |
| 185 Question element followed by a second Overview element and |
| 186 Question element--all within the same QuestionForm. |
184 | 187 |
185 <QuestionForm xmlns="[the QuestionForm schema URL]"> | 188 :: |
186 <Overview> | 189 |
| 190 <QuestionForm xmlns="[the QuestionForm schema URL]"> |
| 191 <Overview> |
| 192 [...] |
| 193 </Overview> |
| 194 <Question> |
| 195 [...] |
| 196 </Question> |
| 197 <Overview> |
| 198 [...] |
| 199 </Overview> |
| 200 <Question> |
| 201 [...] |
| 202 </Question> |
187 [...] | 203 [...] |
188 </Overview> | 204 </QuestionForm> |
189 <Question> | |
190 [...] | |
191 </Question> | |
192 <Overview> | |
193 [...] | |
194 </Overview> | |
195 <Question> | |
196 [...] | |
197 </Question> | |
198 [...] | |
199 </QuestionForm> | |
200 | 205 |
201 QuestionForm is implemented as a list, so to construct a | 206 QuestionForm is implemented as a list, so to construct a |
202 QuestionForm, simply append Questions and Overviews (with at least | 207 QuestionForm, simply append Questions and Overviews (with at least |
203 one Question). | 208 one Question). |
204 """ | 209 """ |
205 schema_url = "http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchem
as/2005-10-01/QuestionForm.xsd" | 210 schema_url = "http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchem
as/2005-10-01/QuestionForm.xsd" |
206 xml_template = """<QuestionForm xmlns="%(schema_url)s">%%(items)s</QuestionF
orm>""" % vars() | 211 xml_template = """<QuestionForm xmlns="%(schema_url)s">%%(items)s</QuestionF
orm>""" % vars() |
207 | 212 |
208 def is_valid(self): | 213 def is_valid(self): |
209 return ( | 214 return ( |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 289 |
285 def get_as_xml(self): | 290 def get_as_xml(self): |
286 num_lines = self.num_lines | 291 num_lines = self.num_lines |
287 return self.template % vars() | 292 return self.template % vars() |
288 | 293 |
289 class FreeTextAnswer(object): | 294 class FreeTextAnswer(object): |
290 template = '<FreeTextAnswer>%(items)s</FreeTextAnswer>' | 295 template = '<FreeTextAnswer>%(items)s</FreeTextAnswer>' |
291 | 296 |
292 def __init__(self, default=None, constraints=None, num_lines=None): | 297 def __init__(self, default=None, constraints=None, num_lines=None): |
293 self.default = default | 298 self.default = default |
294 if constraints is None: constraints = Constraints() | 299 if constraints is None: |
295 self.constraints = Constraints(constraints) | 300 self.constraints = Constraints() |
| 301 else: |
| 302 self.constraints = Constraints(constraints) |
296 self.num_lines = num_lines | 303 self.num_lines = num_lines |
297 | 304 |
298 def get_as_xml(self): | 305 def get_as_xml(self): |
299 constraints = Constraints() | 306 items = [self.constraints] |
300 items = [constraints] | |
301 if self.default: | 307 if self.default: |
302 items.append(SimpleField('DefaultText', self.default)) | 308 items.append(SimpleField('DefaultText', self.default)) |
303 if self.num_lines: | 309 if self.num_lines: |
304 items.append(NumberOfLinesSuggestion(self.num_lines)) | 310 items.append(NumberOfLinesSuggestion(self.num_lines)) |
305 items = ''.join(item.get_as_xml() for item in items) | 311 items = ''.join(item.get_as_xml() for item in items) |
306 return self.template % vars() | 312 return self.template % vars() |
307 | 313 |
308 class FileUploadAnswer(object): | 314 class FileUploadAnswer(object): |
309 template = """<FileUploadAnswer><MinFileSizeInBytes>%(min_bytes)d</MinFileSi
zeInBytes><MaxFileSizeInBytes>%(max_bytes)d</MaxFileSizeInBytes></FileUploadAnsw
er>""" | 315 template = """<FileUploadAnswer><MinFileSizeInBytes>%(min_bytes)d</MinFileSi
zeInBytes><MaxFileSizeInBytes>%(max_bytes)d</MaxFileSizeInBytes></FileUploadAnsw
er>""" |
310 | 316 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 count_xml = SelectionAnswer.MIN_SELECTION_COUNT_XML_TEMPLATE %self.m
in_selections | 393 count_xml = SelectionAnswer.MIN_SELECTION_COUNT_XML_TEMPLATE %self.m
in_selections |
388 count_xml += SelectionAnswer.MAX_SELECTION_COUNT_XML_TEMPLATE %self.
max_selections | 394 count_xml += SelectionAnswer.MAX_SELECTION_COUNT_XML_TEMPLATE %self.
max_selections |
389 else: | 395 else: |
390 count_xml = "" | 396 count_xml = "" |
391 | 397 |
392 ret = SelectionAnswer.SELECTIONANSWER_XML_TEMPLATE % (count_xml, style_x
ml, selections_xml) | 398 ret = SelectionAnswer.SELECTIONANSWER_XML_TEMPLATE % (count_xml, style_x
ml, selections_xml) |
393 | 399 |
394 # return XML | 400 # return XML |
395 return ret | 401 return ret |
396 | 402 |
OLD | NEW |