U
    eu                     @   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mZ ddlmZ ddd	d
ddddgZe ZG dd dZG dd de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eeZG dd deeeZdS )    N)
ArrayField)	AggregateBooleanField	JSONField	TextFieldValue)RemovedInDjango50WarningRemovedInDjango51Warning   )OrderableAggMixinArrayAggBitAndBitOrBitXorBoolAndBoolOrJSONBAgg	StringAggc                       s6   e Zd Zed fdd
Z fddZdd Z  ZS )DeprecatedConvertValueMixindefaultc                   s4   |t krd }d| _nd| _t j|d|i| d S )NFTr   )NOT_PROVIDED_default_providedsuper__init__)selfr   expressionsextra	__class__ `/var/www/html/htmlvenv/lib/python3.8/site-packages/django/contrib/postgres/aggregates/general.pyr      s
    z$DeprecatedConvertValueMixin.__init__c                    s(   t  j||}| js$t| d| j|_|S )N"deprecation_empty_result_set_value)r   resolve_expressionr   getattrdeprecation_valueZempty_result_set_value)r   argskwargsresolvedr   r    r!   r#   #   s      z.DeprecatedConvertValueMixin.resolve_expressionc                 C   s(   |d kr$| j s$tj| jtd | jS |S )N)category)r   warningswarndeprecation_msgr   r%   )r   value
expression
connectionr    r    r!   convert_value+   s    z)DeprecatedConvertValueMixin.convert_value)__name__
__module____qualname__r   r   r#   r0   __classcell__r    r    r   r!   r      s   r   c                   @   s4   e Zd ZdZdZdZedd ZdZedd Z	d	S )
r   Z	ARRAY_AGG6%(function)s(%(distinct)s%(expressions)s %(ordering)s)Tc                 C   s   g S Nr    r   r    r    r!   <lambda>8       zArrayAgg.<lambda>zIn Django 5.0, ArrayAgg() will return None instead of an empty list if there are no rows. Pass default=None to opt into the new behavior and silence this warning or default=[] to keep the previous behavior.c                 C   s   t | jd jS )Nr   )r   Zsource_expressionsoutput_fieldr7   r    r    r!   r:   ?   s    zArrayAgg.output_fieldN)
r1   r2   r3   functiontemplateallow_distinctpropertyr%   r,   r:   r    r    r    r!   r   2   s   c                   @   s   e Zd ZdZdS )r   ZBIT_ANDNr1   r2   r3   r;   r    r    r    r!   r   D   s   c                   @   s   e Zd ZdZdS )r   ZBIT_ORNr?   r    r    r    r!   r   H   s   c                   @   s   e Zd ZdZdS )r   ZBIT_XORNr?   r    r    r    r!   r   L   s   c                   @   s   e Zd ZdZe ZdS )r   ZBOOL_ANDNr1   r2   r3   r;   r   r:   r    r    r    r!   r   P   s   c                   @   s   e Zd ZdZe ZdS )r   ZBOOL_ORNr@   r    r    r    r!   r   U   s   c                       sH   e Zd ZdZdZdZe ZdZe	dd Z
dZed fd	d

Z  ZS )r   Z	JSONB_AGGr5   Tz[]c                 C   s   g S r6   r    r7   r    r    r!   r8   b   r9   zJSONBAgg.<lambda>zIn Django 5.0, JSONBAgg() will return None instead of an empty list if there are no rows. Pass default=None to opt into the new behavior and silence this warning or default=[] to keep the previous behavior.r   c                   s   t  j|d|i| t|trt|jtrt|jts|j}zt	|}W n8 tj
k
r   tjd|ddtd | j| j_Y n(X t|| j| _tjd|ddtd d S )Nr   zuPassing a Value() with an output_field that isn't a JSONField as JSONBAgg(default) is deprecated. Pass default=Value(z$, output_field=JSONField()) instead.   )
stacklevelr)   zPPassing an encoded JSON string as JSONBAgg(default) is deprecated. Pass default=z	 instead.)r   r   
isinstancer   r-   strr:   r   jsonloadsJSONDecodeErrorr*   r+   r	   r   )r   r   r   r   r-   decodedr   r    r!   r   n   s.    



zJSONBAgg.__init__)r1   r2   r3   r;   r<   r=   r   r:   r%   r>   r"   r,   r   r   r4   r    r    r   r!   r   Z   s   c                       s6   e Zd ZdZdZdZe ZdZdZ	 fddZ
  ZS )r   Z
STRING_AGGr5   T zIn Django 5.0, StringAgg() will return None instead of an empty string if there are no rows. Pass default=None to opt into the new behavior and silence this warning or default="" to keep the previous behavior.c                    s"   t t|}t j||f| d S r6   )r   rD   r   r   )r   r.   	delimiterr   Zdelimiter_exprr   r    r!   r      s    zStringAgg.__init__)r1   r2   r3   r;   r<   r=   r   r:   r%   r,   r   r4   r    r    r   r!   r      s   )rE   r*   Zdjango.contrib.postgres.fieldsr   Zdjango.db.modelsr   r   r   r   r   Zdjango.utils.deprecationr   r	   Zmixinsr   __all__objectr   r   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   s0   1