
    h                         d Z ddlmZ ddlmZ ddlmZ  G d d      Z e       Zd Z	d Z
d	 ZddZddZddZej                  fdZej                  fdZd Zd Zy
)a-  
django-parler uses caching to avoid fetching model data when it doesn't have to.

These functions are used internally by django-parler to fetch model data.
Since all calls to the translation table are routed through our model descriptor fields,
cache access and expiry is rather simple to implement.
    )cache)appsettings)get_language_settingsc                       e Zd Zd Zd Zy)	IsMissingc                      yNF selfs    </home/dcms/DCMS/lib/python3.12/site-packages/parler/cache.py__bool__zIsMissing.__bool__   s        c                      y)Nz<IsMissing>r
   r   s    r   __repr__zIsMissing.__repr__   s    r   N)__name__
__module____qualname__r   r   r
   r   r   r   r      s    r   r   c                 "    t        | t              S )zW
    Check whether the returned value indicates there is no data for the language.
    )
isinstancer   )values    r   
is_missingr      s    
 eY''r   c           	      
   | j                   | j                  j                  rg S g }| j                  j	                         }| j                         D ]/  }|D ](  }|j                  t        || j                   |             * 1 |S )z:
    Return the cache keys associated with an object.
    )pk_stateadding_parler_metaget_all_modelsget_available_languagesappendget_translation_cache_key)instancekeys	tr_modelslanguagetr_models        r   get_object_cache_keysr'   #   s     {{hoo44	D%%446I 446 T! 	THKK1(HKKRS	TT Kr   c           	          t         j                  rt         j                   dnd}| d| j                  j                   d| j                   d| d| 	S )zH
    The low-level function to get the cache key for a translation.
    . zparler.)r   PARLER_CACHE_PREFIX_meta	app_labelr   )translated_model	master_idlanguage_codeprefixs       r   r!   r!   5   sb     7B6U6U//02[]FXW-33==>a@P@Y@Y?ZZ[\e[ffghugvwwr   Nc                     || j                         }| j                  j                  |      }t        | |||      }|sy	  |di |}d|j
                  _        |S # t        $ r Y yw xY w)ze
    Fetch an cached translation.

    .. versionadded 1.2 Added the ``related_name`` parameter.
    NFr
   )get_current_languager   get_model_by_related_name_get_cached_values	TypeErrorr   r   )r"   r0   related_nameuse_fallbackr.   valuestranslations          r   get_cached_translationr;   ?   s      557,,FF|T*:M<XF&00
 !&K  s    A 	A'&A'c                     || j                         }t        |      dk  rt        |      dkD  rt        d      | j                  j	                  |      }t        | |||      }|sy|j                  |d      S ) 
    Fetch an cached field.
    N   zAUnexpected language code, did you swap field_name, language_code?)r3   lenRuntimeErrorr   get_model_by_fieldr5   get)r"   
field_namer0   r8   r.   r9   s         r   get_cached_translated_fieldrD   W   s      557 :!M 2Q 6^__,,??
K*:M<XF ::j$''r   c                    t         j                  r"| j                  r| j                  j                  ryt        || j                  |      }t        j                  |      }|sy|j                  dd      rDt        | j                  |   |<   |r+t        |      }|d   D ]  }||k7  s	t        | ||d      c S  y| |d<   ||d<   |S )r=   N__FALLBACK__F	fallbacks)r8   masterr0   )r   PARLER_ENABLE_CACHINGr   r   r   r!   r   rB   MISSING_translations_cacher   r5   )r"   r.   r0   r8   keyr9   	lang_dictfallback_langs           r   r5   r5   l   s     ,,HKK8??CYCY
#$4hkk=
QCYYs^F zz.%(HO$$%56}E -m<I "+;!7  M1- "2MPU 
 F8+F?Mr   c                 F   t         j                  sy| j                  t        d      | j	                  d      }d| j
                  i}|D ]  }t        | |      ||<    t        | j                  | j                  | j                        }t        j                  |||       y)z/
    Store a new translation in the cache.
    NzCan't cache unsaved translationF)include_m2midtimeout)r   rI   r/   
ValueErrorget_translated_fieldsrQ   getattrr!   	__class__r0   r   set)r:   rS   fieldsr9   namerL   s         r   _cache_translationr[      s     ,,$:;; ..5.AFKNN#F 2{D1t2 ${44k6O6OC 
IIc67+r   c                    t         j                  r"| j                  r| j                  j                  ry| j
                  j                  |      }t        || j                  |      }t        j                  |ddi|       y)z[
    Store the fact that a translation doesn't exist, and the fallback should be used.
    NrF   TrR   )
r   rI   r   r   r   r   r4   r!   r   rX   )r"   r0   r7   rS   r&   rL   s         r   !_cache_translation_needs_fallbackr]      s_     ,,HKK8??CYCY$$>>|LH
#Hhkk=
IC	IIcND)7;r   c                 @    t        j                  t        |              y N)r   delete_manyr'   )shared_models    r   _delete_cached_translationsrb      s    	+L9:r   c                     t         j                  sy t        | j                  | j                  | j
                        }t        j                  |       y r_   )r   rI   r!   rW   r/   r0   r   delete)r:   rL   s     r   _delete_cached_translationre      sA    ,, ${44k6O6OC 
LLr   )NNFr	   )F)__doc__django.core.cacher   parlerr   parler.utilsr   r   rJ   r   r'   r!   r;   rD   r5   default_timeoutr[   r]   rb   re   r
   r   r   <module>rk      sr    $  .  +($x0(*D -2,A,A ,0 493H3H<;	r   