
    恕f_#                         d dl mZmZ d dlmZmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d
dlmZmZmZ d
dlmZ  G d dej<                        Zej@                  ddddfdZ!y)    )ReferenceField	ListField)BaseDocumentDocumentMetaclassget_document)fields
validators)ormr   )form)FieldPlaceholder)InlineFieldListAjaxSelectFieldAjaxSelectMultipleField)FieldListInputRequired)	iteritems   )ModelFormFieldMongoFileFieldMongoImageField)EmbeddedFormc                   `    e Zd ZdZ fdZd Zd Zd Zd Zd Z	 e
j                  d      d	        Z e
j                  d
      d        Z e
j                  d      d        Z e
j                  d      d        Z e
j                  d      d        Z e
j                  d      d        Z xZS )CustomModelConverterz
        Customized MongoEngine form conversion class.

        Injects various Flask-Admin widgets and handles lists with
        customized InlineFieldList field.
    c                 8    t         t        |           || _        y N)superr   __init__view)selfr   	__class__s     c/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/mongoengine/form.pyr   zCustomModelConverter.__init__   s    "D24	    c                 X    t        | j                  dd       }|r|j                  |      S y )Nform_overrides)getattrr   get)r   namer#   s      r    _get_field_overridez(CustomModelConverter._get_field_override   s,     ,<dC!%%d++r!   c                 n    t        | j                  di       }|j                  |      }|s
t               S |S )N_form_subdocuments)r$   r   r%   r   )r   r&   configps       r    _get_subdocument_configz,CustomModelConverter._get_subdocument_config&   s3    $8"=JJt>!r!   c              #   P   K   |D ]  }t        |t              r| ||f  y wr   )
isinstancetuple)r   choicescs      r    _convert_choicesz%CustomModelConverter._convert_choices/   s-      	A!U#!f		s   $&c                 $    | j                  |      S r   r   )r   r   s     r    clone_converterz$CustomModelConverter.clone_converter6   s    ~~d##r!   c                 v   t        |t              rt        j                  |j                        S t        |dd       t        |dd      g g |j                  d}|r|j                  |       |d   rt        |d         |d<   |j                  rTt        |t              r|d   j                  t                      n]|d   j                  t        j                                n6t        |t              s&|d   j                  t        j                                t!        |      j"                  }|j$                  rt        | j'                  |j$                              |d<   || j(                  v r| j+                  |      |d<   |j-                  dd	      rt/        j0                  di |S t/        j2                  di |S t!        |      j"                  }t5        |d
      r|j7                  ||      S | j9                  |j:                        }|r |di |S || j(                  v r | j(                  |   |||      S y )Nverbose_name	help_text )labeldescriptionr	   filtersdefaultr	   r0   coercemultipleFto_form_field )r.   r   r   recreate_fieldfieldr$   r=   updatelistrequiredr   appendr   r	   InputRequiredOptionaltype__name__r0   r2   
convertersr>   popr   SelectMultipleFieldSelectFieldhasattrr@   r'   r&   )r   modelrC   
field_argskwargsftypeoverrides          r    convertzCustomModelConverter.convert9   s   e-.&&u{{33 UND9"5+r:}}
 MM*%,#'|(<#=F< >>%+|$++,B,DE|$++J,D,D,FGE9-< ''
(;(;(=>U$$== $T%:%:5==%I JF9'#';;u#5x zz*e,11;F;;%%///U$$5/*&&uf55++EJJ7%f%%DOO#)4??5)%?? $r!   DateTimeFieldc                 t    t        j                         |d<   t        j                  j	                  | |||      S )Nwidget)r   DateTimePickerWidgetr
   ModelConverterconv_DateTimer   rQ   rC   rS   s       r    r\   z"CustomModelConverter.conv_DateTimel   s2    446x!!//eUFKKr!   r   c                    |j                   t        d|j                  d|      t        |j                   t              rt        | j                  di       j                  |j                        }|rt        |fi |S t        j                  d      |d<   |j                  dg       j                  t        j                                |j                   j                  }t!        j"                  dd|i|S | j%                  |j                        }| j'                  |      }|j                   j(                  r"d|d	<   |j+                  ||j                   |      S |j+                  ||j                   i       }t-        |fd
di|S )NzListField "z&" must have field specified for model _form_ajax_refsT)r?   rY   r	   rQ   r?   min_entriesr   rA   )rC   
ValueErrorr&   r.   r   r$   r   r%   r   r   Select2Widget
setdefaultrG   r	   rI   document_typemongo_fieldsModelSelectMultipleFieldr,   r5   r0   rV   r   )	r   rQ   rC   rS   loaderdoc_typer   	converterunbound_fields	            r    	conv_ListzCustomModelConverter.conv_Listq   sM   ;;X]XbXbdijkkekk>2TYY(92>BB5::NF.v@@@#114@F8lB/66z7J7J7LM {{00H88RxR6RR ++EJJ7((.	;;!%F:$$UEKK@@!))%bA}F!FvFFr!   EmbeddedDocumentFieldc           	         g |d<   | j                  |j                        }t        j                  t	        |dd       |j
                        }|j                         }|| j                  |      }t        |j                  ||j                  xs t        j                  |j                  |j                  |j                  |j                        }|j                  |      }t!        |j                  ||fd|i|S )Nr	   form_widget_args)widget_args
form_rules)
base_classonlyexcluderR   extra_fields	form_opts)r,   r&   r   FormOptsr$   _form_rulesget_formr5   document_type_objform_base_classBaseFormform_columnsform_excluded_columns	form_argsform_extra_fieldspostprocess_formr   )r   rQ   rC   rS   r   ru   
form_classri   s           r    conv_EmbeddedDocumentz*CustomModelConverter.conv_EmbeddedDocument   s      "|++EJJ7MMgd<NPT.U-1-=-=?	 ]]_
,,T2I!%"9"99-1-A-A-RT]]'+'8'8*.*D*D-1^^/3/E/EGJ ..z:Je55tZgS\g`fggr!   r   c                    |j                    |d<   t        | j                  di       j                  |j                        }|rt        |fi |S t        j                         |d<   t        j                  j                  | |||      S )Nallow_blankr_   rY   )rF   r$   r   r%   r&   r   r   rb   r
   r[   conv_Reference)r   rQ   rC   rS   rg   s        r    r   z#CustomModelConverter.conv_Reference   sx    $)NN 2}$5r:>>uzzJ"64V44--/x!!00ueVLLr!   	FileFieldc                     t        di |S NrA   )r   r]   s       r    	conv_FilezCustomModelConverter.conv_File   s    '''r!   
ImageFieldc                     t        di |S r   )r   r]   s       r    
conv_imagezCustomModelConverter.conv_image   s    (((r!   )rK   
__module____qualname____doc__r   r'   r,   r2   r5   rV   r
   convertsr\   rk   r   r   r   r   __classcell__r4   s   @r    r   r      s    
$1@f S\\/"L #L S\\+G G6 S\\)*h +h. S\\"#	M $	M S\\+( ( S\\,)  )r!   r   Nc                 D    t         t              rt                t         t        t        f      st        d      |xs i }t        d t         j                        D        d       }|rt        |       fdfd|D        }nrfd|D        }i }|D ]/  \  }	}
|j                   |
|j                  |	            }|+|||	<   1 |s-r+t              D ]  \  }	}t        j                  |      ||	<     |d<   t         j                  d	z   |f|      S )
a  
    Create a wtforms Form for a given mongoengine Document schema::

        from flask_mongoengine.wtf import model_form
        from myproject.myapp.schemas import Article
        ArticleForm = model_form(Article)

    :param model:
        A mongoengine Document schema class
    :param base_class:
        Base form class to extend from. Must be a ``wtforms.Form`` subclass.
    :param only:
        An optional iterable with the property names that should be included in
        the form. Only these properties will have fields.
    :param exclude:
        An optional iterable with the property names that should be excluded
        from the form. All other properties will have fields.
    :param field_args:
        An optional dictionary of field names mapping to keyword arguments used
        to construct each field object.
    :param converter:
        A converter to generate the fields based on the model properties. If
        not set, ``ModelConverter`` is used.
    z+Model must be a mongoengine Document schemac              3   *   K   | ]  \  }}||f  y wr   rA   ).0kvs      r    	<genexpr>zget_form.<locals>.<genexpr>   s     EDAq!QEs   c                      | d   j                   S )Nr   )creation_counter)r   s    r    <lambda>zget_form.<locals>.<lambda>   s    ad&;&; r!   )keyc                 x    r| v rt        |          S j                  |       }||S t        dd|       )NzInvalid model property name .)r   r%   ra   )r&   r+   rt   rQ   propss     r    findzget_form.<locals>.find   sD     4'T(:;;		$A}E4PQQr!   c              3   2   K   | ]  }| |      f  y wr   rA   )r   r+   r   s     r    r   zget_form.<locals>.<genexpr>   s     1qq$q'l1s   c              3   2   K   | ]  }|d    vs|  yw)r   NrA   )r   r+   rs   s     r    r   zget_form.<locals>.<genexpr>   s     CAqt7/BaCs   model_classForm)r.   strr   r   r   	TypeErrorsortedr   _fieldsdictrV   r%   r   rB   rJ   rK   )rQ   ri   rq   rr   rs   rR   rt   
properties
field_dictr&   r+   rC   r   r   s   `   ` `     @@r    rx   rx      s.   > %U#el,=>?EFF!rJ EIemm,DE;=J Z 	R 2D1
	CC
 J %a!!%JNN4,@A$Jt% L$\2 	:KD%#2259Jt	: !&J}'*
CCr!   )"mongoenginer   r   mongoengine.baser   r   r   wtformsr   r	   flask_mongoengine.wtfr
   re   flask_adminr   flask_admin.model.formr   flask_admin.model.fieldsr   r   r   flask_admin.form.validatorsr   flask_admin._compatr   r   r   r   subdocr   r[   r   r{   rx   rA   r!   r    <module>r      s`    1 J J & =  3 ^ ^ > ) C C  f)3-- f)T IDr!   