o 3a-@sdZddlmZddlmZddlmZeZGddde Z Gddde Z Gd d d e Z Gd d d e ZGd ddZGdddZGdddZGdddZddZddZddZdS)z; Module for abstract serializer/unserializer base classes. )StringIO)ObjectDoesNotExist)modelsc@eZdZdZdS)SerializerDoesNotExistz'The requested serializer was not found.N__name__ __module__ __qualname____doc__r r >/usr/lib/python3/dist-packages/django/core/serializers/base.pyr rc@r)SerializationErrorz,Something bad happened during serialization.Nrr r r r rrrc@seZdZdZeddZdS)DeserializationErrorz.Something bad happened during deserialization.cCs|d||||fS)zs Factory method for creating a deserialization error which has a more explanatory message. z#%s: (%s:pk=%s) field_value was '%s'r )cls original_excmodelfk field_valuer r r WithDataszDeserializationError.WithDataN)rr r r classmethodrr r r r rsrc@seZdZdZddZdS)M2MDeserializationErrorzCSomething bad happened during deserialization of a ManyToManyField.cCs||_||_dSN)rpk)selfrrr r r __init__$s z M2MDeserializationError.__init__N)rr r r rr r r r r"s rc@s eZdZdZddZddZdS) ProgressBarKcCs||_||_d|_dS)Nr)output total_count prev_done)rrr r r r r, zProgressBar.__init__cCs|jsdS|d|j}||jd}|j|krdS||_|jdkr$dnd}|j|dd|d|j|d||jkrF|jd |jdS) Nd [. ] )rr progress_widthr!writeflush)rcountpercdonecrr r r update1s *  zProgressBar.updateN)rr r r,rr3r r r r r)s rc@steZdZdZdZeZeZdddddddddZ dd Z d d Z d d Z ddZ ddZddZddZddZdS) Serializerz) Abstract serializer base class. FNr)streamfieldsuse_natural_foreign_keysuse_natural_primary_keysprogress_output object_countcKst||_|dur |n||_||_||_||_|||} |d|_t |ddD]\} } | | | j j } |jrJ| j j } | jrG| jjrG| nd}nd}| j jD]5}|jsY||ur|jdurp|jdusi|j|jvro|| |qP|jdus|jdd|jvr|| |qP| j jD]}|jr|jdus|j|jvr|| |q|| | | |jod|_q*||S)z' Serialize a queryset. NTr$)startF)options stream_classr5selected_fieldsr7r8progress_classstart_serializationfirst enumerate start_object_metaconcrete_modelr remote_field parent_link local_fields serializeattname handle_fieldhandle_fk_fieldlocal_many_to_manyhandle_m2m_field end_objectr3end_serializationgetvalue)rquerysetr5r6r7r8r9r:r= progress_barr/objrFr pk_parentfieldr r r rJKsD          zSerializer.serializecCtd)zA Called when serializing of the queryset starts. zDsubclasses of Serializer must provide a start_serialization() methodNotImplementedErrorrr r r rAyzSerializer.start_serializationcCdS)z? Called when serializing of the queryset ends. Nr r[r r r rQzSerializer.end_serializationcCrX)z> Called when serializing of an object starts. z=subclasses of Serializer must provide a start_object() methodrYrrUr r r rDr\zSerializer.start_objectcCr])z< Called when serializing of an object ends. Nr r_r r r rPr^zSerializer.end_objectcCrX)zW Called to handle each individual (non-relational) field on an object. z=subclasses of Serializer must provide a handle_field() methodrYrrUrWr r r rLr\zSerializer.handle_fieldcCrX)z6 Called to handle a ForeignKey field. z@subclasses of Serializer must provide a handle_fk_field() methodrYr`r r r rMr\zSerializer.handle_fk_fieldcCrX)z5 Called to handle a ManyToManyField. zAsubclasses of Serializer must provide a handle_m2m_field() methodrYr`r r r rOr\zSerializer.handle_m2m_fieldcCs tt|jddr|jSdS)zn Return the fully serialized queryset (or None if the output stream is not seekable). rRN)callablegetattrr5rRr[r r r rRs zSerializer.getvalue)rr r r internal_use_onlyrr@rr>rJrArQrDrPrLrMrOrRr r r r r4@s  . r4c@s(eZdZdZddZddZddZdS) Deserializerz+ Abstract base deserializer class. cKs(||_t|trt||_dS||_dS)zA Init this serializer given a stream or a string N)r= isinstancestrrr5)rstream_or_stringr=r r r rs  zDeserializer.__init__cCs|Srr r[r r r __iter__szDeserializer.__iter__cCrX)z9Iteration interface -- return the next item in the streamz;subclasses of Deserializer must provide a __next__() methodrYr[r r r __next__szDeserializer.__next__N)rr r r rrhrir r r r rds  rdc@s6eZdZdZd ddZddZd dd Zdd d ZdS)DeserializedObjectae A deserialized model. Basically a container for holding the pre-saved deserialized data along with the many-to-many data saved with the object. Call ``save()`` to save the object (with the many-to-many data) to the database; call ``save(save_m2m=False)`` to save just the object fields (and not touch the many-to-many stuff.) NcCs||_||_||_dSr)objectm2m_datadeferred_fields)rrUrlrmr r r rr"zDeserializedObject.__init__cCsd|jj|jjj|jjfS)Nz<%s: %s(pk=%s)>) __class__rrkrElabelrr[r r r __repr__s zDeserializedObject.__repr__TcKsVtjj|jf|dd||jr&|r&|jD] \}}t|j||qd|_dS)NT)usingraw)rModel save_baserkrlitemsrbset)rsave_m2mrqkwargs accessor_name object_listr r r saves   zDeserializedObject.savec Csi|_|jD]q\}}|jj}|jd|j}t|jt j rIz t |||dd}Wnt yA}z t |j||jj|jd}~ww||j|j<qt|jt jryz t|||dd}Wntyp}z t |||jj|d}~wwt|j|j|q|dS)Nr(F)handle_forward_references)rlrmrurkrE app_label model_namererGr ManyToManyReldeserialize_m2m_valuesrrrrrname ManyToOneReldeserialize_fk_value ExceptionsetattrrKr{) rrqrWroptsrovaluesevaluer r r save_deferred_fieldss, z'DeserializedObject.save_deferred_fields)NN)TNr)rr r r rrpr{rr r r r rjs    rjcCs|jj}||jjj}|durCt|drCt|drC|di|}z|jj||j |j||jjj<Wn |j yBYnw|di|S)z Build a model instance. If the model instance doesn't have a primary key and the model supports natural keys, try to retrieve it from the database. Nget_by_natural_key natural_keyr ) rEdefault_managergetrrKhasattrr to_python db_managerr DoesNotExist)rsdatadbrrrr r r build_instancesrc s|jjtjdrfdd}nfdd}zt|}Wnty/}zt||d}~wwzg}|D] }|||q5|WStya}zt |t rX|rXt WYd}~St||d}~ww)Nrcs6t|drt|tsjj|jSjj|S)Nrh) rrerf_default_managerrrrrEr)rrrqr r m2m_convertsz+deserialize_m2m_values..m2m_convertcsjj|Sr)rErr)v)rr r rs) rGrrriter TypeErrorrappendrrer DEFER_FIELD) rWrrqr|rpks_iterrrrr rr rs*     rc Cs|durdS|jj}|j}|jj}t|drHt|drHt|tsHz ||j|}Wnt y8|r7t YSwt ||}|j j jrF|j }|S|j ||S)Nrrh)rGrr field_namerrerfrrrrrbrEr get_fieldr) rWrrqr|rrrrUrr r r r-s,    rN)r iordjango.core.exceptionsr django.dbrrkrKeyErrorrrrrrrr4rdrjrrrr r r r s     l9