o
    ðT·j·  ã                   @   s¶   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 d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ G dd„ deƒZdd„ Z		ddd„ZG dd„ deƒZdS )é    N)Úabort)Úrender_template)Úrequest)ÚDatabase)ÚDoesNotExist)ÚModel)ÚProxy)ÚSelectQuery)Úconnectc                   @   s<   e Zd Z		ddd„Zdd„ Zdd	„ Zd
d„ Zddd„ZdS )ÚPaginatedQueryÚpageNFc                 C   sP   || _ || _|p	d | _|| _t|tƒr|| _| jj| _d S || _| j ¡ | _d S ©N)	Úpaginate_byÚpage_varr   Úcheck_boundsÚ
isinstancer	   ÚqueryÚmodelÚselect)ÚselfÚquery_or_modelr   r   r   r   © r   úX/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/flask_utils.pyÚ__init__   s   

zPaginatedQuery.__init__c                 C   s<   | j d ur| j S tj | j¡}|r| ¡ rtdt|ƒƒS dS )Né   )r   r   ÚargsÚgetr   ÚisdigitÚmaxÚint)r   Ú	curr_pager   r   r   Úget_page   s   
zPaginatedQuery.get_pagec                 C   s0   t | dƒstt t| j ¡ ƒ| j ¡ƒ| _| jS )NÚ_page_count)	Úhasattrr   ÚmathÚceilÚfloatr   Úcountr   r"   ©r   r   r   r   Úget_page_count'   s
   
ÿzPaginatedQuery.get_page_countc                 C   s2   | j r|  ¡ |  ¡ krtdƒ | j |  ¡ | j¡S ©Ni”  )r   r!   r)   r   r   Úpaginater   r(   r   r   r   Úget_object_list-   s   zPaginatedQuery.get_object_listé   c                 C   sN   t ||d  dƒ}t|| |ƒd }t t||| ƒdƒ}tt||ƒd |… ƒS )Né   r   )r   ÚminÚlistÚrange)r   r   ÚtotalÚshowÚstartÚstopr   r   r   Úget_page_range2   s   zPaginatedQuery.get_page_range)r   NF)r-   )Ú__name__Ú
__module__Ú__qualname__r   r!   r)   r,   r6   r   r   r   r   r      s    
ÿ	r   c                 G   s@   t | tƒs	|  ¡ } z| j|Ž  ¡ W S  ty   tdƒ Y d S w r*   )r   r	   r   Úwherer   r   r   )r   r   r   r   r   Úget_object_or_404<   s   
ÿr;   Úobject_listé   r   Tc           	      K   s8   t |||||d�}| ¡ ||< t| f|| ¡ dœ|¤ŽS )N)r   r   r   r   )Ú
paginationr   )r   r,   r   r!   )	Útemplate_namer   Úcontext_variabler   r   r   r   ÚkwargsÚpaginated_queryr   r   r   r<   D   s    ûÿýüc                   @   sf   e Zd ZdZddedfdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
edd„ ƒZdd„ Zdd„ ZdS )ÚFlaskDBa  
    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                 C   s<   d | _ || _|| _|| _|pd| _|d ur|  |¡ d S d S )Nr   )ÚdatabaseÚbase_model_classÚ_appÚ_dbÚ_excluded_routesÚinit_app)r   ÚapprD   Úmodel_classÚexcluded_routesr   r   r   r   {   s   
ÿzFlaskDB.__init__c                 C   sz   || _ | jd u r"d|jv r|jd }nd|jv r|jd }ntdƒ‚| j}d|jv r0|jd | _|  ||¡ |  |¡ d S )NÚDATABASEÚDATABASE_URLzKMissing required configuration data for database: DATABASE or DATABASE_URL.ÚFLASKDB_EXCLUDED_ROUTES)rF   rG   ÚconfigÚ
ValueErrorrH   Ú_load_databaseÚ_register_handlers)r   rJ   Ú
initial_dbr   r   r   rI   …   s   



zFlaskDB.init_appc                 C   sX   t |tƒr|}nt |tƒr|  t|ƒ¡}nt|ƒ}t | jtƒr'| j |¡ d S || _d S r   )r   r   ÚdictÚ_load_from_config_dictÚdb_url_connectrD   r   Ú
initialize)r   rJ   Úconfig_valuerD   r   r   r   rR   ™   s   


zFlaskDB._load_databasec                 C   sÞ   z|  d¡}|  d¡}W n ty   tdƒ‚w d|v r%| dd¡\}}nd|}}zt|ƒ tj| }t||ƒ}t|t	ƒs@J ‚W n% t
yN   td| ƒ‚ tyZ   td| ƒ‚ tyf   td	| ƒ‚w ||fi |¤ŽS )
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_dictrZ   r[   ÚpathÚ
class_nameÚmoduleÚdatabase_classr   r   r   rV   §   s0   
ÿ


ÿÿzFlaskDB._load_from_config_dictc                 C   s   |  | j¡ | | j¡ d S r   )Úbefore_requestÚ
connect_dbÚteardown_requestÚclose_db)r   rJ   r   r   r   rS   Ã   s   zFlaskDB._register_handlersc                    s,   ˆ j d u r	tdƒ‚G ‡ fdd„dˆ jƒ}|S )NzDatabase must be initialized.c                       s   e Zd ZG ‡ fdd„dƒZdS )z*FlaskDB.get_model_class.<locals>.BaseModelc                       s   e Zd Z” jZdS )z/FlaskDB.get_model_class.<locals>.BaseModel.MetaN)r7   r8   r9   rD   r   r(   r   r   ÚMetaÌ   s    
rs   N)r7   r8   r9   rs   r   r(   r   r   Ú	BaseModelË   s    rt   )rD   r`   rE   )r   rt   r   r(   r   Úget_model_classÇ   s   
zFlaskDB.get_model_classc                 C   s@   | j d u rt| dd ƒ}|d u rtƒ | _t| dƒs|  ¡ | _| jS )NrD   Ú_model_class)rF   re   r   rD   r#   ru   rv   )r   rD   r   r   r   r   Ñ   s   


zFlaskDB.Modelc                 C   s$   | j rtj| j v rd S | j ¡  d S r   )rH   r   ÚendpointrD   r
   r(   r   r   r   rp   Ü   s   zFlaskDB.connect_dbc                 C   s2   | j rtj| j v rd S | j ¡ s| j ¡  d S d S r   )rH   r   rw   rD   Ú	is_closedÚclose)r   Úexcr   r   r   rr   á   s
   
ÿzFlaskDB.close_db)r7   r8   r9   Ú__doc__r   r   rI   rR   rV   rS   ru   Úpropertyrp   rr   r   r   r   r   rC   T   s    &
ÿ



rC   )r<   r=   r   NT)r$   rc   Úflaskr   r   r   r]   r   r   r   r   r	   Úplayhouse.db_urlr
   rW   Úobjectr   r;   r<   rC   r   r   r   r   Ú<module>   s"    -
ÿ