o
    e                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ G dd deZG d	d
 d
eeejZG dd deeejZG dd deZdS )z1Autocomplete fields for QuerySetSequence choices.    )"ContentTypeModelMultipleFieldMixinGenericModelMixin)forms)ContentType)re_path)QuerySetSequencec                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
QuerySetSequenceFieldMixinz)Base methods for QuerySetSequence fields.c                 C   sT   t j|}| j D ]}|jjdkr|jjd }n|j}|| kr'|  S qdS )z:Return the QuerySet from the QuerySetSequence for a ctype.QuerySequenceModelr   N)	r   objects
get_for_idquerysetget_querysetsmodel__name__	__bases__model_class)selfcontent_type_idcontent_typer   r    r   h/var/www/html/Testing_prj/Navya-Bakers/venv/lib/python3.10/site-packages/dal_queryset_sequence/fields.pyget_queryset_for_content_type   s   z8QuerySetSequenceFieldMixin.get_queryset_for_content_typeNc                 C   s   t j| jd d|d)a  
        Raise a ValidationError for invalid_choice.

        The validation error left imprecise about the exact error for security
        reasons, to prevent an attacker doing information gathering to reverse
        valid content type and object ids.
        invalid_choice)codeparams)r   ValidationErrorerror_messages)r   r   r   r   r   raise_invalid_choice"   s
   z/QuerySetSequenceFieldMixin.raise_invalid_choicec                 C   s   | ddS )z0Return a tuple of ctype id, object id for value.-   )splitr   valuer   r   r   get_content_type_id_object_id0   s   z8QuerySetSequenceFieldMixin.get_content_type_id_object_idN)r   
__module____qualname____doc__r   r   r#   r   r   r   r   r      s
    
r   c                   @   s   e Zd ZdZdd ZdS )QuerySetSequenceModelFieldzEReplacement for ModelChoiceField supporting QuerySetSequence choices.c                 C   s`   |s|S |  |\}}| |}|du r|   z|j|dW S  |jjy/   |   Y dS w )z
        Given a string like '3-5', return the model of ctype #3 and pk 5.

        Note that in the case of ModelChoiceField, to_python is also in charge
        of security, it's important to get the results from self.queryset.
        N)pk)r#   r   r   getr   DoesNotExist)r   r"   r   	object_idr   r   r   r   	to_python:   s   
z$QuerySetSequenceModelField.to_pythonN)r   r%   r&   r'   r-   r   r   r   r   r(   5   s    r(   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )"QuerySetSequenceModelMultipleFieldzCModelMultipleChoiceField with support for QuerySetSequence choices.c                 C   s.   zt |W S  ty   tj| jd ddw )Nlist)r   )	frozenset	TypeErrorr   r   r   r!   r   r   r   _deduplicate_valuesU   s   
z6QuerySetSequenceModelMultipleField._deduplicate_valuesc                 C   s:   i }|D ]}|  |\}}||g  || | q|S r$   )r#   
setdefaultappend)r   valuespksvalr   r,   r   r   r   _get_ctype_objectsa   s   z5QuerySetSequenceModelMultipleField._get_ctype_objectsc                 C   s`   g }|  D ]%\}}| |}|d u r"| jtd||d f dd ||j|d qt| S )N%s-%sr   )r"   r   )pk__in)itemsr   r   dictr4   filterr   )r   r6   	querysetsr   
object_idsr   r   r   r   _get_queryset_for_pksk   s   
z8QuerySetSequenceModelMultipleField._get_queryset_for_pksc                 C   sR   |  |}| |}| |}dd |D }|D ]}||vr&| jd|id q|S )Nc                 S   s$   g | ]}d t j|j|jf qS )r9   )r   r
   get_for_modelr)   ).0or   r   r   
<listcomp>   s    zDQuerySetSequenceModelMultipleField._check_values.<locals>.<listcomp>r"   r:   )r2   r8   rA   r   )r   r"   r5   r6   r   fetched_valuesr7   r   r   r   _check_valuesz   s   


z0QuerySetSequenceModelMultipleField._check_valuesN)r   r%   r&   r'   r2   r8   rA   rG   r   r   r   r   r.   P   s    
r.   c                       s(   e Zd ZdZ fddZdd Z  ZS )GenericForeignKeyModelFieldzBField that generate automatically the view for compatible widgets.c                    s   | dd}| dd}| dd}| dd}|r|nt| | _|r3|| _dd |D }t| |d< t|trDt|trD|| _|| _nt	d	t
t| j|i | dS )
z'Initialize GenericForeignKeyModelField.model_choiceNwidgetviewfield_idc                 S   s   g | ]	}|d  j  qS )r   )r
   all)rC   r   r   r   r   rE      s    z8GenericForeignKeyModelField.__init__.<locals>.<listcomp>r   z,Class object are required (not instantiated))popidrL   rI   r   
isinstancetype
widget_objview_objAttributeErrorsuperrH   __init__)r   argskwargsrI   rJ   rK   rL   models_queryset	__class__r   r   rV      s$   z$GenericForeignKeyModelField.__init__c                 C   s^   d |j| j}| j|d| _td |j| j| jfi }td |j| j|j| j	d|dS )zReturn url.z{}_autocomp_{})urlzAutoview{}{}z^{}_{}_autocomp$)r   )name)
formatr   rL   rR   rJ   rQ   rS   r\   as_viewr   )r   formurl_name	auto_viewr   r   r   as_url   s   z"GenericForeignKeyModelField.as_url)r   r%   r&   r'   rV   rc   __classcell__r   r   rZ   r   rH      s    rH   N)r'   dal_contenttypes.fieldsr   r   djangor   "django.contrib.contenttypes.modelsr   django.urlsr   r\   queryset_sequencer   objectr   ModelChoiceFieldr(   ModelMultipleChoiceFieldr.   rH   r   r   r   r   <module>   s     &;