
    Vi                          S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S S	KJr  S S
KJr   " S S\5      rS r  SS jrS rSS jr " S S\5      rg)    N)abort)render_template)request)Database)DoesNotExist)Model)Proxy)SelectQuery)connectc                   >    \ rS rSr  S	S jrS rS rS rS
S jrSr	g)PaginatedQuery   Nc                     X l         X0l        U=(       d    S U l        XPl        [	        U[
        5      (       a"  Xl        U R                  R                  U l        g Xl        U R                  R                  5       U l        g N)	paginate_bypage_varpagecheck_bounds
isinstancer
   querymodelselect)selfquery_or_modelr   r   r   r   s         h/home/james-whalen/.local/share/pipx/venvs/semgrep/lib/python3.13/site-packages/playhouse/flask_utils.py__init__PaginatedQuery.__init__   sZ    & LD	(nk22'J))DJ'J**,DJ    c                     U R                   b  U R                   $ [        R                  R                  U R                  5      nU(       a*  UR                  5       (       a  [        S[        U5      5      $ g)N   )r   r   argsgetr   isdigitmaxint)r   	curr_pages     r   get_pagePaginatedQuery.get_page   sS    99 99LL$$T]]3	**,,q#i.))r   c                     [        U S5      (       dR  [        [        R                  " [	        U R
                  R                  5       5      U R                  -  5      5      U l        U R                  $ )N_page_count)	hasattrr%   mathceilfloatr   countr   r*   r   s    r   get_page_countPaginatedQuery.get_page_count'   sS    t]++"499djj&&()D,<,<<$>  ?Dr   c                     U R                   (       a-  U R                  5       U R                  5       :  a  [        S5        U R                  R                  U R                  5       U R                  5      $ Ni  )r   r'   r1   r   r   paginater   r0   s    r   get_object_listPaginatedQuery.get_object_list-   sK    43F3F3H!H#Jzz""4==?D4D4DEEr   c                     [        XS-  -
  S5      n[        XC-   U5      S-   n[        [        XEU-
  5      S5      n[        [        XE5      S U 5      $ )N   r    )r$   minlistrange)r   r   totalshowstartstops         r   get_page_rangePaginatedQuery.get_page_range2   sV     TQY'!,5<'!+Cd{+Q/E%&u-..r   )r*   r   r   r   r   r   r   )r   NF)   )
__name__
__module____qualname____firstlineno__r   r'   r1   r6   rA   __static_attributes__ r   r   r   r      s"    JN#- F
/r   r   c                     [        U [        5      (       d  U R                  5       n  U R                  " U6 R	                  5       $ ! [
         a    [        S5         g f = fr4   )r   r
   r   wherer"   r   r   )r   r   s     r   get_object_or_404rL   <   sR    nk22'..0##U+//11 c
s   A AAc                 z    [        UUUUUS9nUR                  5       Xr'   [        U 4UUR                  5       S.UD6$ )N)r   r   r   r   )
paginationr   )r   r6   r   r'   )	template_namer   context_variabler   r   r   r   kwargspaginated_querys	            r   object_listrS   D   s^     %!#O  />>@F"%%' 	 r   c                      [         R                  (       d  [         R                  $ [         R                  < S[         R                  < 3$ )N?)r   query_stringpathrI   r   r   get_current_urlrX   T   s*    ||llG$8$899r   c                     [         R                  R                  S5      (       a  [         R                  S   $ [         R                  R                  S5      (       a  [         R                  S   $ U $ )Nnext)r   r!   r"   form)defaults    r   get_next_urlr]   Y   sO    ||||F##			&	!	!||F##Nr   c                   d    \ rS rSrSrSS\S4S jrS rS rS r	S r
S	 r\S
 5       rS rS rSrg)FlaskDB`   a  
Convenience wrapper for configuring a Peewee database for use with a Flask
application. Provides a base `Model` class and registers handlers to manage
the database connection during the request/response cycle.

Usage::

    from flask import Flask
    from peewee import *
    from playhouse.flask_utils import FlaskDB


    # The database can be specified using a database URL, or you can pass a
    # Peewee database instance directly:
    DATABASE = 'postgresql:///my_app'
    DATABASE = PostgresqlDatabase('my_app')

    # If we do not want connection-management on any views, we can specify
    # the view names using FLASKDB_EXCLUDED_ROUTES. The db connection will
    # not be opened/closed automatically when these views are requested:
    FLASKDB_EXCLUDED_ROUTES = ('logout',)

    app = Flask(__name__)
    app.config.from_object(__name__)

    # Now we can configure our FlaskDB:
    flask_db = FlaskDB(app)

    # Or use the "deferred initialization" pattern:
    flask_db = FlaskDB()
    flask_db.init_app(app)

    # The `flask_db` provides a base Model-class for easily binding models
    # to the configured database:
    class User(flask_db.Model):
        email = CharField()

Nc                     S U l         X0l        Xl        X l        U=(       d    SU l        Ub  U R                  U5        g g )NrI   )databasebase_model_class_app_db_excluded_routesinit_app)r   apprb   model_classexcluded_routess        r   r   FlaskDB.__init__   s<     +	 / 52?MM# r   c                 d   Xl         U R                  cK  SUR                  ;   a  UR                  S   nO7SUR                  ;   a  UR                  S   nO[        S5      eU R                  nSUR                  ;   a  UR                  S   U l        U R                  X5        U R                  U5        g )NDATABASEDATABASE_URLzKMissing required configuration data for database: DATABASE or DATABASE_URL.FLASKDB_EXCLUDED_ROUTES)rd   re   config
ValueErrorrf   _load_database_register_handlers)r   rh   
initial_dbs      r   rg   FlaskDB.init_app   s    	88SZZ' ZZ
3
3::- ZZ7
  "G H H J$

2$'JJ/H$ID!C,$r   c                 ,   [        U[        5      (       a  UnO;[        U[        5      (       a  U R                  [        U5      5      nO[	        U5      n[        U R
                  [        5      (       a  U R
                  R                  U5        g X0l        g r   )r   r   dict_load_from_config_dictdb_url_connectrb   r	   
initialize)r   rh   config_valuerb   s       r   rr   FlaskDB._load_database   sj    lH--#Hd++2243EFH &l3HdmmU++MM$$X.$Mr   c                     UR                  S5      nUR                  S5      nSU;   a  UR                  SS5      u  pEOSUpT [	        U5        [
        R                  U   n[        Xe5      n[        U[        5      (       d   e U" U40 UD6$ ! [         a    [        S5      ef = f! [         a    [        SU-  5      e[         a    [        SU-  5      e[         a    [        S	U-  5      ef = f)
Nnameenginez:DATABASE configuration must specify a `name` and `engine`..r    peeweezUnable to import %szDatabase engine not found %sz5Database engine not a subclass of peewee.Database: %s)popKeyErrorRuntimeErrorrsplit
__import__sysmodulesgetattr
issubclassr   ImportErrorAttributeErrorAssertionError)r   config_dictr~   r   rW   
class_namemoduledatabase_classs           r   rx   FlaskDB._load_from_config_dict   s   	7??6*D __X.F
 &=%}}S!4D*'*	?t[[&F$V8Nnh7777 d2k22-  	7  6 7 7	7  	?4v=>> 	H=FGG 	?  57= > ? ?	?s   "B A B& B#&AC-c                 p    UR                  U R                  5        UR                  U R                  5        g r   )before_request
connect_dbteardown_requestclose_db)r   rh   s     r   rs   FlaskDB._register_handlers   s&    4??+T]]+r   c                 h   ^  T R                   c  [        S5      e " U 4S jST R                  5      nU$ )NzDatabase must be initialized.c                   0   > \ rS rSr " U 4S jS5      rSrg)*FlaskDB.get_model_class.<locals>.BaseModel   c                   0   > \ rS rSr Y R                  rSrg)/FlaskDB.get_model_class.<locals>.BaseModel.Meta   rI   N)rD   rE   rF   rG   rb   rH   r0   s   r   Metar      s    ==r   r   rI   N)rD   rE   rF   rG   r   rH   r0   s   r   	BaseModelr      s    ) )r   r   )rb   r   rc   )r   r   s   ` r   get_model_classFlaskDB.get_model_class   s3    == >??	)-- 	) r   c                     U R                   c  [        U SS 5      nUc  [        5       U l        [	        U S5      (       d  U R                  5       U l        U R                  $ )Nrb   _model_class)rd   r   r	   rb   r+   r   r   )r   rb   s     r   r   FlaskDB.Model   sS    99tZ6H %t^,, $ 4 4 6D   r   c                     U R                   (       a  [        R                  U R                   ;   a  g U R                  R	                  5         g r   )rf   r   endpointrb   r   r0   s    r   r   FlaskDB.connect_db   s1      W%5%59N9N%Nr   c                     U R                   (       a  [        R                  U R                   ;   a  g U R                  R	                  5       (       d  U R                  R                  5         g g r   )rf   r   r   rb   	is_closedclose)r   excs     r   r   FlaskDB.close_db   sI      W%5%59N9N%N}}&&((MM! )r   )rd   re   rf   r   rc   rb   )rD   rE   rF   rG   __doc__r   r   rg   rr   rx   rs   r   propertyr   r   rH   rI   r   r   r_   r_   `   sP    %L  $E!%%(%38, ! ! 
"r   r_   )rS      r   NT)/)r,   r   flaskr   r   r   r   r   r   r   r	   r
   playhouse.db_urlr   ry   objectr   rL   rS   rX   r]   r_   rI   r   r   <module>r      s^     
  !       6*/V */Z 8EIM :
Q"f Q"r   