
    恕f5                         d dl Z d dl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dlmZ d	 Zdd
Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    N)BaseFormrules)	iteritems)HiddenField)UnboundField)InputRequired   )XEditableWidgetc                        fd}|S )Nc                 (    t              | _        | S N)	frozenset_converter_for)funcargss    U/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/model/form.py_innerzconverts.<locals>._inner   s    'o     )r   r   s   ` r   convertsr      s     Mr   c                     |
t               } G d d|       }t        |j                        D ]B  \  }}t        |t              s||j
                  d<   t        |||       |dk(  s9t        d       |S )a  
        Create a form class with all the fields wrapped in a FieldList.

        Wrapping each field in FieldList allows submitting POST requests
        in this format: ('<field_name>-<primary_key>', '<value>')

        Used in the editable list view.

        :param form_base_class:
            WTForms form class, by default `form_base_class` from base.
        :param form_class:
            WTForms form class generated by `form.get_form`.
        :param widget:
            WTForms widget class. Defaults to `XEditableWidget`.
    c                   *    e Zd Z e e       g      Zy)+create_editable_list_form.<locals>.ListForm)
validatorsN)__name__
__module____qualname__r   r   list_form_pkr   r   r   ListFormr   '   s    "}.?@r   r   widgetr   z'Form already has a list_form_pk column.)r
   r   __dict__
isinstancer   kwargssetattr	Exception)form_base_class
form_classr    r   nameobjs         r   create_editable_list_formr*      s      ~ "A? A z223 K	cc<(#)CJJx HdC(~% IJJK Or   c                   6    e Zd ZdZg dZd Zd Zd Zd Zd Z	y)	InlineBaseFormAdminz
        Settings for inline form administration.

        You can use this class to customize displayed form.
        For example::

            class MyUserInfoForm(InlineBaseFormAdmin):
                form_columns = ('name', 'email')
    )r&   form_columnsform_excluded_columns	form_argsform_extra_fieldsc                     | j                   D ]  }t        | |      rt        | |d        t        |      D ]  \  }}t        | ||        t	        | dd      }|rt        j                  | |      | _        yd| _        y)z`
            Constructor

            :param kwargs:
                Additional options
        N
form_rules)	_defaultshasattrr$   r   getattrr   RuleSet_form_rules)selfr#   kvr2   s        r   __init__zInlineBaseFormAdmin.__init__B   s      	'A4#a&	' f% 	 DAqD!Q	  T<6
$}}T:>D#Dr   c                      y)z
            If you want to use completely custom form for inline field, you can override
            Flask-Admin form generation logic by overriding this method and returning your form.
        Nr   )r8   s    r   get_formzInlineBaseFormAdmin.get_formX   s    
 r   c                     |S )a  
            Post process form. Use this to contribute fields.

            For example::

                class MyInlineForm(InlineFormAdmin):
                    def postprocess_form(self, form):
                        form.value = StringField('value')
                        return form

                class MyAdmin(ModelView):
                    inline_models = (MyInlineForm(ValueModel),)
        r   )r8   r'   s     r   postprocess_formz$InlineBaseFormAdmin.postprocess_form_   s
     r   c                      y)a  
            Called when inline model is about to be saved.

            :param form:
                Inline form
            :param model:
                Model
            :param is_created:
                Will be set to True if the model is being created, False if edited
        Nr   )r8   formmodel
is_createds       r   on_model_changez#InlineBaseFormAdmin.on_model_changeo   s     	r   c                     	 | j                  |||       y# t        $ r9 d| j                  z  }t        j                  |       | j                  ||       Y yw xY w)z+
            Compatibility helper.
        zT%s.on_model_change() now accepts third parameter is_created. Please update your codeN)rD   	TypeErrorrB   warningswarn)r8   rA   rB   rC   msgs        r   _on_model_changez$InlineBaseFormAdmin._on_model_change|   sY    	.  uj9 	.CFJjjQCMM#  u-	.s    ?AAN)
r   r   r   __doc__r3   r;   r=   r?   rD   rJ   r   r   r   r,   r,   6   s(     oI$, .r   r,   c                   "     e Zd ZdZ fdZ xZS )InlineFormAdminz
        Settings for inline form administration. Used by relational backends (SQLAlchemy, Peewee), where model
        class can not be inherited from the parent model definition.
    c                 :    || _         t        t        |   di | y)zX
            Constructor

            :param model:
                Model class
        Nr   )rB   superrM   r;   )r8   rB   r#   	__class__s      r   r;   zInlineFormAdmin.__init__   s     
ot-77r   )r   r   r   rK   r;   __classcell__)rP   s   @r   rM   rM      s    	8 	8r   rM   c                   *    e Zd ZddZd ZedddfdZy)ModelConverterBaseNc                     || _         |si }t        |       D ]1  }t        | |      }t        |d      s|j                  D ]  }|||<   	 3 || _        y )Nr   )use_mrodirr5   r4   r   
converters)r8   rW   rU   r(   r)   	classnames         r   r;   zModelConverterBase.__init__   sc    JI 	0D$%Cs,-!$!3!3 0I,/Jy)0	0 %r   c                    | j                   r)t        j                  t        |j                              }nt        |j                        g}|D ]<  }|j                  d|j
                  }|| j                  v s-| j                  |   c S  |D ]5  }|j
                  | j                  v s| j                  |j
                     c S  y )N.)rU   inspectgetmrotyper   r   rW   )r8   columntypescol_typetype_strings        r   get_converterz ModelConverterBase.get_converter   s    <<NN4#45E&++&'E  	4H%-%8%8(:K:KLKdoo-{33		4  	:H  DOO3x'8'899	: r   c                     t               r   )NotImplementedError)r8   rB   
base_classonlyexclude
field_argss         r   r=   zModelConverterBase.get_form   s     "##r   )NT)r   r   r   r;   rb   r   r=   r   r   r   rS   rS      s    %( *2D $r   rS   c                   "    e Zd ZeZd Zd Zd Zy)InlineModelConverterBasec                     || _         y)z[
            Base constructor

            :param view:
                View class
        N)view)r8   rl   s     r   r;   z!InlineModelConverterBase.__init__   s     	r   c                 j    t        |dd      }|r|S t        | j                  dd      }|r	||v r||   S y)z
            Get inline model field label

            :param info:
                Inline model info
            :param name:
                Field name
        
form_labelNcolumn_labels)r5   rl   )r8   infor(   	form_namero   s        r   	get_labelz"InlineModelConverterBase.get_label   sE     D,5			?DAT]2 &&r   c                     t        |t              r | j                  |d   fi |d   S t        || j                        r|S y)aI  
            Figure out InlineFormAdmin information.

            :param p:
                Inline model. Can be one of:

                 - ``tuple``, first value is related model instance,
                 second is dictionary with options
                 - ``InlineFormAdmin`` instance
                 - Model class
        r   r	   N)r"   tupleform_admin_class)r8   ps     r   get_infoz!InlineModelConverterBase.get_info   sF     a(4((161664001Hr   N)r   r   r   rM   ru   r;   rr   rw   r   r   r   rj   rj      s    &(r   rj   c                       e Zd ZdZd Zy)FieldPlaceholderz5
        Field placeholder for model convertors.
    c                     || _         y r   )field)r8   r{   s     r   r;   zFieldPlaceholder.__init__   s	    
r   N)r   r   r   rK   r;   r   r   r   ry   ry      s    r   ry   r   )r[   rG   flask_admin.formr   r   flask_admin._compatr   wtforms.fieldsr   wtforms.fields.corer   wtforms.validatorsr   widgetsr
   r   r*   objectr,   rM   rS   rj   ry   r   r   r   <module>r      sj      , ) & , , $DQ.& Q.h8) 8"&$ &$R1v 1hv r   