ó
®â0_c           @  so  d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l	 m
 Z d d l m Z d d l m Z d d	 l m Z d d
 l m Z m Z d d l m Z d d l m Z m Z d e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e f d „  ƒ  YZ! d e f d „  ƒ  YZ" d S(   u   
XML serializer.
iÿÿÿÿ(   t   unicode_literals(   t   OrderedDict(   t   pulldom(   t   handler(   t   ExpatParser(   t   apps(   t   settings(   t   base(   t   DEFAULT_DB_ALIASt   models(   t
   force_text(   t   SimplerXMLGeneratort   UnserializableContentErrort
   Serializerc           B  s_   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   u'   
    Serializes a QuerySet to XML.
    c         C  sG   |  j  j d ƒ d  k	 rC |  j j d d |  j  j d ƒ | ƒ n  d  S(   Nu   indentu   
u    (   t   optionst   gett   Nonet   xmlt   ignorableWhitespace(   t   selft   level(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   indent   s    c         C  sR   t  |  j |  j j d t j ƒ ƒ |  _ |  j j ƒ  |  j j d i d d 6ƒ d S(   uT   
        Start serialization -- open the XML document and the root element.
        u   encodingu   django-objectsu   1.0u   versionN(	   R   t   streamR   R   R   t   DEFAULT_CHARSETR   t   startDocumentt   startElement(   R   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   start_serialization   s    'c         C  s.   |  j  d ƒ |  j j d ƒ |  j j ƒ  d S(   u8   
        End serialization -- end the document.
        i    u   django-objectsN(   R   R   t
   endElementt   endDocument(   R   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   end_serialization'   s    c         C  sµ   t  | d ƒ s+ t j d t | ƒ ƒ ‚ n  |  j d ƒ t d t | j ƒ f g ƒ } |  j sp t  | d ƒ rž | j	 ƒ  } | d k	 rž t | ƒ | d <qž n  |  j j d | ƒ d S(	   u3   
        Called as each object is handled.
        u   _metau6   Non-model object (%s) encountered during serializationi   u   modelu   natural_keyu   pku   objectN(   t   hasattrR   t   SerializationErrort   typeR   R   R
   t   _metat   use_natural_primary_keyst   _get_pk_valR   R   R   (   R   t   objt   attrst   obj_pk(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   start_object/   s    c         C  s!   |  j  d ƒ |  j j d ƒ d S(   uA   
        Called after handling all fields for an object.
        i   u   objectN(   R   R   R   (   R   R$   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt
   end_object?   s    c         C  sÙ   |  j  d ƒ |  j j d t d | j f d | j ƒ  f g ƒ ƒ t | | j ƒ d k	 rµ y |  j j | j	 | ƒ ƒ WqÅ t
 k
 r± t d | j j | j | j ƒ  f ƒ ‚ qÅ Xn |  j j d ƒ |  j j d ƒ d S(   up   
        Called to handle each field on an object (except for ForeignKeys and
        ManyToManyFields)
        i   u   fieldu   nameu   typeu0   %s.%s (pk:%s) contains unserializable charactersu   NoneN(   R   R   R   R   t   namet   get_internal_typet   getattrR   t
   characterst   value_to_stringR   t
   ValueErrort	   __class__t   __name__R#   t   addQuickElementR   (   R   R$   t   field(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   handle_fieldF   s    )c         C  sô   |  j  | ƒ t | | j ƒ  ƒ } | d k	 rÐ |  j r· t | j j d ƒ r· t | | j ƒ } | j	 ƒ  } x` | D]? } |  j
 j d i  ƒ |  j
 j t | ƒ ƒ |  j
 j d ƒ qq Wqà |  j
 j t | ƒ ƒ n |  j
 j d ƒ |  j
 j d ƒ d S(   uy   
        Called to handle a ForeignKey (we need to treat them slightly
        differently from regular fields).
        u   natural_keyu   naturalu   Noneu   fieldN(   t   _start_relational_fieldR+   t   get_attnameR   t   use_natural_foreign_keysR   t   remote_fieldt   modelR)   t   natural_keyR   R   R,   R
   R   R1   (   R   R$   R2   t   related_attt   relatedt	   key_value(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   handle_fk_field]   s    c           s¢   | j  j j j rž ˆ  j | ƒ ˆ  j rO t | j  j d ƒ rO ‡  f d †  } n ‡  f d †  } x* t | | j	 ƒ j
 ƒ  D] } | | ƒ qw Wˆ  j j d ƒ n  d S(   uÆ   
        Called to handle a ManyToManyField. Related objects are only
        serialized as references to the object's PK (i.e. the related *data*
        is not dumped, just the relation).
        u   natural_keyc           s}   |  j  ƒ  } ˆ  j j d i  ƒ xG | D]? } ˆ  j j d i  ƒ ˆ  j j t | ƒ ƒ ˆ  j j d ƒ q& Wˆ  j j d ƒ d  S(   Nu   objectu   natural(   R9   R   R   R,   R
   R   (   t   valuet   naturalR<   (   R   (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt
   handle_m2m~   s    c           s-   ˆ  j  j d d i t |  j ƒ  ƒ d 6ƒd  S(   Nu   objectR%   u   pk(   R   R1   R
   R#   (   R>   (   R   (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR@   ˆ   s    u   fieldN(   R7   t   throughR!   t   auto_createdR4   R6   R   R8   R+   R)   t   iteratorR   R   (   R   R$   R2   R@   t   relobj(    (   R   sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   handle_m2m_fieldt   s    
c         C  s`   |  j  d ƒ |  j j d t d | j f d | j j j f d t | j j	 j
 ƒ f g ƒ ƒ d S(   uL   
        Helper to output the <field> element for relational fields
        i   u   fieldu   nameu   relu   toN(   R   R   R   R   R)   R7   R/   R0   R
   R8   R!   (   R   R2   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR4   ‘   s
    (   R0   t
   __module__t   __doc__R   R   R   R'   R(   R3   R=   RE   R4   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR      s   								t   Deserializerc           B  sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   u   
    Deserialize XML.
    c         K  se   t  t |  ƒ j | |  t j |  j |  j ƒ  ƒ |  _ | j d t	 ƒ |  _
 | j d t ƒ |  _ d  S(   Nu   usingu   ignorenonexistent(   t   superRH   t   __init__R   t   parseR   t   _make_parsert   event_streamt   popR   t   dbt   Falset   ignore(   R   t   stream_or_stringR   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRJ   ¢   s    c         C  s   t  ƒ  S(   u;   Create a hardened XML parser (no custom/external entities).(   t   DefusedExpatParser(   R   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRL   ¨   s    c         C  s\   xO |  j  D]D \ } } | d k r
 | j d k r
 |  j  j | ƒ |  j | ƒ Sq
 Wt ‚ d  S(   Nu   START_ELEMENTu   object(   RM   t   nodeNamet
   expandNodet   _handle_objectt   StopIteration(   R   t   eventt   node(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   __next__¬   s
    c         C  s¾  |  j  | d ƒ } i  } | j d ƒ rU | j j j | j d ƒ ƒ | | j j j <n  i  } d „  | j j ƒ  Dƒ } x| j d ƒ D]} | j d ƒ } | s± t	 j
 d ƒ ‚ n  |  j rÌ | | k rÌ q„ n  | j j | ƒ } | j rt | j t j ƒ r|  j | | ƒ | | j <q„ | j rRt | j t j ƒ rR|  j | | ƒ | | j <q„ | j d ƒ rjd }	 n | j t | ƒ j ƒ  ƒ }	 |	 | | j <q„ Wt	 j | | |  j ƒ }
 t	 j |
 | ƒ S(	   uC   
        Convert an <object> node to a DeserializedObject.
        u   modelu   pkc         S  s   h  |  ] } | j  ’ q S(    (   R)   (   t   .0t   f(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pys	   <setcomp>Å   s   	 u   fieldu   nameu,   <field> node is missing the 'name' attributeu   NoneN(   t   _get_model_from_nodet   hasAttributeR!   t   pkt	   to_pythont   getAttributet   attnamet
   get_fieldst   getElementsByTagNameR   t   DeserializationErrorRQ   t	   get_fieldR7   t
   isinstanceR	   t   ManyToManyRelt   _handle_m2m_field_nodeR)   t   ManyToOneRelt   _handle_fk_field_nodeR   t   getInnerTextt   stript   build_instanceRO   t   DeserializedObject(   R   RY   t   Modelt   datat   m2m_datat   field_namest
   field_nodet
   field_nameR2   R>   R$   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRV   ³   s0    "	c   	      C  s.  | j  d ƒ r d S| j j } t | j d ƒ rù | j  d ƒ } | rÂ g  | D] } t | ƒ j ƒ  ^ qM } | j j |  j	 ƒ j
 | Œ  } t | | j j ƒ } | j j j j j rõ | j } qõ n3 t | ƒ j ƒ  } | j j | j j ƒ j | ƒ } | St | ƒ j ƒ  } | j j | j j ƒ j | ƒ Sd S(   u8   
        Handle a <field> node for a ForeignKey
        u   Noneu   get_by_natural_keyu   naturalN(   Rd   R   R7   R8   R   t   _default_managerRl   Rm   t
   db_managerRO   t   get_by_natural_keyR+   Ru   R!   R_   Rf   R`   (	   R   RY   R2   R8   t   keyst   kt   field_valueR$   R&   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRk   æ   s     %!c           sq   | j  j ‰ ˆ j ‰  t ˆ  d ƒ r< ‡  ‡ ‡ f d †  } n ‡ f d †  } g  | j d ƒ D] } | | ƒ ^ q[ S(   u>   
        Handle a <field> node for a ManyToManyField.
        u   get_by_natural_keyc           s}   |  j  d ƒ } | r[ g  | D] } t | ƒ j ƒ  ^ q } ˆ  j ˆ j ƒ j | Œ  j } n ˆ j j j |  j	 d ƒ ƒ } | S(   Nu   naturalu   pk(
   Rd   Rl   Rm   Rw   RO   Rx   R_   R!   R`   Ra   (   t   nRy   Rz   R{   R&   (   t   default_managerR8   R   (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   m2m_convert
  s    %!c           s   ˆ  j  j j |  j d ƒ ƒ S(   Nu   pk(   R!   R_   R`   Ra   (   R|   (   R8   (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR~     s    u   object(   R7   R8   Rv   R   Rd   (   R   RY   R2   R~   t   c(    (   R}   R8   R   sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRi     s    	c         C  s   | j  | ƒ } | s4 t j d | j | f ƒ ‚ n  y t j | ƒ SWn3 t t f k
 rz t j d | j | f ƒ ‚ n Xd S(   uo   
        Helper to look up a model from a <object model=...> or a <field
        rel=... to=...> node.
        u0   <%s> node is missing the required '%s' attributeu,   <%s> node has invalid model identifier: '%s'N(   Ra   R   Re   RT   R   t	   get_modelt   LookupErrort	   TypeError(   R   RY   t   attrt   model_identifier(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR]     s    (
   R0   RF   RG   RJ   RL   RZ   RV   Rk   Ri   R]   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRH      s   				3		c         C  s†   g  } xp |  j  D]e } | j | j k s: | j | j k rM | j | j ƒ q | j | j k r | j t | ƒ ƒ q q Wd j	 | ƒ S(   u=   
    Get all the inner text of a DOM node (recursively).
    u    (
   t
   childNodest   nodeTypet	   TEXT_NODEt   CDATA_SECTION_NODEt   appendRq   t   ELEMENT_NODEt   extendRl   t   join(   RY   t
   inner_textt   child(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRl   +  s    $RS   c           B  sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   uj   
    An expat parser hardened against XML bomb attacks.

    Forbids DTDs, external entity references
    c         O  s=   t  j |  | | Ž |  j t j t ƒ |  j t j t ƒ d  S(   N(   t   _ExpatParserRJ   t
   setFeatureR   t   feature_external_gesRP   t   feature_external_pes(   R   t   argst   kwargs(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRJ   D  s    c         C  s   t  | | | ƒ ‚ d  S(   N(   t   DTDForbidden(   R   R)   t   sysidt   pubidt   has_internal_subset(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   start_doctype_declI  s    c         C  s   t  | | | | | | ƒ ‚ d  S(   N(   t   EntitiesForbidden(   R   R)   t   is_parameter_entityR>   R   R–   R—   t   notation_name(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   entity_declL  s    c         C  s   t  | d  | | | | ƒ ‚ d  S(   N(   Rš   R   (   R   R)   R   R–   R—   Rœ   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   unparsed_entity_declP  s    c         C  s   t  | | | | ƒ ‚ d  S(   N(   t   ExternalReferenceForbidden(   R   t   contextR   R–   R—   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   external_entity_ref_handlerT  s    c         C  sJ   t  j |  ƒ |  j } |  j | _ |  j | _ |  j | _ |  j	 | _
 d  S(   N(   R   t   resett   _parserR™   t   StartDoctypeDeclHandlerR   t   EntityDeclHandlerRž   t   UnparsedEntityDeclHandlerR¡   t   ExternalEntityRefHandler(   R   t   parser(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR¢   W  s    	(	   R0   RF   RG   RJ   R™   R   Rž   R¡   R¢   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRS   >  s   					t   DefusedXmlExceptionc           B  s   e  Z d  Z d „  Z RS(   u   Base exception.c         C  s
   t  |  ƒ S(   N(   t   str(   R   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   __repr__b  s    (   R0   RF   RG   R«   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR©   `  s   R•   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u&   Document type definition is forbidden.c         C  s2   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ d  S(   N(   RI   R•   RJ   R)   R–   R—   (   R   R)   R–   R—   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRJ   h  s    		c         C  s"   d } | j  |  j |  j |  j ƒ S(   Nu7   DTDForbidden(name='{}', system_id={!r}, public_id={!r})(   t   formatR)   R–   R—   (   R   t   tpl(    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   __str__n  s    (   R0   RF   RG   RJ   R®   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR•   f  s   	Rš   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u   Entity definition is forbidden.c         C  sM   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(	   RI   Rš   RJ   R)   R>   R   R–   R—   Rœ   (   R   R)   R>   R   R–   R—   Rœ   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRJ   u  s    					c         C  s"   d } | j  |  j |  j |  j ƒ S(   Nu<   EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})(   R¬   R)   R–   R—   (   R   R­   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR®   ~  s    (   R0   RF   RG   RJ   R®   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRš   s  s   		RŸ   c           B  s    e  Z d  Z d „  Z d „  Z RS(   u-   Resolving an external reference is forbidden.c         C  s;   t  t |  ƒ j ƒ  | |  _ | |  _ | |  _ | |  _ d  S(   N(   RI   RŸ   RJ   R    R   R–   R—   (   R   R    R   R–   R—   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRJ   …  s
    			c         C  s   d } | j  |  j |  j ƒ S(   Nu8   ExternalReferenceForbidden(system_id='{}', public_id={})(   R¬   R–   R—   (   R   R­   (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyR®   Œ  s    (   R0   RF   RG   RJ   R®   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyRŸ   ƒ  s   	N(#   RG   t
   __future__R    t   collectionsR   t   xml.domR   t   xml.saxR   t   xml.sax.expatreaderR   R   t   django.appsR   t   django.confR   t   django.core.serializersR   t	   django.dbR   R	   t   django.utils.encodingR
   t   django.utils.xmlutilsR   R   R   RH   Rl   RS   R.   R©   R•   Rš   RŸ   (    (    (    sH   /tmp/pip-unpacked-wheel-BAJOf3/django/core/serializers/xml_serializer.pyt   <module>   s&   ‡Ž	"