o
    h7                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZ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 eeZG d	d
 d
eZG dd dZG dd deZG dd deZdS )    N)OrderedDict)	JSONFieldFQSubqueryOuterRef)Cast)	RunPython)cached_property)StreamValue)utilsc                       sF   e Zd ZdZ		d fdd	Z fddZedd	 Zd
d Z  Z	S )MigrateStreamDataz?Subclass of RunPython for streamfield data migration operationsN   c                    sF   || _ || _|| _|| _|| _|| _t jd| jdd d| dS )as  MigrateStreamData constructor

        Args:
            app_name (str): Name of the app.
            model_name (str): Name of the model.
            field_name (str): Name of the streamfield.
            operations_and_block_paths (:obj:`list` of :obj:`tuple` of (:obj:`operation`, :obj:`str`)):
                List of operations and corresponding block paths to apply.
            revisions_from (:obj:`datetime`, optional): Only revisions created from this date
                onwards will be updated. Passing `None` updates all revisions. Defaults to `None`.
                Note that live and latest revisions will be updated regardless of what value this
                takes.
            chunk_size (:obj:`int`, optional): chunk size for queryset.iterator and bulk_update.
                Defaults to 1024.
            **kwargs: atomic, elidable, hints for superclass RunPython can be given

        Example:
            Renaming a block named `field1` to `block1`::
                MigrateStreamData(
                    app_name="blog",
                    model_name="BlogPage",
                    field_name="content",
                    operations_and_block_paths=[
                        (RenameStreamChildrenOperation(old_name="field1", new_name="block1"), ""),
                    ],
                    revisions_from=datetime.date(2022, 7, 25)
                ),
        c                  W   s   d S N )argsr   r   k/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/blocks/migrations/migrate_operation.py<lambda>C   s    z,MigrateStreamData.__init__.<locals>.<lambda>)codereverse_codeNr   )	app_name
model_name
field_nameoperations_and_block_pathsrevisions_from
chunk_sizesuper__init__migrate_stream_data_forward)selfr   r   r   r   r   r   kwargs	__class__r   r   r      s   '
zMigrateStreamData.__init__c                    sZ   t   \}}}| j|d< | j|d< | j|d< | j|d< | j|d< | j|d< | jj	||fS )Nr   r   r   r   r   r   )
r   deconstructr   r   r   r   r   r   r"   __qualname__)r   _r   r    r!   r   r   r#   G   s   





zMigrateStreamData.deconstructc                 C   s"   t dd | jD }d| S )Nc                 s   s    | ]
\}}|j d fV  qd S r   )operation_name_fragment).0opr%   r   r   r   	<genexpr>V   s
    
z<MigrateStreamData.migration_name_fragment.<locals>.<genexpr>r%   )r   r   joinkeys)r   	fragmentsr   r   r   migration_name_fragmentR   s   z)MigrateStreamData.migration_name_fragmentc                 C   s  | | j| j}z| dd t||| j}W n ty'   t||| j}Y nw |jjt	t
| jt d }g }|j| jdD ]e}|jd u rIqA|| |j}| jD ]'\}	}
ztj||
|	t|| jd}W qT tjy{ } ztj|d|d }~ww t|| jj}t|| jt||dd || t|| jkr|j|| jg g }qAt|d	kr|j|| jg |jsd S | }g }|j| jdD ]k}t |j!| j }| jD ]?\}	}
ztj||
|	t|| jd}W q tjy } z|"|s	t#$tj||d
 W Y d }~qtj||d
|d }~ww t%||j!| j< || t|| jkr3|| g }qt|d	krB|| d S d S )NwagtailcoreRevision)raw_content)r   )raw_datablock_path_str	operationstreamfield)instanceT)is_lazyr   )revisionr5   )&	get_modelr   r   DefaultRevisionQueryMakerr   LookupErrorWagtail3RevisionQueryMakerobjectsannotater   r   r   r   alliteratorr   r0   'append_instance_data_for_revision_queryr   r   apply_changes_to_raw_datagetattrInvalidBlockDefErrorstream_blocksetattrr   appendlenbulk_updatehas_revisionsget_revision_querysetjsonloadscontentget_is_live_or_latest_revisionlogger	exceptiondumps)r   appsschema_editormodelrevision_query_makermodel_querysetupdated_model_instances_bufferr5   r1   r3   r2   erD   revision_querysetupdated_revisions_bufferr7   r   r   r   r   \   s   








z-MigrateStreamData.migrate_stream_data_forward)Nr   )
__name__
__module__r$   __doc__r   r#   propertyr-   r   __classcell__r   r   r!   r   r      s    6
	r   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )AbstractRevisionQueryMakerzHHelper class for making the revision query needed for the data migrationc                 C   s<   || _ || _|| _|  | _|  | _| jrt | _d S d S r   )	rR   rT   r   get_revision_modelRevisionModelget_has_revisionsrI   setinstance_field_revision_idsr   rR   rT   r   r   r   r   r      s   

z#AbstractRevisionQueryMaker.__init__c                 C      t r   NotImplementedErrorr   r   r   r   ra         z-AbstractRevisionQueryMaker.get_revision_modelc                 C   rg   r   rh   rj   r   r   r   rc      rk   z,AbstractRevisionQueryMaker.get_has_revisionsc                 C   rg   r   rh   r   r5   r   r   r   r@      rk   zBAbstractRevisionQueryMaker.append_instance_data_for_revision_queryc                 C   rg   r   rh   rj   r   r   r   _make_revision_query   rk   z/AbstractRevisionQueryMaker._make_revision_queryc                 C   s   |   }| jj|S r   )rm   rb   r<   filterr   revision_queryr   r   r   rJ      s   z0AbstractRevisionQueryMaker.get_revision_querysetc                 C   s   | j j|dg d S )NrM   )rb   r<   rH   )r   datar   r   r   rH         z&AbstractRevisionQueryMaker.bulk_updatec                 C   rg   r   rh   r   r7   r   r   r   rN      rk   z9AbstractRevisionQueryMaker.get_is_live_or_latest_revisionN)r[   r\   r$   r]   r   ra   rc   r@   rm   rJ   rH   rN   r   r   r   r   r`      s    r`   c                       sT   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	e
dd Z  ZS )r;   z)Revision Query maker to support Wagtail 3c                    s   g | _ t ||| d S r   )page_idsr   r   rf   r!   r   r   r      s   z#Wagtail3RevisionQueryMaker.__init__c                 C      | j ddS )Nr.   PageRevisionrR   r8   rj   r   r   r   ra         z-Wagtail3RevisionQueryMaker.get_revision_modelc                 C   s   t | j| jddS )Nr.   Page)
issubclassrT   rR   r8   rj   r   r   r   rc      rr   z,Wagtail3RevisionQueryMaker.get_has_revisionsc                 C   s*   | j r| j|j | j|j d S d S r   )rI   rt   rF   idre   addlive_revision_idrl   r   r   r   r@      s   zBWagtail3RevisionQueryMaker.append_instance_data_for_revision_queryc                 C   sz   | j d ur7t| j | jd}|t| jdB }|tt| jjjtdd	ddj
ddd	d d
 | jdB }|S t| jdS )N)created_at__gtepage_id__inid__inpage_idr   -created_at-idr{   Tflat   r   r   )r   )r   r   rt   re   r   rb   r<   rn   r   order_byvalues_listro   r   r   r   rm      s&   
z/Wagtail3RevisionQueryMaker._make_revision_queryc                 C   s   |j | jv rdS |j | jv S )NT)r{   re   _latest_revision_idsrs   r   r   r   rN     s   z9Wagtail3RevisionQueryMaker.get_is_live_or_latest_revisionc                 C   sL   | j jjt| j jjtddddjdddd d | jd	jdddS )
Nr   r   r   r   r{   Tr   r   r   )rb   r<   rn   r   r   r   r   rt   rj   r   r   r   r     s   z/Wagtail3RevisionQueryMaker._latest_revision_ids)r[   r\   r$   r]   r   ra   rc   r@   rm   rN   r
   r   r_   r   r   r!   r   r;      s    r;   c                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )r9   z#Revision Query Maker for Wagtail 4+c                    s    d| _ d| _t ||| d S )NF)has_live_revisionshas_latest_revisionsr   r   rf   r!   r   r   r   )  s   z"DefaultRevisionQueryMaker.__init__c                 C   ru   )Nr.   r/   rw   rj   r   r   r   ra   /  rx   z,DefaultRevisionQueryMaker.get_revision_modelc                 C   sP   t | jdo| jjjjj| ju | _t | jdo | jjjjj| ju | _| jp'| jS )Nlatest_revisionlive_revision)	hasattrrT   r   fieldremote_fieldrb   r   r   r   rj   r   r   r   rc   2  s   z+DefaultRevisionQueryMaker.get_has_revisionsc                 C   s:   | j r| jr| j|j | jr| j|j d S d S d S r   )rI   r   re   r|   latest_revision_idr   r}   rl   r   r   r   r@   A  s   zADefaultRevisionQueryMaker.append_instance_data_for_revision_queryc                 C   sT   | j dd}|j| jj}| jd ur%t| j|d}|t| jdB }|S t|dS )NcontenttypesContentType)r~   content_type_idr   )r   )	rR   r8   r<   get_for_modelrT   r{   r   r   re   )r   r   contenttype_idrp   r   r   r   rm   K  s   

z.DefaultRevisionQueryMaker._make_revision_queryc                 C   s   |j | jv S r   )r{   re   rs   r   r   r   rN   _  s   z8DefaultRevisionQueryMaker.get_is_live_or_latest_revision)r[   r\   r$   r]   r   ra   rc   r@   rm   rN   r_   r   r   r!   r   r9   &  s    
r9   )rK   loggingcollectionsr   django.db.modelsr   r   r   r   r   django.db.models.functionsr   django.db.migrationsr	   django.utils.functionalr
   wagtail.blocksr   wagtail.blocks.migrationsr   	getLoggerr[   rO   r   r`   r;   r9   r   r   r   r   <module>   s    
 7%=