
    h#                     j    d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
 d
dZ G d de      Zdd	Zy)zG
The configuration wrappers that are used for :ref:`PARLER_LANGUAGES`.
    N)settings)ImproperlyConfigured)get_languageget_null_language_erroris_supported_django_languagec           
         t        |       } | j                  di        | d   }|j                  dd       d|v r|j                  d      g|d<   d|v r|j                  d      g|d<   |j                  |       d|vrddlm} |j                  |d<   d|vrddlm} |j                  g|d<   t        |d         st        d	j                  ||d               | j                         D ]  \  }}|dk(  rt        |t        t        f      st        | d
| d      t        |      D ]Q  \  }}t        |d         st        | d
| d| d      |j                         D ]  \  }	}
|j                  |	|
        S  | S )a  
    Apply extra defaults to the language settings.
    This function can also be used by other packages to
    create their own variation of ``PARLER_LANGUAGES`` with extra fields.
    For example::

        from django.conf import settings
        from parler import appsettings as parler_appsettings

        # Create local names, which are based on the global parler settings
        MYAPP_DEFAULT_LANGUAGE_CODE = getattr(settings, 'MYAPP_DEFAULT_LANGUAGE_CODE', parler_appsettings.PARLER_DEFAULT_LANGUAGE_CODE)
        MYAPP_LANGUAGES = getattr(settings, 'MYAPP_LANGUAGES', parler_appsettings.PARLER_LANGUAGES)

        # Apply the defaults to the languages
        MYAPP_LANGUAGES = parler_appsettings.add_default_language_settings(MYAPP_LANGUAGES, 'MYAPP_LANGUAGES',
            code=MYAPP_DEFAULT_LANGUAGE_CODE,
            fallback=MYAPP_DEFAULT_LANGUAGE_CODE,
            hide_untranslated=False
        )

    The returned object will be an :class:`~parler.utils.conf.LanguagesSetting` object,
    which adds additional methods to the :class:`dict` object.

    :param languages_list: The settings, in :ref:`PARLER_LANGUAGES` format.
    :param var_name: The name of your variable, for debugging output.
    :param extra_defaults: Any defaults to override in the ``languages_list['default']`` section, e.g. ``code``, ``fallback``, ``hide_untranslated``.
    :return: The updated ``languages_list`` with all defaults applied to all sections.
    :rtype: LanguagesSetting
    defaulthide_untranslatedFfallback	fallbackscoder   )appsettingszGThe value for {}['defaults']['code'] ('{}') does not exist in LANGUAGES[z(] should be a tuple of language choices!z][z%]['code'] does not exist in LANGUAGES)LanguagesSetting
setdefaultpopupdateparlerr   PARLER_DEFAULT_LANGUAGE_CODEr   r   formatitems
isinstancelisttuple	enumerate)languages_listvar_nameextra_defaultsdefaultsr   site_idlang_choicesichoicekeyvalues              A/home/dcms/DCMS/lib/python3.12/site-packages/parler/utils/conf.pyadd_default_language_settingsr'      s   < &n5Ni,i(HU X!)j!9 :^#'5'9'9*'E&F{#OON# X&&CC("&!,!I!I J'(89"U\\(6*
 	
 "0!5!5!7 .i,u6&*AgY&NO  #<0 	.IAv/v?*j'"QC/TU 
 'nn. .
U!!#u-.	..$     c                   >    e Zd ZdZd	dZd
dZd
dZd
dZd Zd	dZ	y)r   z
    This is the actual object type of the :ref:`PARLER_LANGUAGES` setting.
    Besides the regular :class:`dict` behavior, it also adds some additional methods.
    Nc                 0   |t        t                     |t        t        dd      }| j	                  |d      D ]  }|d   |k(  s|c S  | j	                  |d      D ]2  }|d   j                  d      d   |j                  d      d   k(  s0|c S  | d   S )a<  
        Return the language settings for the current site

        This function can be used with other settings variables
        to support modules which create their own variation of the ``PARLER_LANGUAGES`` setting.
        For an example, see :func:`~parler.appsettings.add_default_language_settings`.
        NSITE_ID r   -r   r	   )
ValueErrorr   getattrr   getsplit)selflanguage_coder    	lang_dicts       r&   r   zLanguagesSetting.get_languagel   s      4677?h	48G'2. 	!I M1  	!
 '2. 	!I &&s+A.-2E2Ec2J12MM  	! Ir(   c                     |
t               }| j                  ||      }|d   s|g|d   D cg c]
  }||k7  s	| c}z   S |gS c c}w )z
        Find out which translations should be visible in the site.
        It returns a list with either a single choice (the current language),
        or a list with the current language + fallback language.
        r    r
   r   )r   )r2   r3   r    r4   langs        r&   get_active_choicesz#LanguagesSetting.get_active_choices   sl      (NM%%mW%E	,-!?!*;!7&4=;P&   "?"	&s
   
AAc                 2    | j                  ||      }|dd S )zr
        Find out what the fallback language is for a given language choice.

        .. versionadded 1.5
        r6      N)r8   r2   r3   r    choicess       r&   get_fallback_languagesz'LanguagesSetting.get_fallback_languages   s%     ))-)Iqr{r(   c                 T    | j                  ||      }|rt        |      dkD  r|d   S y)z
        Find out what the fallback language is for a given language choice.

        .. deprecated:: 1.5
           Use :func:`get_fallback_languages` instead.
        r6   r:   N)r8   lenr;   s       r&   get_fallback_languagez&LanguagesSetting.get_fallback_language   s6     ))-)Is7|a' 2;r(   c                     | d   d   S )z.
        Return the default language.
        r	   r   r,   )r2   s    r&   get_default_languagez%LanguagesSetting.get_default_language   s     Iv&&r(   c                 z    |t        t        dd      }	 | |   d   d   S # t        t        f$ r | d   d   cY S w xY w)z
        Return the first language for the current site.
        This can be used for user interfaces, where the languages are displayed in tabs.
        Nr+   r   r   r	   )r/   r   KeyError
IndexError)r2   r    s     r&   get_first_languagez#LanguagesSetting.get_first_language   sU    
 ?h	48G	+=#F++*% 	+ 	?6**	+s   
  ::N)NN)
__name__
__module____qualname____doc__r   r8   r=   rA   rC   rG   r,   r(   r&   r   r   f   s%    
2#" '+r(   r   c                 h   g d}| rt        j                  |       }| j                         D ]  \  }}|rt        |t              s	|dk7  r||= !|dk(  r$|j                         D ]  \  }}||vs|d   |=  Jt        |      D ]+  \  }}|j                         D ]  \  }}||vs||   |   |=  -  |S y)z
    Converts django CMS' setting CMS_LANGUAGES into PARLER_LANGUAGES. Since
    CMS_LANGUAGES is a strict superset of PARLER_LANGUAGES, we do a bit of
    cleansing to remove irrelevant items.
    )r   r   r
   redirect_on_fallbackr	   N)copydeepcopyr   r   intr   )	cms_languages
valid_keysparler_languagesr    site_configr$   r%   r"   lang_configs	            r&   $get_parler_languages_from_django_cmsrW      s     TJ==7$1$7$7$9 	B G[
7C 8W	=Q$W-)#"-"3"3"5 =JC*,,Y7<= '0&< BNA{&1&7&7&9 B
Uj0 0 9! <S ABB	B  r(   )PARLER_LANGUAGESrH   )rL   rO   sysdjango.confr   django.core.exceptionsr   parler.utils.i18nr   r   r   r'   dictr   rW   r,   r(   r&   <module>r^      s9     
   7 a aUp\+t \+~r(   