U
    3d>                     @   s  d dl ZG dd deZz d dlmZ G dd deZW n$ ek
r\   G dd deZY nX G dd	 d	eZG d
d deZ	G dd de	Z
G dd de	ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd de	ZG dd deZG dd deZG d d! d!eeZG d"d# d#eZG d$d% d%eZG d&d' d'eZG d(d) d)eZG d*d+ d+eZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZG d2d3 d3eZG d4d5 d5eZG d6d7 d7eZ dS )8    Nc                   @   s,   e Zd ZdZd
ddZdddZdd	 ZdS )Questionz<Question>%(items)s</Question>FNc                 C   s   | j t  | `d S N__dict__updatevarsself)r   
identifiercontentanswer_specis_requireddisplay_name r   7/tmp/pip-unpacked-wheel-d7dsrkjd/boto/mturk/question.py__init__   s    zQuestion.__init__c                 C   s   ||   iS r   
get_as_xmlr   labelr   r   r   get_as_params!   s    zQuestion.get_as_paramsc                 C   sf   t d| jt dt| j | j| jg}| jd k	rF|dt d| j d	dd |D }| j
t  S )NZQuestionIdentifierZ
IsRequired   ZDisplayName c                 s   s   | ]}|  V  qd S r   r   .0itemr   r   r   	<genexpr>-   s     z&Question.get_as_xml.<locals>.<genexpr>)SimpleFieldr	   strr   lowerr
   r   r   insertjointemplater   r   itemsr   r   r   r   $   s    

zQuestion.get_as_xml)FN)r   )__name__
__module____qualname__r!   r   r   r   r   r   r   r   r      s      

r   )etreec                   @   s   e Zd Zdd ZdS )ValidatingXMLc                 C   sD   dd l }|| j}t|}t|}t|  }|| d S )Nr   )	urllib2urlopen
schema_urlr'   parseZ	XMLSchema
fromstringr   ZassertValid)r   r)   Zschema_src_fileZ
schema_docZschemadocr   r   r   validate5   s    

ValidatingXML.validateNr$   r%   r&   r/   r   r   r   r   r(   3   s   r(   c                   @   s   e Zd Zdd ZdS )r(   c                 C   s   d S r   r   r   r   r   r   r/   ?   s    r0   Nr1   r   r   r   r   r(   =   s   c                   @   s8   e Zd ZdZdZde  Zdd ZdddZdd	 Z	d
S )ExternalQuestionz:
    An object for constructing an External Question.
    z`http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsdz<ExternalQuestion xmlns="%(schema_url)s"><ExternalURL>%%(external_url)s</ExternalURL><FrameHeight>%%(frame_height)s</FrameHeight></ExternalQuestion>c                 C   s   t jj|| _|| _d S r   )xmlsaxsaxutilsescapeexternal_urlframe_height)r   r8   r9   r   r   r   r   J   s    zExternalQuestion.__init__c                 C   s   ||   iS r   r   r   r   r   r   r   N   s    zExternalQuestion.get_as_paramsc                 C   s   | j t|  S r   r!   r   r2   r   r   r   r   Q   s    zExternalQuestion.get_as_xmlN)r3   )
r$   r%   r&   __doc__r+   r   r!   r   r   r   r   r   r   r   r3   C   s   

r3   c                   @   s   e Zd Zdd ZdS )XMLTemplatec                 C   s   | j t|  S r   r:   r2   r   r   r   r   V   s    zXMLTemplate.get_as_xmlN)r$   r%   r&   r   r   r   r   r   r<   U   s   r<   c                   @   s   e Zd ZdZdZdd ZdS )r   z
    A Simple name/value pair that can be easily rendered as XML.

    >>> SimpleField('Text', 'A text string').get_as_xml()
    '<Text>A text string</Text>'
    z <%(field)s>%(value)s</%(field)s>c                 C   s   || _ || _d S r   )fieldvaluer   r=   r>   r   r   r   r   c   s    zSimpleField.__init__N)r$   r%   r&   r;   r!   r   r   r   r   r   r   Z   s   r   c                   @   s   e Zd ZdZdd ZdS )Binaryz<Binary><MimeType><Type>%(type)s</Type><SubType>%(subtype)s</SubType></MimeType><DataURL>%(url)s</DataURL><AltText>%(alt_text)s</AltText></Binary>c                 C   s   | j t  | `d S r   r   )r   typesubtypeurlZalt_textr   r   r   r   k   s    zBinary.__init__N)r$   r%   r&   r!   r   r   r   r   r   r@   h   s   r@   c                   @   s   e Zd ZdZdd ZdS )Listz?A bulleted list suitable for OrderedContent or Overview contentc                 C   s   d dd | D }d| S )Nr   c                 s   s   | ]}d | V  qdS )z<ListItem>%s</ListItem>Nr   r   r   r   r   r   s   s     z"List.get_as_xml.<locals>.<genexpr>z<List>%s</List>r    r"   r   r   r   r   r   s    zList.get_as_xmlN)r$   r%   r&   r;   r   r   r   r   r   rD   p   s   rD   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
Applicationz?<Application><%(class_)s>%(content)s</%(class_)s></Application>z-<Name>%(name)s</Name><Value>%(value)s</Value>c                 K   s   || _ || _|| _d S r   )widthheight
parameters)r   rG   rH   rI   r   r   r   r   {   s    zApplication.__init__c                 C   sL   | d| j | d| j | j D ] \}}| jt  }| d| q&d S )NZWidthZHeightZApplicationParameter)append_fieldrG   rH   rI   r#   parameter_templater   )r   r
   namer>   r   r   r   get_inner_content   s
    zApplication.get_inner_contentc                 C   s,   t  }| | | }| jj}| jt  S r   )OrderedContentrM   r   	__class__r$   r!   r   )r   r
   class_r   r   r   r      s
    
zApplication.get_as_xmlN)r$   r%   r&   r!   rK   r   rM   r   r   r   r   r   rF   w   s
   rF   c                   @   s4   e Zd ZdZde  Zdd Zd
ddZdd Zd	S )HTMLQuestionz\http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2011-11-11/HTMLQuestion.xsdz<HTMLQuestion xmlns="%(schema_url)s"><HTMLContent><![CDATA[<!DOCTYPE html>%%(html_form)s]]></HTMLContent><FrameHeight>%%(frame_height)s</FrameHeight></HTMLQuestion>c                 C   s   || _ || _d S r   )	html_formr9   )r   rR   r9   r   r   r   r      s    zHTMLQuestion.__init__c                 C   s   ||   iS r   r   r   r   r   r   r      s    zHTMLQuestion.get_as_paramsc                 C   s   | j t|  S r   r:   r2   r   r   r   r      s    zHTMLQuestion.get_as_xmlN)rQ   )	r$   r%   r&   r+   r   r!   r   r   r   r   r   r   r   rQ      s
   

rQ   c                       s(   e Zd Z fddZ fddZ  ZS )
JavaAppletc                    s"   || _ || _tt| j|| d S r   )pathfilenamesuperrS   r   )r   rT   rU   argskwargsrO   r   r   r      s    zJavaApplet.__init__c                    s6   t  }|d| j |d| j tt| | d S )NZ
AppletPathZAppletFilename)rN   rJ   rT   rU   rV   rS   rM   r   r
   rY   r   r   rM      s    zJavaApplet.get_inner_contentr$   r%   r&   r   rM   __classcell__r   r   rY   r   rS      s   rS   c                       s(   e Zd Z fddZ fddZ  ZS )Flashc                    s   || _ tt| j|| d S r   )rC   rV   r]   r   )r   rC   rW   rX   rY   r   r   r      s    zFlash.__init__c                    s(   t  }|d| j tt| | d S )NZFlashMovieURL)rN   rJ   rC   rV   r]   rM   rZ   rY   r   r   rM      s    zFlash.get_inner_contentr[   r   r   rY   r   r]      s   r]   c                   @   s   e Zd ZdZdZdd ZdS )FormattedContentzkhttp://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/FormattedContentXHTMLSubset.xsdz<<FormattedContent><![CDATA[%(content)s]]></FormattedContent>c                 C   s
   || _ d S r   )r
   rZ   r   r   r   r      s    zFormattedContent.__init__N)r$   r%   r&   r+   r!   r   r   r   r   r   r^      s   r^   c                   @   s   e Zd Zdd Zdd ZdS )rN   c                 C   s   |  t|| d S r   )appendr   r?   r   r   r   rJ      s    zOrderedContent.append_fieldc                 C   s   d dd | D S )Nr   c                 s   s   | ]}|  V  qd S r   r   r   r   r   r   r      s     z,OrderedContent.get_as_xml.<locals>.<genexpr>rE   r2   r   r   r   r      s    zOrderedContent.get_as_xmlN)r$   r%   r&   rJ   r   r   r   r   r   rN      s   rN   c                       s*   e Zd ZdZdddZ fddZ  ZS )Overviewz <Overview>%(content)s</Overview>c                 C   s   ||   iS r   r   r   r   r   r   r      s    zOverview.get_as_paramsc                    s   t t|  }| jt  S r   )rV   r`   r   r!   r   rZ   rY   r   r   r      s    zOverview.get_as_xml)r`   )r$   r%   r&   r!   r   r   r\   r   r   rY   r   r`      s   
r`   c                   @   s.   e Zd ZdZdZde  Zdd Zdd ZdS )	QuestionForma  
    From the AMT API docs:

    The top-most element of the QuestionForm data structure is a
    QuestionForm element. This element contains optional Overview
    elements and one or more Question elements. There can be any
    number of these two element types listed in any order. The
    following example structure has an Overview element and a
    Question element followed by a second Overview element and
    Question element--all within the same QuestionForm.

    ::

        <QuestionForm xmlns="[the QuestionForm schema URL]">
            <Overview>
                [...]
            </Overview>
            <Question>
                [...]
            </Question>
            <Overview>
                [...]
            </Overview>
            <Question>
                [...]
            </Question>
            [...]
        </QuestionForm>

    QuestionForm is implemented as a list, so to construct a
    QuestionForm, simply append Questions and Overviews (with at least
    one Question).
    z\http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionForm.xsdz><QuestionForm xmlns="%(schema_url)s">%%(items)s</QuestionForm>c                 C   s$   t dd | D o"tdd | D S )Nc                 s   s   | ]}t |tV  qd S r   )
isinstancer   r   r   r   r   r      s     z(QuestionForm.is_valid.<locals>.<genexpr>c                 s   s   | ]}t |ttfV  qd S r   )rb   r   r`   r   r   r   r   r      s     )anyallr2   r   r   r   is_valid   s    zQuestionForm.is_validc                 C   s0   |   stdddd | D }| jt  S )Nz&QuestionForm contains invalid elementsr   c                 s   s   | ]}|  V  qd S r   r   r   r   r   r   r      s     z*QuestionForm.get_as_xml.<locals>.<genexpr>)re   AssertionErrorr    xml_templater   r"   r   r   r   r      s    zQuestionForm.get_as_xmlN)	r$   r%   r&   r;   r+   r   rg   re   r   r   r   r   r   ra      s
   !
ra   c                       s    e Zd ZdZ fddZ  ZS )QuestionContentz.<QuestionContent>%(content)s</QuestionContent>c                    s   t t|  }| jt  S r   )rV   rh   r   r!   r   rZ   rY   r   r   r     s    zQuestionContent.get_as_xmlr$   r%   r&   r!   r   r\   r   r   rY   r   rh     s   rh   c                   @   s    e Zd ZdZdd Zdd ZdS )AnswerSpecificationz3<AnswerSpecification>%(spec)s</AnswerSpecification>c                 C   s
   || _ d S r   )specr   rk   r   r   r   r     s    zAnswerSpecification.__init__c                 C   s   | j  }| jt  S r   )rk   r   r!   r   rl   r   r   r   r     s    
zAnswerSpecification.get_as_xmlNr$   r%   r&   r!   r   r   r   r   r   r   rj     s   rj   c                       s    e Zd ZdZ fddZ  ZS )Constraintsz&<Constraints>%(content)s</Constraints>c                    s   t t|  }| jt  S r   )rV   rn   r   r!   r   rZ   rY   r   r   r     s    zConstraints.get_as_xmlri   r   r   rY   r   rn     s   rn   c                   @   s   e Zd Zdd Zdd ZdS )
Constraintc                 C   s&   t | j| j}ddd |D }|S )N c                 s   s&   | ]\}}|d k	rd||f V  qd S )Nz%s="%d"r   r   rL   r>   r   r   r   r   "  s   z,Constraint.get_attributes.<locals>.<genexpr>zipattribute_namesattribute_valuesr    r   pairsattrsr   r   r   get_attributes   s
    
zConstraint.get_attributesc                 C   s   |   }| jt  S r   )ry   r!   r   )r   rx   r   r   r   r   )  s    zConstraint.get_as_xmlN)r$   r%   r&   ry   r   r   r   r   r   ro     s   	ro   c                   @   s   e Zd ZdZdZdddZdS )NumericConstraint)ZminValueZmaxValuez<IsNumeric %(attrs)s />Nc                 C   s   ||f| _ d S r   ru   )r   Z	min_valueZ	max_valuer   r   r   r   2  s    zNumericConstraint.__init__)NNr$   r%   r&   rt   r!   r   r   r   r   r   rz   .  s   rz   c                   @   s   e Zd ZdZdZdddZdS )LengthConstraint)Z	minLengthZ	maxLengthz<Length %(attrs)s />Nc                 C   s   ||f| _ d S r   r{   )r   Z
min_length
max_lengthr   r   r   r   :  s    zLengthConstraint.__init__)NNr|   r   r   r   r   r}   6  s   r}   c                   @   s&   e Zd ZdZdZdddZdd ZdS )	RegExConstraint)regexZ	errorTextflagsz<AnswerFormatRegex %(attrs)s />Nc                 C   s   |||f| _ d S r   r{   )r   patternZ
error_textr   r   r   r   r   B  s    zRegExConstraint.__init__c                 C   s&   t | j| j}ddd |D }|S )Nrp   c                 s   s&   | ]\}}|d k	rd||f V  qd S )Nz%s="%s"r   rq   r   r   r   r   G  s   z1RegExConstraint.get_attributes.<locals>.<genexpr>rr   rv   r   r   r   ry   E  s
    
zRegExConstraint.get_attributes)NN)r$   r%   r&   rt   r!   r   ry   r   r   r   r   r   >  s   
r   c                   @   s"   e Zd ZdZdddZdd ZdS )	NumberOfLinesSuggestionz@<NumberOfLinesSuggestion>%(num_lines)s</NumberOfLinesSuggestion>r   c                 C   s
   || _ d S r   )	num_linesr   r   r   r   r   r   R  s    z NumberOfLinesSuggestion.__init__c                 C   s   | j }| jt  S r   )r   r!   r   r   r   r   r   r   U  s    z"NumberOfLinesSuggestion.get_as_xmlN)r   rm   r   r   r   r   r   O  s   
r   c                   @   s"   e Zd ZdZdddZdd ZdS )FreeTextAnswerz*<FreeTextAnswer>%(items)s</FreeTextAnswer>Nc                 C   s,   || _ |d krt | _n
t|| _|| _d S r   )defaultrn   constraintsr   )r   r   r   r   r   r   r   r   ]  s
    

zFreeTextAnswer.__init__c                 C   sV   | j g}| jr |td| j | jr6|t| j ddd |D }| jt  S )NZDefaultTextr   c                 s   s   | ]}|  V  qd S r   r   r   r   r   r   r   k  s     z,FreeTextAnswer.get_as_xml.<locals>.<genexpr>)	r   r   r_   r   r   r   r    r!   r   r"   r   r   r   r   e  s    zFreeTextAnswer.get_as_xml)NNNrm   r   r   r   r   r   Z  s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )FileUploadAnswerz<FileUploadAnswer><MaxFileSizeInBytes>%(max_bytes)d</MaxFileSizeInBytes><MinFileSizeInBytes>%(min_bytes)d</MinFileSizeInBytes></FileUploadAnswer>c                 C   s4   d|  kr|  krdks$n t || _|| _d S )Nr   i 5w)rf   	min_bytes	max_bytes)r   r   r   r   r   r   r   r  s    $zFileUploadAnswer.__init__c                 C   s   | j t|  S r   r:   r2   r   r   r   r   w  s    zFileUploadAnswer.get_as_xmlNrm   r   r   r   r   r   o  s   r   c                   @   sN   e Zd ZdZdZdZdZdZdZdZ	dd	d
dddgZ
dZdddZdd ZdS )SelectionAnswerzw
    A class to generate SelectionAnswer XML data structures.
    Does not yet implement Binary selection options.
    zB<SelectionAnswer>%s%s<Selections>%s</Selections></SelectionAnswer>zF<Selection><SelectionIdentifier>%s</SelectionIdentifier>%s</Selection>z<%s>%s</%s>z%<StyleSuggestion>%s</StyleSuggestion>z)<MinSelectionCount>%s</MinSelectionCount>z)<MaxSelectionCount>%s</MaxSelectionCount>radiobuttonZdropdownZcheckboxlistZcomboboxZmultichooserOtherSelectionr   NtextFc                 C   s   |d k	r4|t jkr|| _q:td|dt jf nd | _|d krLtdn|| _|| _|| _t|| jkszt	d| j || _
|| _d S )Nz.style '%s' not recognized; should be one of %sz, z_SelectionAnswer.__init__(): selections must be a non-empty list of (content, identifier) tuplesz*# of selections is less than minimum of %d)r   ACCEPTED_STYLESstyle_suggestion
ValueErrorr    
selectionsmin_selectionsmax_selectionslenrf   rA   other)r   minmaxstyler   rA   r   r   r   r   r     s    

zSelectionAnswer.__init__c           	      C   s  | j dkrd}n"| j dkr d}ntdt| j  d}| jD ]2}tj||d |f }tj|d |f }||7 }q<| jrt| jd	rt	| jt
std
|| j dd7 }n|d7 }| jd k	rtj| j }nd}| jdkrtj| j }|tj| j 7 }nd}tj|||f }|S )Nr   Textbinaryr@   z3illegal type: %s; must be either 'text' or 'binary'r   r   r   r   z+OtherSelection can only be a FreeTextAnswerr   r   z<OtherSelection />r   )rA   r   r   r   r   SELECTION_VALUE_XML_TEMPLATESELECTION_XML_TEMPLATEr   hasattrrb   r   rf   r   replacer   STYLE_XML_TEMPLATE MIN_SELECTION_COUNT_XML_TEMPLATEr    MAX_SELECTION_COUNT_XML_TEMPLATEr   SELECTIONANSWER_XML_TEMPLATE)	r   ZTYPE_TAGZselections_xmlZtplZ	value_xmlZselection_xmlZ	style_xmlZ	count_xmlretr   r   r   r     s0    





zSelectionAnswer.get_as_xml)r   r   NNr   F)r$   r%   r&   r;   r   r   r   r   r   r   r   ZOTHER_SELECTION_ELEMENT_NAMEr   r   r   r   r   r   r   {  s   
r   )!xml.sax.saxutilsr4   objectr   lxmlr'   r(   ImportErrorr3   r<   r   r@   r   rD   rF   rQ   rS   r]   r^   rN   r`   ra   rh   rj   rn   ro   rz   r}   r   r   r   r   r   r   r   r   r   <module>   s<   		2