
    h?                     B   d dl mZ d dlmZmZmZ d dlm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 d	Z G d
 d      Z G d dej*                        Zi Zd Z G d de      Z G d de
      ZddZddZ G d deej:                  e      Z G d de	      ZeZ y)    )forms)NON_FIELD_ERRORSObjectDoesNotExistValidationError)
BoundField)BaseInlineFormSetModelFormMetaclass)cached_property)get_language)get_supported_language_variant)TranslationDoesNotExist)TranslatableModelFormTranslatedFieldBaseTranslatableModelFormc                       e Zd ZdZd Zy)r   ai  
    A wrapper for a translated form field.

    This wrapper can be used to declare translated fields on the form, e.g.

    .. code-block:: python

        class MyForm(TranslatableModelForm):
            title = TranslatedField()
            slug = TranslatedField()

            description = TranslatedField(form_class=forms.CharField, widget=TinyMCE)
    c                     || _         y N)kwargs)selfr   s     </home/dcms/DCMS/lib/python3.12/site-packages/parler/forms.py__init__zTranslatedField.__init__"   s	        N)__name__
__module____qualname____doc__r    r   r   r   r      s    r   r   c                   \     e Zd ZdZdZ fdZd Z fdZd Zd Z	e
d        Z fd	Z xZS )
r   zh
    The base methods added to :class:`TranslatableModelForm` to fetch and store translated fields.
    Nc                    |j                  dd       }t        	|   |i | |j                  dd       }|r|j                  D ]q  }	 |j                  |      }|j                         D ]I  }	 |j                  j                  |      }| j                  j                  ||j                  |             K s | j                  +|r|j                         | _        n|xs
 t!               | _        	 t#        | j                         y # t        $ r Y w xY w# t        $ r Y w xY w# t$        $ r% t'        dj)                  | j                              w xY w)N_current_languageinstance)metazuTranslatable forms can't be initialized for the language '{}', that option does not exist in the 'LANGUAGES' setting.)popsuperr   get_parler_meta_get_translated_modelget_translated_fields_meta	get_fieldinitial
setdefaultvalue_from_objectr   r   language_codeget_current_languager   r   LookupError
ValueErrorformat)
r   argsr   current_languager!   r"   translationfieldmodel_field	__class__s
            r   r   z"BaseTranslatableModelForm.__init__.   sc   !::&94@$)&) ::j$/ -- !! #+"@"@d"@"KK "&!;!;!= 	!!*5*;*;*E*Ee*LK LL33 %{'D'D['Q	!!* %%-%B%B%D"%5%G"	*4+=+=>  2 ! !! / .  	IIOPTPbPbIc 	s1   D-AD/D# 	DD	D D #.Ec                    dg}d| j                   vr|j                  d       |j                         D ]S  }|| j                   vr|j                  |       $| j                  j                   r*|| j                  j                   vr|j                  |       d| j                  j                  r*|| j                  j                  v r|j                  |       || j
                  j                         v r|j                  |       | j                   |   }|j                  j                  |      }| j                  j                  |      }|j                  r%|j                  r3||j                  v sC|j                  |       V |S )Nmasterr.   )fieldsappendr(   r)   exclude_errorskeysr*   cleaned_datar%   blankrequiredempty_values)r   r5   r=   
field_name
form_fieldr7   field_values          r   &_get_translation_validation_exclusionsz@BaseTranslatableModelForm._get_translation_validation_exclusionsY   s9   *$++-NN?+ &;;= 	/J,z*""z9J9J'J z*##
djj6H6H(Hz*t||0022z* "[[4
)//99*E"//33J?#))&//#z'>'>>NN:.3	/6 r   c                     | j                   j                  | j                         | j                          t        |           y r   )r!   set_current_languager.   save_translated_fieldsr$   _post_clean)r   r8   s    r   rK   z%BaseTranslatableModelForm._post_clean}   s6     	**4+=+=>##% 	r   c           
      X   i }| j                   D ]  }	 | j                  |   }|||<     | j                  j                  di |}h d}|D ]N  }| j                  |       |j                         D ](  }||v rt        | j                  |t        ||             * P y# t        $ r Y w xY w)z-
        Save all translated fields.
        >   id	master_idr.   Nr   )	_translated_fieldsr@   KeyErrorr!   _set_translated_fields_post_clean_translation_get_field_namessetattrgetattr)r   r;   r6   valuetranslationsnon_translated_fieldsr5   s          r   rJ   z0BaseTranslatableModelForm.save_translated_fields   s      ,, 	"E))%0 "F5M	" <t}};;EfE !E' 	KK((5 %557 K11ugk5.IJK		K  s   B	B)(B)c                 &   | j                  |      }	 |j                  |d       | j                  r	 |j                          y y # t        $ r}| j                  |       Y d }~>d }~ww xY w# t        $ r}| j                  |       Y d }~y d }~ww xY w)NF)r=   validate_unique)rG   
full_cleanr   _update_errors_validate_uniquerZ   )r   r5   r=   es       r   rR   z1BaseTranslatableModelForm._post_clean_translation   s    ==kJ	#""7E"J
   '++- !	  	#""	# # '##A&&'s.   A A, 	A)A$$A),	B5BBc                     | j                   j                  j                  j                         }|D cg c]  }|| j                  v s| c}S c c}w r   )r)   modelr&   get_all_fieldsr;   )r   field_namesf_names      r   rO   z,BaseTranslatableModelForm._translated_fields   s?    jj&&33BBD%0J6Fdkk4IJJJs   AAc                 v    t         |   |      }|| j                  v rt        |j                        |_        |S )z
        Return a :class:`TranslatableBoundField` for translated models.
        This extends the default ``form[field]`` interface that produces the BoundField for HTML templates.
        )r$   __getitem__rO   _upgrade_boundfield_classr8   )r   name
boundfieldr8   s      r   re   z%BaseTranslatableModelForm.__getitem__   s;    
 W(.
4***#<Z=Q=Q#RJ r   )r   r   r   r   r.   r   rG   rK   rJ   rR   r
   rO   re   __classcell__r8   s   @r   r   r   '   sK     M)V"HK8' K K	 	r   r   c                     | t         u rt        S t        | t              r| S 	 t        |    S # t        $ r. t        d| j                   | t        fi       }|t        | <   |cY S w xY w)NTranslatable)r   TranslatableBoundField
issubclassUPGRADED_CLASSESrP   typer   )clsnew_clss     r   rf   rf      so    
j%%	C/	0

$$ cll^4s<R6SUWX '	s   + 4A"!A"c                   *     e Zd ZdZdZ	 d fd	Z xZS )rm   z\
    Decorating the regular BoundField to distinguish translatable fields in the admin.
    Tc                     |i }|j                  dd      dz   j                         |d<   t        |   ||g|i |S )Nclass z translatable-field)r%   stripr$   	label_tag)r   contentsattrsr3   r   r8   s        r   rx   z TranslatableBoundField.label_tag   sN     =E))GR03HHOOQgw 5B4B6BBr   )NN)r   r   r   r   is_translatablerx   ri   rj   s   @r   rm   rm      s     
 O $(C Cr   rm   c                   "     e Zd ZdZ fdZ xZS )TranslatableModelFormMetaclassz?
    Meta class to add translated form fields to the form.
    c                    t        |d      }t        |di       }|r
|j                  d|      }|r|j                  n|j                  }|j                         D 	cg c]  \  }}	t	        |	t
              r| }
}}	|r|j                  j                         D ]  }t        |d|j                        }t        |d|j                        xs d}t        |d|j                        xs d}t        |d|j                        xs d}t        |d	|j                        xs d}t        |d
|j                        xs d}|j                  dd       }|dk(  rd }|j                         D ]  }||
v r t!        ||fd|i||   j"                  ||<   '||vs,|||v s3||vs8||vs=||v rd||   i}ni }||v r||   |d<   ||v r||   |d<   ||v r||   |d
<   t        ||      }|r+t	        |t
              r|j%                  |j"                         t!        ||fd|i|}||||<     t&        | Q  | |||      S c c}	}w )Nr)   base_fieldsMetar;   r=   r   widgetslabels
help_textserror_messagesformfield_callback__all__widget	help_textlabel)_get_mro_attributer%   r`   items
isinstancer   r&   get_all_modelsrU   r;   r=   r   r   r   r   r(   _get_model_form_fieldr   updater$   __new__)mcsrg   basesrz   	form_metaform_base_fieldsform_new_meta
form_modelrc   
attr_valueplaceholder_fieldstranslations_modelr;   r=   r   r   r   r   r   r   placeholder	formfieldr8   s                         r   r   z&TranslatableModelFormMetaclass.__new__   s   &ug6	-="
  "IIfi8M0=,,9??J
 +0++-"&FJj/: " " *4*A*A*P*P*R >:&$]Hi>N>NOF%mY	@Q@QRXVXG%mY	@Q@QRXVXG$]Hi>N>NOUSUF!(iFZFZ![!a_aJ/?AYAYZ`^` # */3G)N&*!%"4"J"J"L 0:!%77,A 2 &- 4F- #(-"6"6	-E&M #*::!'6V3C &g 5$*eO  &0*2GFO)D)+%36@6H{ 3%/28.w%7;I&;Q'7 8 +=UF*KK*z+/W &k.@.@ A )> 2 &) 4F) #)	)I  )409fa0:>:B wsD%77W"s   H:)r   r   r   r   r   ri   rj   s   @r   r}   r}      s    \8 \8r   r}   Nc                 N    | D ]  }	 t        ||      c S  |S # t        $ r Y  w xY wr   )rU   AttributeError)r   rg   defaultbases       r   r   r   O  s>     	4&&
 N  		s   	$$c                     | j                   j                  |      }|j                  sy| |j                  di |}|S t	        |      st        d       ||fi |}|S )z|
    Utility to create the formfield from a model field.
    When a field is not editable, a ``None`` will be returned.
    Nz1formfield_callback must be a function or callabler   )r)   r*   editabler   callable	TypeError)r`   rg   r   r   r6   r   s         r   r   r   X  sq    
 KK!!$'E>> !#EOO-f-	  ()KLL&u77	r   c                       e Zd ZdZy)r   z6
    The model form to use for translated models.
    N)r   r   r   r   r   r   r   r   r   l  s    r   r   )	metaclassc                   2     e Zd ZdZdZ fdZd fd	Z xZS )TranslatableBaseInlineFormSetzI
    The formset base for creating inlines with translatable models.
    Nc                 J    t        |   |fi |}| j                  |_        |S r   )r$   _construct_formr.   )r   ir   formr8   s       r   r   z-TranslatableBaseInlineFormSet._construct_form  s*    w&q3F3!//r   c                 (    t         |   ||      }|S r   )r$   save_new)r   r   commitobjr8   s       r   r   z&TranslatableBaseInlineFormSet.save_new  s    gtV,
r   )T)r   r   r   r   r.   r   r   ri   rj   s   @r   r   r   |  s     M
 r   r   r   )!djangor   django.core.exceptionsr   r   r   django.formsr   django.forms.modelsr   r	   django.utils.functionalr
   django.utils.translationr   #django.utils.translation.trans_realr   parler.modelsr   r   r   BaseModelFormr   ro   rf   rm   r}   r   r   	ModelFormr   r   TranslatableModelFormMixinr   r   r   <module>r      s     X X # E 3 1 N 1 (W 3 3 Wt  $CZ C*a8%7 a8H(u:X $5 $ 7 r   