î
Þ^Q\š  ã               @   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	 Gd d „  d e
 ƒ Z Gd d	 „  d	 e e e j ƒ Z Gd
 d „  d e e e j ƒ Z d S)z1Autocomplete fields for QuerySetSequence choices.é    )Ú"ContentTypeModelMultipleFieldMixinÚGenericModelMixin)Úforms)ÚContentType)Ú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 | ƒ } x[ |  j j j D]J } | j j d k rM | j j d } n	 | j } | | j	 ƒ  k r" | Sq" Wd S)z:Return the QuerySet from the QuerySetSequence for a ctype.ZQuerySequenceModelr   N)
r   ÚobjectsZ
get_for_idÚquerysetÚqueryZ
_querysetsÚmodelÚ__name__Ú	__bases__Zmodel_class)ÚselfÚcontent_type_idÚcontent_typer	   r   © r   úQ/var/www/dbchiro/venv/lib/python3.4/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 d | ƒ‚ d S)a  
        Raise a ValidationError for invalid_choice.

        The validation error left unprecise about the exact error for security
        reasons, to prevent an attacker doing information gathering to reverse
        valid content type and object ids.
        Zinvalid_choiceÚcodeÚparamsN)r   ÚValidationErrorÚerror_messages)r   r   r   r   r   Úraise_invalid_choice!   s    z/QuerySetSequenceFieldMixin.raise_invalid_choicec             C   s   | j  d d ƒ S)z0Return a tuple of ctype id, object id for value.ú-é   )Úsplit)r   Úvaluer   r   r   Úget_content_type_id_object_id/   s    z8QuerySetSequenceFieldMixin.get_content_type_id_object_id)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|  j  | ƒ \ } } |  j | ƒ } | d k rG |  j ƒ  n  y | j d | ƒ SWn" | j j k
 r |  j ƒ  Yn Xd S)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   ZDoesNotExist)r   r   r   Ú	object_idr	   r   r   r   Ú	to_python9   s    z$QuerySetSequenceModelField.to_pythonN)r   r   r   r    r%   r   r   r   r   r!   4   s   r!   c               @   sF   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   sC   y t  | ƒ SWn. t k
 r> t j |  j d d d ƒ‚ Yn Xd  S)NÚlistr   )Ú	frozensetÚ	TypeErrorr   r   r   )r   r   r   r   r   Ú_deduplicate_valuesT   s    z6QuerySetSequenceModelMultipleField._deduplicate_valuesc             C   sQ   i  } xD | D]< } |  j  | ƒ \ } } | j | g  ƒ | | j | ƒ q W| S)N)r   Ú
setdefaultÚappend)r   ÚvaluesÚpksÚvalr   r$   r   r   r   Ú_get_ctype_objects`   s    z5QuerySetSequenceModelMultipleField._get_ctype_objectsc          	   C   s‹   g  } xx | j  ƒ  D]j \ } } |  j | ƒ } | d  k rd |  j d t d d | | d f ƒ ƒ n  | j | j d | ƒ ƒ q Wt | Œ  S)Nr   r   z%s-%sr   Zpk__in)Úitemsr   r   Údictr,   Úfilterr   )r   r.   Z	querysetsr   Z
object_idsr	   r   r   r   Ú_get_queryset_for_pksj   s    	z8QuerySetSequenceModelMultipleField._get_queryset_for_pksc             C   s{   |  j  | ƒ } |  j | ƒ } |  j | ƒ } d d „  | Dƒ } x4 | D], } | | k rG |  j d i | d 6ƒ qG qG W| S)Nc             S   s2   g  |  ]( } d  t  j j | ƒ j | j f ‘ q S)z%s-%s)r   r   Zget_for_modelr"   )Ú.0Úor   r   r   ú
<listcomp>   s   	zDQuerySetSequenceModelMultipleField._check_values.<locals>.<listcomp>r   r   )r*   r0   r4   r   )r   r   r-   r.   r	   Zfetched_valuesr/   r   r   r   Ú_check_valuesy   s    	
z0QuerySetSequenceModelMultipleField._check_valuesN)r   r   r   r    r*   r0   r4   r8   r   r   r   r   r&   O   s
   
r&   N)r    Zdal_contenttypes.fieldsr   r   Zdjangor   Z"django.contrib.contenttypes.modelsr   Zqueryset_sequencer   Úobjectr   ZModelChoiceFieldr!   ZModelMultipleChoiceFieldr&   r   r   r   r   Ú<module>   s   &