
    恕fHG                         d dl 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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mZ d
dlmZmZm Z  d
dl!m"Z"  e jF                  d      Z$ G d de
      Z%y)    N)flash)string_types)gettextngettextlazy_gettext)BaseModelView)create_editable_list_form)JOINPrimaryKeyFieldForeignKeyFieldField	CharField	TextField)action)filters   )get_formCustomModelConverterInlineModelConvertersave_inline)get_meta_fieldsget_primary_keyparse_like_term)create_ajax_loaderzflask-admin.peeweec                   0    e Zd ZdZ	 eZ	 eZ	  ej                         Z
	 dZ	 dZ	 	 	 	 d fd	ZddZd Zd Zd Zd Zd	 Zd
 Zd Zd Zd dZd Zd Zd Zd Zd Zd Z	 d!dZd Zd Z d Z!d Z" fdZ# e$d e%d       e%d            d        Z& xZ'S )"	ModelViewNFc
                 v    g | _         t        t        |   |||||||||		       | j	                         | _        y )N)menu_class_namemenu_icon_typemenu_icon_value)_search_fieldssuperr   __init__scaffold_pk_primary_key)selfmodelnamecategoryendpointurlstatic_folderr   r   r    	__class__s             ^/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/peewee/view.pyr#   zModelView.__init__   sJ     !i'tXxm8G7E8G 	( 	I
 !,,.    c                 B    || j                   }d t        |      D        S )Nc              3   8   K   | ]  }|j                   |f  y wN)r(   ).0fields     r.   	<genexpr>z.ModelView._get_model_fields.<locals>.<genexpr>   s!      1 ZZ1s   )r'   r   )r&   r'   s     r.   _get_model_fieldszModelView._get_model_fields   s'    =JJE1(/1 	1r/   c                 ,    t        | j                        S r2   )r   r'   r&   s    r.   r$   zModelView.scaffold_pk   s    tzz**r/   c                    | j                   j                  j                  rNt        | j                   j                  j                  j
                  D cg c]  }|j                  |    c}      S t        || j                        S c c}w r2   )	r'   _metacomposite_keytupleprimary_keyfield_names_datagetattrr%   )r&   r'   
field_names      r.   get_pk_valuezModelView.get_pk_value   sv    ::))"&**"2"2">">"J"JL J'L M M ud//00Ls   Bc                     g }| j                         D ]R  \  }}t        |      }|t        k(  r|j                  |       ,| j                  s
|t
        k7  sB|j                  |       T |S r2   )r6   typer   appendcolumn_display_pkr   )r&   columnsnffield_classs        r.   scaffold_list_columnszModelView.scaffold_list_columns   sc    **, 	"DAqq'Ko-q!'';/+Iq!	" r/   c                     t               }| j                         D ])  \  }}| j                  st        |      t        k7  s%|||<   + |S r2   )dictr6   rF   rD   r   )r&   rG   rH   rI   s       r.   scaffold_sortable_columnsz#ModelView.scaffold_sortable_columns   sI    &**, 	DAq%%aO)C
	 r/   c                 6   | j                   ry| j                   D ]j  }t        |t              rt        | j                  |      }t        |t
        t        f      st        dd|z  z         | j                  j                  |       l t        | j                        S )Nz!Can only search on text columns. zFailed to setup search for "%s")column_searchable_list
isinstancer   r@   r'   r   r   	Exceptionr!   rE   bool)r&   ps     r.   init_searchzModelView.init_search   s    &&00 	.a.

A.A "!i%;<#$G$E$I%J K K ##**1-	. D''((r/   c                 >   t        |t              rt        | j                  |d       }n|}|t	        d|z        d }	 |j
                  }|| j                  k7  r:| j                  |j                        d| j                  |j                        }n=t        |t              s| j                  |j                        }n| j                  |      }t        |      j                  }| j                  j                  |||      }|S # t        $ r |j                  }Y w xY w)Nz#Failed to find field for filter: %sz / )rQ   r   r@   r'   rR   model_classAttributeErrorget_column_name__name__r(   rD   filter_converterconvert)r&   r(   attrrW   visible_name	type_nameflts          r.   scaffold_filterszModelView.scaffold_filters   s
   dL)4::tT2DD<ADHII 	%**K $**$(,(<(<[=Q=Q(R(,(<(<TYY(GIL dL1#33DII>#33D9J''	##++I,0,8: 
#  	%**K	%s   D DDc                 6    t        |t        j                        S r2   )rQ   r   BasePeeweeFilter)r&   filters     r.   is_valid_filterzModelView.is_valid_filter  s    &'":":;;r/   c                 "   t        | j                  | j                  |       | j                  | j                  | j
                  | j                  t        | j                        | j                        }| j                  r| j                  |      }|S )N)
base_classonlyexclude
field_argsallow_pkextra_fields)r   r'   model_form_converterform_base_classform_columnsform_excluded_columns	form_argsrS   form_extra_fieldsinline_modelsscaffold_inline_form_models)r&   
form_classs     r.   scaffold_formzModelView.scaffold_form
  s|    djj$*C*CD*I)-)=)=#'#4#4&*&@&@)-
 (,D,=,='>+/+A+A
C
 99*EJr/   c                     t        | j                  | j                  |       | j                  | j                  |      }t        | j                  ||      S )ah  
            Create form for the `index_view` using only the columns from
            `self.column_editable_list`.

            :param widget:
                WTForms widget class. Defaults to `XEditableWidget`.
            :param validators:
                `form_args` dict with only validators
                {'name': {'validators': [required()]}}
        )rg   rh   rj   )r   r'   rm   rn   column_editable_listr	   )r&   widget
validatorsru   s       r.   scaffold_list_formzModelView.scaffold_list_form  sR     djj$*C*CD*I)-)=)=#'#<#<)35

 ))=)=z)/1 	1r/   c                     | j                  |       }| j                  |       }| j                  D ]   }|j                  || j                  ||      }" |S r2   )rm   inline_model_form_converterrs   
contributer'   )r&   ru   	converterinline_converterms        r.   rt   z%ModelView.scaffold_inline_form_models/  s_    --d3	;;DA## 	8A)44Y59ZZ5?568J	8 r/   c                 2    t        | j                  |||      S r2   )r   r'   )r&   r(   optionss      r.   _create_ajax_loaderzModelView._create_ajax_loader<  s    !$**dD'BBr/   c                     d }	 |j                   }|| j                  k7  rA|j                  }||vr1|j	                  |t
        j                        }|j                  |       |S # t        $ r |j                  }Y iw xY wr2   )rW   rX   r'   rZ   joinr
   
LEFT_OUTERadd)r&   queryr4   joinsrW   
model_names         r.   _handle_joinzModelView._handle_join?  sw    	&++K $**$$--J&

;@		*%  	&++K	&s   A" "A:9A:c                     g }|D ].  \  }}| j                  ||||      \  }}}|j                  |       0  |j                  | }||fS r2   )_sort_clauserE   order_by)r&   r   r   orderclauses
sort_field	sort_descclauses           r.   	_order_byzModelView._order_byM  sc    %* 	#!J	#'#4#4uj)$5 E5&NN6"	# (e|r/   c                 Z   t        |t              rt        | j                  |      }nCt        |t              r3d }	 |j
                  }|| j                  k7  r| j                  |||      }|}|rj                         nj                         }|||fS # t        $ r |j                  }Y bw xY wr2   )
rQ   r   r@   r'   r   rW   rX   r   descasc)r&   r   r   r   r   r4   rW   r   s           r.   r   zModelView._sort_clauseV  s    j,/DJJ
3E
E*K/(44 djj())%UCE!*		eV## " /(../s   B B*)B*c                 6    | j                   j                         S r2   )r'   selectr8   s    r.   	get_queryzModelView.get_querye  s    zz  ""r/   c                    | j                         }t               }	| j                  rn|rl|j                  d      }
|
D ]V  }|st	        |      }d}| j
                  D ]$  }| j                  |||	      }||z  }||} ||z  }& |j                  |      }X | j                  rX|D ]S  \  }}}| j                  |   }| j                  ||j                  |	      }|j                  ||j                  |            }U | j                  s|j                         nd}|+| j                  |   }||fg}| j                  ||	|      \  }}	n(| j!                         }|r| j                  ||	|      \  }}	|| j"                  }|r|j%                  |      }|r|r|j'                  ||z        }|rt)        |j+                               }||fS )a  
            Return records from the database.

            :param page:
                Page number
            :param sort_column:
                Sort column name
            :param sort_desc:
                Descending or ascending sort
            :param search:
                Search query
            :param filters:
                List of filter tuples
            :param execute:
                Execute query immediately? Default is `True`
            :param page_size:
                Number of results. Defaults to ModelView's page_size. Can be
                overriden to change the page_size limit. Removing the page_size
                limit requires setting page_size to 0 or False.
         N)r   set_search_supportedsplitr   r!   r   where_filterscolumnapplycleansimple_list_pagercount_sortable_columnsr   _get_default_order	page_sizelimitoffsetlistexecute)r&   pagesort_columnr   searchr   r   r   r   r   valuesvaluetermstmtr4   qr`   flt_namerI   r   r   r   s                         r.   get_listzModelView.get_listh  s   .   !!f\\#&F *&u-!00 "E --eUEBEA| 	" D)#*( ==(/ 7$XuMM#&))%5Aqwwu~6	7 &*%;%; "//<J ),-E>>%>LE5++-E#~~eUEBu IKK	*EILL	!12E)Ee|r/   c           
      @   | j                   j                  j                  rW | j                   j                  di t	        t        | j                   j                  j                  j                  |            S  | j                   j                  di | j                  |iS )N )	r'   r:   r;   getrM   zipr=   r>   r%   )r&   ids     r.   get_onezModelView.get_one  ss    ::))!4::>>\DTZZ-=-=-I-I-U-UWY)Z$[\\tzz~~8!2!2B 788r/   c           	         	 | j                         }|j                  |       | j                  ||d       |j                  d       t	        ||       | j                  ||d       |S # t        $ rP}| j                  |      s5t        t        dt        |            d       t        j                  d       Y d }~yd }~ww xY w)NT)force_insertz"Failed to create record. %(error)serrorr   zFailed to create record.F)r'   populate_obj_on_model_changesaver   after_model_changerR   handle_view_exceptionr   r   strlog	exceptionr&   formr'   exs       r.   create_modelzModelView.create_model  s    	7JJLEe$!!$t4JJDJ) e$ ##D%6  	--b1gB#b'RT[\89	s   AA) )	C2AB==Cc           	      d   	 |j                  |       | j                  ||d       |j                          t        ||       | j	                  ||d       y# t
        $ rP}| j                  |      s5t        t        dt        |            d       t        j                  d       Y d }~yd }~ww xY w)NFz"Failed to update record. %(error)sr   r   zFailed to update record.T)r   r   r   r   r   rR   r   r   r   r   r   r   r   s       r.   update_modelzModelView.update_model  s    	8e$!!$u5JJL e$ ##D%7  	--b1gB#b'RT[\89	s   A A 	B/AB**B/c           	      &   	 | j                  |       |j                  d       | j                  |       y# t        $ rP}| j	                  |      s5t        t        dt        |            d       t        j                  d       Y d }~yd }~ww xY w)NT	recursivez"Failed to delete record. %(error)sr   r   zFailed to delete record.F)
on_model_deletedelete_instanceafter_model_deleterR   r   r   r   r   r   r   )r&   r'   r   s      r.   delete_modelzModelView.delete_model  s    
	+  '!!D!1 ##E*  	--b1gB#b'RT[\89	s   #7 	B ABBc                 N    |dk(  r| j                   syt        t        |   |      S )NdeleteF)
can_deleter"   r   is_action_allowed)r&   r(   r-   s     r.   r   zModelView.is_action_allowed  s&    8DOOY7==r/   r   Deletez1Are you sure you want to delete selected records?c           	      X   	 t        | j                  | j                        }| j                  r;| j                  j	                         j                  ||z        j                         }n]d}| j                  j                         j                  ||z        }|D ]*  }| j                  |       |j                  d       |dz  }, t        t        dd||      d       y # t        $ r@}| j                  |      s%t        t        d	t!        |      
      d       Y d }~y Y d }~y d }~ww xY w)Nr   Tr   r   z Record was successfully deleted.z,%(count)s records were successfully deleted.)r   successz#Failed to delete records. %(error)sr   r   )r@   r'   r%   fast_mass_deleter   r   r   r   rd   r   r   r   r   rR   r   r   r   )r&   idsmodel_pkr   r   r   r   s          r.   action_deletezModelView.action_delete  s   	^tzz4+<+<=H$$

))+11(c/BJJL

))+228s?C A((+%%%5QJE
 (=I !&( *34  	^--b1gC3r7SU\]] 2	^s   CC   	D))1D$$D))NNNNNNNNr2   )NN)TN)(rZ   
__module____qualname__column_filtersr   rm   r   r}   r   FilterConverterr[   r   rs   r#   r6   r$   rB   rK   rN   rU   ra   re   rv   r{   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r-   s   @r.   r   r      s   N)V 0 #7 /w..0 	 M-^ $(GKLP
/1+1)@<$1&
C$# *.Tl9
(& > H"LMO^O^r/   r   )&loggingflaskr   flask_admin._compatr   flask_admin.babelr   r   r   flask_admin.modelr   flask_admin.model.formr	   peeweer
   r   r   r   r   r   flask_admin.actionsr   flask_admin.contrib.peeweer   r   r   r   r   r   toolsr   r   r   ajaxr   	getLoggerr   r   r   r/   r.   <module>r      sZ      , = = + < V V & . S S D D $ g,-C^ C^r/   