
    恕fw-                         d dl Z d dl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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  e j0                  d      Z G d de      Zy)    N)ObjectId)	InvalidId)flash)string_types)gettextngettextlazy_gettext)BaseModelView)action)get_form_data   )BasePyMongoFilter)parse_like_termzflask-admin.pymongoc                        e Zd ZdZdZ	 	 	 d fd	Zd Z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 fdZ ed ed       ed            d        Z xZS )	ModelViewz,
        MongoEngine model scaffolding.
    Nc	           
          g | _         || j                  |j                        }|d|j                  z  j                         }t        t
        |   d|||||||       || _        y)a  
            Constructor

            :param coll:
                MongoDB collection object
            :param name:
                Display name
            :param category:
                Display category
            :param endpoint:
                Endpoint
            :param url:
                Custom URL
            :param menu_class_name:
                Optional class name for the menu item.
            :param menu_icon_type:
                Optional icon. Possible icon types:

                 - `flask_admin.consts.ICON_TYPE_GLYPH` - Bootstrap glyph icon
                 - `flask_admin.consts.ICON_TYPE_FONT_AWESOME` - Font Awesome icon
                 - `flask_admin.consts.ICON_TYPE_IMAGE` - Image relative to Flask static directory
                 - `flask_admin.consts.ICON_TYPE_IMAGE_URL` - Image with full URL
            :param menu_icon_value:
                Icon glyph name or URL, depending on `menu_icon_type` setting
        Nz%sview)menu_class_namemenu_icon_typemenu_icon_value)_search_fields_prettify_namenamelowersuperr   __init__coll)
selfr   r   categoryendpointurlr   r   r   	__class__s
            _/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/pymongo/view.pyr   zModelView.__init__B   st    8 !<&&tyy1D 499,335Hi'dHh8G7E8G 	( 	I
 	    c                      y)N_id r   s    r"   scaffold_pkzModelView.scaffold_pkm   s    r#   c                 $    |j                  d      S )z
            Return primary key value from the model instance

            :param model:
                Model instance
        r%   get)r   models     r"   get_pk_valuezModelView.get_pk_valuep   s     yyr#   c                     t               )z+
            Scaffold list columns
        NotImplementedErrorr'   s    r"   scaffold_list_columnszModelView.scaffold_list_columnsy   s     "##r#   c                     g S )zF
            Return sortable columns dictionary (name, field)
        r&   r'   s    r"   scaffold_sortable_columnsz#ModelView.scaffold_sortable_columns   s	     	r#   c                     | j                   rG| j                   D ]8  }t        |t              st        d      | j                  j                  |       : t        | j                        S )z!
            Init search
        zExpected string)column_searchable_list
isinstancer   
ValueErrorr   appendbool)r   ps     r"   init_searchzModelView.init_search   sa     &&00 .!!\2$%677 ##**1-. D''((r#   c                     t               )z
            Return filter object(s) for the field

            :param name:
                Either field name or field instance
        r/   )r   attrs     r"   scaffold_filterszModelView.scaffold_filters   s     "##r#   c                 "    t        |t              S )zz
            Validate if it is valid MongoEngine filter

            :param filter:
                Filter object
        )r6   r   )r   filters     r"   is_valid_filterzModelView.is_valid_filter   s     &"344r#   c                     t               Nr/   r'   s    r"   scaffold_formzModelView.scaffold_form   s    !##r#   c                 $    |j                  |      S )z@
            Get unformatted field value from the model
        r*   )r   r,   r   s      r"   _get_field_valuezModelView._get_field_value   s     yyr#   c                 d   |j                  d      }g }|D ]q  }|st        |      }g }| j                  D ]  }|j                  |d|ii        |s<t	        |      dk(  r|j                  |d          _|j                  d|i       s |r$t	        |      dk(  r|d   }	nd|i}	|rd||	gi}|S |	}|S )N z$regexr   r   z$or$and)splitr   r   r8   len)
r   querysearch_termvaluesqueriesvalueregexstmtfieldfinals
             r"   _searchzModelView._search   s    ""3'  	2E#E*ED,, 8UXu$5678 t9>NN47+NNE4=1	2" 7|q 
)%0  r#   c                    i }| j                   rXg }	|D ]6  \  }
}}| j                   |
   }|j                  |	|j                  |            }	8 |	rt        |	      dk(  r|	d   }n|	|d<   | j                  r|r| j                  ||      }| j                  s| j                  j                  |      nd}d}|r&||rt        j                  nt        j                  fg}nH| j                         }|r6|D cg c])  \  }}||rt        j                  nt        j                  f+ }}}|| j                  }d}|r|r||z  }| j                  j                  ||||      }|rt        |      }||fS c c}}w )a  
            Get list of objects from MongoEngine

            :param page:
                Page number
            :param sort_column:
                Sort column
            :param sort_desc:
                Sort descending
            :param search:
                Search criteria
            :param filters:
                List of applied fiters
            :param execute:
                Run query immediately or not
            :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.
        r   r   rI   N)sortskiplimit)_filtersapplycleanrK   _search_supportedrU   simple_list_pagerr   count_documentspymongo
DESCENDING	ASCENDING_get_default_order	page_sizefindlist)r   pagesort_column	sort_descsearchfiltersexecuterd   rL   datafltflt_namerP   fcountsort_byordercoldescrX   resultss                        r"   get_listzModelView.get_list   s{   ,  ==D(/ 5$XuMM#&wwtQWWU^45 t9> GE$(E&M !!fLL/E 9=8N8N		))%0TX #9W%7%7'J[J[\]G++-E.35*T  t!3!3ARARS 5 5 II)#D))..W4y.Q7mGg~#5s   1.E+c                 <    	 t        |      S # t        $ r |cY S w xY wrC   )r   r   r   ids     r"   _get_valid_idzModelView._get_valid_id  s%    	B< 	I	s   
 c                 Z    | j                   j                  d| j                  |      i      S )zi
            Return single model instance by ID

            :param id:
                Model ID
        r%   )r   find_oner{   ry   s     r"   get_onezModelView.get_one"  s)     yy!!5$*<*<R*@"ABBr#   c                 8     | j                   t               fi |S )z@
            Create edit form from the MongoDB document
        )_edit_form_classr   )r   objs     r"   	edit_formzModelView.edit_form+  s     %t$$]_<<<r#   c           	      8   	 |j                   }| j                  ||d       | j                  j                  |       | j	                  ||d       |S # t
        $ r?}t        t        dt        |            d       t        j                  d       Y d}~yd}~ww xY w)za
            Create model helper

            :param form:
                Form instance
        Tz"Failed to create record. %(error)serrorr   zFailed to create record.NF)rm   _on_model_changer   
insert_oneafter_model_change	Exceptionr   r   strlog	exception)r   formr,   exs       r"   create_modelzModelView.create_model1  s    
	7IIE!!$t4II  ' ##D%6  	'>c"gNMM45		s   :A 	B5BBc           	      |   	 |j                  |j                         | j                  ||d       | j                  |      }| j                  j                  d|i|       | j                  ||d       y# t        $ r?}t        t        dt        |            d       t        j                  d       Y d}~yd}~ww xY w)	z
            Update model helper

            :param form:
                Form instance
            :param model:
                Model instance to update
        Fr%   z"Failed to update record. %(error)sr   r   zFailed to update record.NT)updaterm   r   r-   r   replace_oner   r   r   r   r   r   r   )r   r   r,   pkr   s        r"   update_modelzModelView.update_modelF  s    	8LL#!!$u5""5)BII!!5"+u5 ##D%7  	'>c"gNMM45		s   AA3 3	B;<5B66B;c           	      V   	 | j                  |      }|st        d      | j                  |       | j                  j	                  d|i       | j                  |       y	# t        $ r?}t        t        dt        |            d       t        j                  d       Y d}~yd}~ww xY w)
zc
            Delete model helper

            :param model:
                Model instance
        zDocument does not have _idr%   z"Failed to delete record. %(error)sr   r   zFailed to delete record.NFT)r-   r7   on_model_deleter   
delete_oneafter_model_deleter   r   r   r   r   r   )r   r,   r   r   s       r"   delete_modelzModelView.delete_model_  s    	+""5)B !=>>  'II  %- ##E*  	'>c"gNMM45		s   AA   	B()5B##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_allowedy  s&    8DOOY7==r#   r   Deletez1Are you sure you want to delete selected records?c           	         	 d}|D ](  }| j                  | j                  |            s$|dz  }* t        t        dd||      d       y # t        $ r*}t        t        dt        |            d	       Y d }~y d }~ww xY w)
Nr   r   z Record was successfully deleted.z,%(count)s records were successfully deleted.)rq   successz#Failed to delete records. %(error)sr   r   )r   r~   r   r   r   r   r   )r   idsrq   r   r   s        r"   action_deletezModelView.action_delete  s    	ZE  $$T\\"%56QJE (=I !&( *34  	Z'?s2wOQXYY	Zs   'A  A 	A> A99A>)NNNNNNN)TN)__name__
__module____qualname____doc__column_filtersr   r(   r-   r1   r3   r;   r>   rA   rD   rF   rU   rw   r{   r~   r   r   r   r   r   r   r	   r   __classcell__)r!   s   @r"   r   r      s     N$N ?CLP)V $)$5$"J *.GRC=*24> H"LMOZOZr#   r   )loggingr`   bsonr   bson.errorsr   flaskr   flask_admin._compatr   flask_admin.babelr   r   r	   flask_admin.modelr
   flask_admin.actionsr   flask_admin.helpersr   rk   r   toolsr   	getLoggerr   r   r&   r#   r"   <module>r      sQ       !  , = = + & - & " g-.{Z {Zr#   