
    h                         d Z ddl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 ddlmZ  G d	 d
e      Z G d dej                  j!                  e            ZeZeZy)z
Custom generic managers
    N)ImproperlyConfigured)models)QuerySet)get_language)appsettings)get_active_language_choicesc                   `     e Zd ZdZ fdZ fdZ fdZ fdZ fdZd
dZ	d Z
d
d	Z xZS )TranslatableQuerySetz
    An enhancement of the QuerySet which sets the objects language before they are returned.

    When using this class in combination with *django-polymorphic*, make sure this
    class is first in the chain of inherited classes.
    c                 2    t        |   |i | d | _        y N)super__init__	_language)selfargskwargs	__class__s      ?/home/dcms/DCMS/lib/python3.12/site-packages/parler/managers.pyr   zTranslatableQuerySet.__init__   s    $)&)    c                 F    t         |          }| j                  |_        |S r   )r   _cloner   )r   cr   s     r   r   zTranslatableQuerySet._clone   s    GNnnr   c                 X    | j                   r| j                   |d<   t        |   di |S )N_current_language )r   r   create)r   r   r   s     r   r   zTranslatableQuerySet.create   s-     >>*...F&'w~'''r   c                     t         |           | j                  b| j                  rUt	        | j                  d   t
        j                        r-| j                  D ]  }|j                  | j                          y y y y )Nr   )r   
_fetch_allr   _result_cache
isinstancer   Modelset_current_language)r   objr   s     r   r   zTranslatableQuerySet._fetch_all&   ss     	NN&""4--a0&,,?)) 9((89 @ # 'r   c                     i }|r>| j                   j                  j                         D ]  }	 |j                  |      ||<    t        |   |fi |}|j                  |       |S # t        $ r Y Hw xY wr   )model_parler_metaget_all_fieldspopKeyErrorr   _extract_model_paramsupdate)r   defaultsr   translated_defaultsfieldparamsr   s         r   r*   z*TranslatableQuerySet._extract_model_params3   s     !00??A 19e1D'. .xB6B)*   s   A''	A32A3c                 T    |t         j                  j                         }|| _        | S )z[
        Set the language code to assign to objects retrieved using this QuerySet.
        )r   PARLER_LANGUAGESget_default_languager   )r   language_codes     r   languagezTranslatableQuerySet.languageB   s*      '88MMOM&r   c                 ~   | j                   j                  j                  }|st               f}i }|j	                         D ])  \  }}|j                  d      r	|||dd <    ||| d| <   + t        |      dk(  r|d   ||dz   <    | j                  d	i |S |||dz   <    | j                  d	i |j                         S )
a~  
        Only return translated objects which of the given languages.

        When no language codes are given, only the currently active language is returned.

        .. note::

            Due to Django `ORM limitations <https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships>`_,
            this method can't be combined with other filters that access the translated fields. As such, query the fields in one filter:

            .. code-block:: python

                qs.translated('en', name="Cheese Omelette")

            This will query the translated model for the ``name`` field.
        master__   N__   r   __language_code__language_code__inr   )	r%   r&   root_rel_namer   items
startswithlenfilterdistinct)r   language_codestranslated_fieldsrelnamefilters
field_namevals          r   
translatedzTranslatableQuerySet.translatedL   s    " **))77*n.N0668 	:OJ$$Z0*-
12'697)2j\23		: ~!#3A!3DGG//04;;)))7EGG3344;;))2244r   c                 <    t        |      } | j                  |i |S )aN  
        Only return objects which are translated, or have a fallback that should be displayed.

        Typically that's the currently active language and fallback language.
        This should be combined with ``.distinct()``.

        When ``hide_untranslated = True``, only the currently active language will be returned.
        )r   rH   )r   r3   rC   rB   s       r   active_translationsz(TranslatableQuerySet.active_translationsp   s%     5]CtD2CDDr   r   )__name__
__module____qualname____doc__r   r   r   r   r*   r4   rH   rJ   __classcell__r   s   @r   r
   r
      s2    
(9"5HEr   r
   c                   "     e Zd ZdZ fdZ xZS )TranslatableManagerz[
    The manager class which ensures the enhanced TranslatableQuerySet object is used.
    c                     t         |          }t        |t              s"t	        | j
                  j                   d      |S )Nz;._queryset_class does not inherit from TranslatableQuerySet)r   get_querysetr    r
   r   r   rK   )r   qsr   s     r   rT   z TranslatableManager.get_queryset   sE    W!#"23&>>**++fg  	r   )rK   rL   rM   rN   rT   rO   rP   s   @r   rR   rR      s     r   rR   )rN   djangodjango.core.exceptionsr   	django.dbr   django.db.models.queryr   django.utils.translationr   parlerr   parler.utilsr   r
   Managerfrom_querysetrR   TranslationQuerysetTranslationManagerr   r   r   <module>ra      s\     7  + 1  4nE8 nEb&..667KL  + ( r   