U
    5øi‡-  ã                   @   sf  d dl mZmZmZ d dlmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlm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ƒZG dd„ de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d(S ))é    )Úget_citext_oidsÚget_hstore_oidsÚregister_type_handlers)ÚNotSupportedErrorÚrouter)ÚAddConstraintÚAddIndexÚRemoveIndex)Ú	Operation)ÚCheckConstraintc                   @   sL   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZdS )ÚCreateExtensionTc                 C   s
   || _ d S ©N©Úname)Úselfr   © r   úF/tmp/pip-unpacked-wheel-gcyiijx6/django/contrib/postgres/operations.pyÚ__init__   s    zCreateExtension.__init__c                 C   s   d S r   r   ©r   Ú	app_labelÚstater   r   r   Ústate_forwards   s    zCreateExtension.state_forwardsc                 C   sb   |j jdkst |j j|¡s d S |  || j¡sD| d| | j¡ ¡ t	 
¡  t 
¡  t|j ƒ d S )NÚ
postgresqlz!CREATE EXTENSION IF NOT EXISTS %s)Ú
connectionÚvendorr   Úallow_migrateÚaliasÚextension_existsr   ÚexecuteÚ
quote_namer   Úcache_clearr   r   ©r   r   Úschema_editorÚ
from_stateÚto_stater   r   r   Údatabase_forwards   s    
ÿþÿz!CreateExtension.database_forwardsc                 C   sL   t  |jj|¡sd S |  || j¡r8| d| | j¡ ¡ t 	¡  t
 	¡  d S )NzDROP EXTENSION IF EXISTS %s)r   r   r   r   r   r   r   r   r   r    r   r!   r   r   r   Údatabase_backwards%   s    ÿz"CreateExtension.database_backwardsc              
   C   s<   |j  ¡ �(}| d|g¡ t| ¡ ƒW  5 Q R £ S Q R X d S )Nz-SELECT 1 FROM pg_extension WHERE extname = %s)r   Úcursorr   ÚboolZfetchone)r   r"   Ú	extensionr'   r   r   r   r   0   s    þz CreateExtension.extension_existsc                 C   s
   d| j  S )NzCreates extension %sr   ©r   r   r   r   Údescribe8   s    zCreateExtension.describec                 C   s
   d| j  S )Nzcreate_extension_%sr   r*   r   r   r   Úmigration_name_fragment;   s    z'CreateExtension.migration_name_fragmentN)Ú__name__Ú
__module__Ú__qualname__Z
reversibler   r   r%   r&   r   r+   Úpropertyr,   r   r   r   r   r   
   s   r   c                   @   s   e Zd Zdd„ ZdS )ÚBloomExtensionc                 C   s
   d| _ d S )NZbloomr   r*   r   r   r   r   B   s    zBloomExtension.__init__N©r-   r.   r/   r   r   r   r   r   r1   @   s   r1   c                   @   s   e Zd Zdd„ ZdS )ÚBtreeGinExtensionc                 C   s
   d| _ d S )NZ	btree_ginr   r*   r   r   r   r   H   s    zBtreeGinExtension.__init__Nr2   r   r   r   r   r3   F   s   r3   c                   @   s   e Zd Zdd„ ZdS )ÚBtreeGistExtensionc                 C   s
   d| _ d S )NZ
btree_gistr   r*   r   r   r   r   N   s    zBtreeGistExtension.__init__Nr2   r   r   r   r   r4   L   s   r4   c                   @   s   e Zd Zdd„ ZdS )ÚCITextExtensionc                 C   s
   d| _ d S )NZcitextr   r*   r   r   r   r   T   s    zCITextExtension.__init__Nr2   r   r   r   r   r5   R   s   r5   c                   @   s   e Zd Zdd„ ZdS )ÚCryptoExtensionc                 C   s
   d| _ d S )NZpgcryptor   r*   r   r   r   r   Z   s    zCryptoExtension.__init__Nr2   r   r   r   r   r6   X   s   r6   c                   @   s   e Zd Zdd„ ZdS )ÚHStoreExtensionc                 C   s
   d| _ d S )NZhstorer   r*   r   r   r   r   `   s    zHStoreExtension.__init__Nr2   r   r   r   r   r7   ^   s   r7   c                   @   s   e Zd Zdd„ ZdS )ÚTrigramExtensionc                 C   s
   d| _ d S )NZpg_trgmr   r*   r   r   r   r   f   s    zTrigramExtension.__init__Nr2   r   r   r   r   r8   d   s   r8   c                   @   s   e Zd Zdd„ ZdS )ÚUnaccentExtensionc                 C   s
   d| _ d S )NZunaccentr   r*   r   r   r   r   l   s    zUnaccentExtension.__init__Nr2   r   r   r   r   r9   j   s   r9   c                   @   s   e Zd Zdd„ ZdS )ÚNotInTransactionMixinc                 C   s   |j jrtd| jj ƒ‚d S )Nz_The %s operation cannot be executed inside a transaction (set atomic = False on the migration).)r   Zin_atomic_blockr   Ú	__class__r-   ©r   r"   r   r   r   Ú_ensure_not_in_transactionq   s    þÿz0NotInTransactionMixin._ensure_not_in_transactionN)r-   r.   r/   r=   r   r   r   r   r:   p   s   r:   c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚAddIndexConcurrentlyzDCreate an index using PostgreSQL's CREATE INDEX CONCURRENTLY syntax.Fc                 C   s   d| j jd | j j¡| jf S )Nz7Concurrently create index %s on field(s) %s of model %sú, )Úindexr   ÚjoinÚfieldsÚ
model_namer*   r   r   r   r+   ~   s
    ýzAddIndexConcurrently.describec                 C   s@   |   |¡ |j || j¡}|  |jj|¡r<|j|| jdd� d S ©NT)Zconcurrently)	r=   ÚappsÚ	get_modelrC   Úallow_migrate_modelr   r   Ú	add_indexr@   ©r   r   r"   r#   r$   Úmodelr   r   r   r%   …   s    
z&AddIndexConcurrently.database_forwardsc                 C   s@   |   |¡ |j || j¡}|  |jj|¡r<|j|| jdd� d S rD   )	r=   rE   rF   rC   rG   r   r   Úremove_indexr@   rI   r   r   r   r&   ‹   s    
z'AddIndexConcurrently.database_backwardsN©r-   r.   r/   Ú__doc__Zatomicr+   r%   r&   r   r   r   r   r>   z   s
   r>   c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚRemoveIndexConcurrentlyzBRemove an index using PostgreSQL's DROP INDEX CONCURRENTLY syntax.Fc                 C   s   d| j | jf S )Nz$Concurrently remove index %s from %s©r   rC   r*   r   r   r   r+   –   s    z RemoveIndexConcurrently.describec                 C   sZ   |   |¡ |j || j¡}|  |jj|¡rV|j|| jf }| 	| j
¡}|j||dd� d S rD   )r=   rE   rF   rC   rG   r   r   ÚmodelsÚmodel_name_lowerÚget_index_by_namer   rK   )r   r   r"   r#   r$   rJ   Zfrom_model_stater@   r   r   r   r%   ™   s    
z)RemoveIndexConcurrently.database_forwardsc                 C   sZ   |   |¡ |j || j¡}|  |jj|¡rV|j|| jf }| 	| j
¡}|j||dd� d S rD   )r=   rE   rF   rC   rG   r   r   rP   rQ   rR   r   rH   )r   r   r"   r#   r$   rJ   Zto_model_stater@   r   r   r   r&   ¡   s    
z*RemoveIndexConcurrently.database_backwardsNrL   r   r   r   r   rN   ’   s
   rN   c                   @   s<   e Zd Zdddœdd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚCollationOperationÚlibcT)ÚproviderÚdeterministicc                C   s   || _ || _|| _|| _d S r   )r   ÚlocalerU   rV   )r   r   rW   rU   rV   r   r   r   r   «   s    zCollationOperation.__init__c                 C   s   d S r   r   r   r   r   r   r   ±   s    z!CollationOperation.state_forwardsc                 C   sJ   | j | jdœ}| jr(| jdkr(| j|d< | jdkr<| j|d< | jjg |fS )N)r   rW   rT   rU   FrV   )r   rW   rU   rV   r;   r/   )r   Úkwargsr   r   r   Údeconstruct´   s    


ýzCollationOperation.deconstructc              	   C   sŒ   | j dkr|jjjstdƒ‚d| | j¡i}| jdkrF| | j¡|d< | j dkrXd|d< | d| | j	¡d	 
d
d„ | ¡ D ƒ¡dœ ¡ d S )NFz4Non-deterministic collations require PostgreSQL 12+.rW   rT   rU   ÚfalserV   z$CREATE COLLATION %(name)s (%(args)s)r?   c                 s   s    | ]\}}|› d |› �V  qdS )ú=Nr   )Ú.0ÚoptionÚvaluer   r   r   Ú	<genexpr>Ï   s     z6CollationOperation.create_collation.<locals>.<genexpr>)r   Úargs)rV   r   ÚfeaturesZ%supports_non_deterministic_collationsr   r   rW   rU   r   r   rA   Úitems)r   r"   r`   r   r   r   Úcreate_collationÀ   s     ÿþÿ


þz#CollationOperation.create_collationc                 C   s   |  d| | j¡ ¡ d S )NzDROP COLLATION %s)r   r   r   r<   r   r   r   Úremove_collationÒ   s    ÿz#CollationOperation.remove_collationN)r-   r.   r/   r   r   rY   rc   rd   r   r   r   r   rS   ª   s
   rS   c                   @   s4   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZd
S )ÚCreateCollationzCreate a collation.c                 C   s.   |j jdkst |j j|¡s d S |  |¡ d S ©Nr   )r   r   r   r   r   rc   r!   r   r   r   r%   Ú   s    
ÿþz!CreateCollation.database_forwardsc                 C   s"   t  |jj|¡sd S |  |¡ d S r   )r   r   r   r   rd   r!   r   r   r   r&   â   s    z"CreateCollation.database_backwardsc                 C   s   d| j › �S )NzCreate collation r   r*   r   r   r   r+   ç   s    zCreateCollation.describec                 C   s   d| j  ¡  S )Nzcreate_collation_%s©r   Úlowerr*   r   r   r   r,   ê   s    z'CreateCollation.migration_name_fragmentN©	r-   r.   r/   rM   r%   r&   r+   r0   r,   r   r   r   r   re   Ø   s   re   c                   @   s4   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZd
S )ÚRemoveCollationzRemove a collation.c                 C   s.   |j jdkst |j j|¡s d S |  |¡ d S rf   )r   r   r   r   r   rd   r!   r   r   r   r%   ñ   s    
ÿþz!RemoveCollation.database_forwardsc                 C   s"   t  |jj|¡sd S |  |¡ d S r   )r   r   r   r   rc   r!   r   r   r   r&   ù   s    z"RemoveCollation.database_backwardsc                 C   s   d| j › �S )NzRemove collation r   r*   r   r   r   r+   þ   s    zRemoveCollation.describec                 C   s   d| j  ¡  S )Nzremove_collation_%srg   r*   r   r   r   r,     s    z'RemoveCollation.migration_name_fragmentNri   r   r   r   r   rj   ï   s   rj   c                       s@   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Ze‡ fdd	„ƒZ‡  Z	S )
ÚAddConstraintNotValidzg
    Add a table constraint without enforcing validation, using PostgreSQL's
    NOT VALID syntax.
    c                    s$   t |tƒstdƒ‚tƒ  ||¡ d S )Nz<AddConstraintNotValid.constraint must be a check constraint.)Ú
isinstancer   Ú	TypeErrorÚsuperr   )r   rC   Ú
constraint©r;   r   r   r     s
    
ÿzAddConstraintNotValid.__init__c                 C   s   d| j j| jf S )Nz*Create not valid constraint %s on model %s)ro   r   rC   r*   r   r   r   r+     s    þzAddConstraintNotValid.describec                 C   sL   |j  || j¡}|  |jj|¡rH| j ||¡}|rH|jt	|ƒd d d� d S )Nz
 NOT VALID)Úparams)
rE   rF   rC   rG   r   r   ro   Z
create_sqlr   Ústr)r   r   r"   r#   r$   rJ   Zconstraint_sqlr   r   r   r%     s
    z'AddConstraintNotValid.database_forwardsc                    s   t ƒ jd S )NZ
_not_valid)rn   r,   r*   rp   r   r   r,   #  s    z-AddConstraintNotValid.migration_name_fragment)
r-   r.   r/   rM   r   r+   r%   r0   r,   Ú__classcell__r   r   rp   r   rk     s   
rk   c                   @   sL   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	dd„ ƒZ
dd„ ZdS )ÚValidateConstraintz&Validate a table NOT VALID constraint.c                 C   s   || _ || _d S r   ©rC   r   )r   rC   r   r   r   r   r   +  s    zValidateConstraint.__init__c                 C   s   d| j | jf S )Nz"Validate constraint %s on model %srO   r*   r   r   r   r+   /  s    zValidateConstraint.describec                 C   sH   |j  || j¡}|  |jj|¡rD| d| |jj	¡| | j
¡f ¡ d S )Nz%ALTER TABLE %s VALIDATE CONSTRAINT %s)rE   rF   rC   rG   r   r   r   r   Z_metaZdb_tabler   rI   r   r   r   r%   2  s    
þz$ValidateConstraint.database_forwardsc                 C   s   d S r   r   r!   r   r   r   r&   :  s    z%ValidateConstraint.database_backwardsc                 C   s   d S r   r   r   r   r   r   r   >  s    z!ValidateConstraint.state_forwardsc                 C   s   d| j  ¡ | j ¡ f S )Nz%s_validate_%s)rC   rh   r   r*   r   r   r   r,   A  s    z*ValidateConstraint.migration_name_fragmentc                 C   s   | j jg | j| jdœfS )Nru   )r;   r-   rC   r   r*   r   r   r   rY   E  s    þzValidateConstraint.deconstructN)r-   r.   r/   rM   r   r+   r%   r&   r   r0   r,   rY   r   r   r   r   rt   (  s   
rt   N) Zdjango.contrib.postgres.signalsr   r   r   Z	django.dbr   r   Zdjango.db.migrationsr   r   r	   Z$django.db.migrations.operations.baser
   Zdjango.db.models.constraintsr   r   r1   r3   r4   r5   r6   r7   r8   r9   r:   r>   rN   rS   re   rj   rk   rt   r   r   r   r   Ú<module>   s*   6
."