
    恕f%                     d   d dl mZ d dlmZmZmZ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mZ 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 	 d dl m!Z!m"Z" dZ# G d de      Z$ G d de      Z%ejL                  dddddfdZ' G d de      Z(d Z)y# e
$ r	 d dlmZ	 Y w xY w#  dZ#Y PxY w)    )fields)	CharFieldDateTimeField	DateField	TimeFieldPrimaryKeyFieldForeignKeyField)	BaseModel)	ModelBase)ModelConverter
model_form)form)	iteritems
itervalues)InlineFormAdminInlineModelConverterBase)InlineModelFormFieldInlineFieldListAjaxSelectField   )get_primary_keyget_meta_fields)create_ajax_loader)	JSONFieldBinaryJSONFieldTFc                   <     e Zd ZdZeZ	  fdZd Z	 d Zd Z	 xZ
S )InlineModelFormListz6
        Customized inline model form list field.
    c                     || _         || _        || _        || _        t	        |      | _        t        t        | "  | j                  || j
                        fi | y N)
r   modelpropinline_viewr   _pksuperr   __init__form_field_type)selfr   r    r!   r"   kwargs	__class__s         ^/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/peewee/form.pyr%   zInlineModelFormList.__init__%   sS    	
	&"5)!41$2F2FtTXX2VaZ`a    c                 &    |j                         d uS r   )get_pk)r'   fields     r*   display_row_controlsz(InlineModelFormList.display_row_controls.   s    ||~T))r+   c                      y r    )r'   objnames      r*   populate_objz InlineModelFormList.populate_objB   s    r+   c                     t        | j                        }t         j                   j                        } j                  j	                         j                  ||k(        j                         }t         fd|D              } j                  D ]  }|j                         }||v}|s)||   }	 j                  |      r#|	j                  d       B j                         }	|j                  |	d        t        |	 j                  |        j                  j                  ||	|       |	j!                          t#        |j$                  j&                        D ]#  }
|
j(                  dk(  s|
j+                  |	       %  y )Nc              3   `   K   | ]%  }t        t        |j                              |f ' y wr   )strgetattrr#   ).0vr'   s     r*   	<genexpr>z3InlineModelFormList.save_related.<locals>.<genexpr>K   s&     Es71dhh/0!4Es   +.T)	recursiver   )r8   r#   r    r!   selectwhereexecutedictentriesr-   should_deletedelete_instancer4   setattrr"   _on_model_changesaver   r   _fieldstypesave_related)r'   r2   model_idattrvaluespk_mapr.   field_id
is_createdr    fs   `          r*   rI   z InlineModelFormList.save_relatedE   sB   3)tzz499-""$**48+;<DDFEfEE \\ 	*E||~H!/Jx(%%e,))D)9

ud+ E499h/--eUJGJJL  

 2 23 *6622NN5)*/	*r+   )__name__
__module____qualname____doc__r   r&   r%   r/   r4   rI   __classcell__r)   s   @r*   r   r      s.     +Ob*""*r+   r   c                   H     e Zd Zd fd	Z fdZd Zd Zd Zd Zd Z	 xZ
S )	CustomModelConverterc                 $   t         t        |   |       || _        t        j
                  | j                  t        <   | j                  | j                  t        <   | j                  | j                  t        <   | j                  | j                  t        <   | j                  | j                  t         <   t"        r:| j$                  | j                  t&        <   | j$                  | j                  t(        <   t+        | j                  dd       xs i | _        y )Nform_overrides)r$   rX   r%   viewr   StringFielddefaultsr   	handle_pk
convertersr   handle_datetimer   handle_dater   handle_timer   pg_exthandle_jsonr   r   r8   	overrides)r'   r[   
additionalr)   s      r*   r%   zCustomModelConverter.__init__k   s    "D2:>	 $*#5#5i +/>>()-)=)=&%)%5%5	"%)%5%5	")-)9)9DOOI&/3/?/?DOOO, ,<dCIrr+   c                     t        | j                  di       j                  |j                        }|r)|j                  rd|d<   |j                  t        |fi |fS t        t        | "  ||fi |S )N_form_ajax_refsTallow_blank)	r8   r[   getr3   nullr   r$   rX   handle_foreign_key)r'   r    r.   r(   loaderr)   s        r*   rl   z'CustomModelConverter.handle_foreign_key}   sm    $5r:>>uzzJzz(,}%::v@@@@)4CE5[TZ[[r+   c                 N    g |d<   |j                   t        j                  di |fS )N
validatorsr1   )r3   r   HiddenFieldr'   r    r.   r(   s       r*   r^   zCustomModelConverter.handle_pk   s)    !|zz6--7777r+   c                 r    t        j                         |d<   |j                  t        j                  di |fS Nwidgetr1   )r   DatePickerWidgetr3   r   r   rq   s       r*   ra   z CustomModelConverter.handle_date   s2    002xzz6++5f555r+   c                 r    t        j                         |d<   |j                  t        j                  di |fS rs   )r   DateTimePickerWidgetr3   r   r   rq   s       r*   r`   z$CustomModelConverter.handle_datetime   s2    446xzz6//9&999r+   c                 D    |j                   t        j                  di |fS Nr1   )r3   r   r   rq   s       r*   rb   z CustomModelConverter.handle_time       zz4>>3F333r+   c                 D    |j                   t        j                  di |fS ry   )r3   r   r   rq   s       r*   rd   z CustomModelConverter.handle_json   rz   r+   r   )rQ   rR   rS   r%   rl   r^   ra   r`   rb   rd   rU   rV   s   @r*   rX   rX   j   s(    J$	\86:44r+   rX   Nc           	          t        | ||||||      }|r3t        |      D ]%  \  }	}
t        ||	t        j                  |
             ' |S )zU
        Create form from peewee model and contribute extra fields, if necessary
    
base_classonlyexclude
field_argsallow_pk	converter)r   r   rD   r   recreate_field)r    r   r~   r   r   r   r   extra_fieldsresultr3   r.   s              r*   get_formr      s]     #-! '#-!)"+-F $\2 	>KD%FD$"5"5e"<=	> Mr+   c                   4     e Zd ZdZeZ	  fdZd Zd Z xZ	S )InlineModelConverterz'
        Inline model form helper.
    c                 |   t         t        |   |      }|t        |t              rt        |      }nst        |dd       }|t        dt        |      z        t               }t        |      D ])  }|j                  d      r|dk7  st        ||      ||<   + t        |fi |}| j                  |      |_        |S )Nr    zUnknown inline model admin: %s_)r$   r   get_info
isinstancer
   r   r8   	Exceptionreprr@   dir
startswithprocess_ajax_refsrh   )r'   pinfor    attrsrK   r)   s         r*   r   zInlineModelConverter.get_info   s    )49!<<!Y'&q)7D1=#$DtAw$NOOF 7D??3/DGO&-a&6d7 'u66  $55d;r+   c                 B   t        |dd       }i }|rt        |      D ]  \  }}|j                  j                  j	                         d|}d }t        |t        t        f      rt        |j                  |||      }n|}|||<   || j                  j                  |<    |S )Nform_ajax_refs.)r8   r   r    rQ   lowerr   listtupler   r[   rh   )r'   r   refsr   r3   optsnew_namerm   s           r*   r   z&InlineModelConverter.process_ajax_refs   s    t-t4'o 
=
d&*jj&9&9&?&?&A4HdT5M2/

HdDQF!F%t6<		))(3
= r+   c                    d }| j                  |      }t        |j                        D ]*  }t        |      }|t        k(  s|j
                  |k(  s(|} n t        d|j                  z        |j                  g}	|j                  r|	|j                  z   }
n|	}
|j                         }|>t        |j                  t        j                  |j                  |
|j                  d|      }	 |j                  }| j%                  ||      }t'        ||| j)                  ||j                  |j                  ||xs |j                  j*                               |S # t         $ r |j"                  }Y xw xY w)Nz)Cannot find reverse relation for model %sTr}   )label)r   r   r    rH   r	   	rel_modelr   r3   form_excluded_columnsr   r   r   BaseFormform_columns	form_argsrelated_nameAttributeErrorbackref	get_labelrD   inline_field_list_typerQ   )r'   r   r    
form_classinline_modelreverse_fieldr   r.   
field_typeignorer   
child_form	prop_namer   s                 r*   
contributezInlineModelConverter.contribute   sk   }}\*$TZZ0 	VEeJ_,??e+$)M	V G$**TUU  $$%%%t999GG ]]_
#DJJ/3}})-):):,3/3~~-1.79J	.%22I tY/
++J,0JJ,9,>,>,0272N4::;N;N	 , P	Q   	.%--I	.s   *E E/.E/)
rQ   rR   rS   rT   r   r   r   r   r   rU   rV   s   @r*   r   r      s$     10(3r+   r   c                 z    t        | j                        D ]#  }|j                  dk(  s|j                  |       % y )Nr   )r   rG   rH   rI   )r   r    rP   s      r*   save_inliner   #  s3    % "66**NN5!"r+   )*wtformsr   peeweer   r   r   r   r   r	   r
   ImportErrorr   wtfpeewee.ormr   r   flask_adminr   flask_admin._compatr   r   flask_admin.model.formr   r   flask_admin.model.fieldsr   r   r   toolsr   r   ajaxr   playhouse.postgres_extr   r   rc   r   rX   r   r   r   r   r1   r+   r*   <module>r      s    6 6.  5  5 L [ [ 3 $AF
L*/ L*^.4> .4d 2l3 l^"w  .-.Fs   B 
B) B&%B&)B/