
    $gD                         d dl Z d dlmZ ddlmZmZmZ  G d d          Z G d de          Z G d	 d
e          Z	dS )    N)cached_property   )OrderByOrderByTuplesegmentc                       e Zd ZdZd Zd Zd Zd Zed             Z	ed             Z
ed             Zed	             Zed
             ZdS )	TableDataz/
    Base class for table data containers.
    c                     || _         d S Ndata)selfr   s     S/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/django_tables2/data.py__init__zTableData.__init__   s    			    c                     | j         |         S )z`
        Slicing returns a new `.TableData` instance, indexing returns a single record.
        r   )r   keys     r   __getitem__zTableData.__getitem__   s     y~r   c                 *    t          | j                  S )z
        for ... in ... default to using this. There's a bug in Django 1.3
        with indexing into QuerySets, so this side-steps that problem (as well
        as just being a better way to iterate).
        )iterr   r   s    r   __iter__zTableData.__iter__   s     DIr   c                     || _         dS )z
        `Table.__init__` calls this method to inject an instance of itself into the
        `TableData` instance.
        Good place to do additional checks if Table and TableData instance will work
        together properly.
        N)table)r   r   s     r   	set_tablezTableData.set_table   s     


r   c                 .    t          | j        dd           S )Nmodel)getattrr   r   s    r   r   zTableData.model'   s    ty'4000r   c                     d S r    r   s    r   orderingzTableData.ordering+   s    tr   c                     dS )Nitemr    r   s    r   verbose_namezTableData.verbose_name/   s    vr   c                     dS )Nitemsr    r   s    r   verbose_name_pluralzTableData.verbose_name_plural3   s    wr   c                 8   t          | t                    r| S t                              |           rt          |           S t                              |           rt	          t          |                     S t          dt          |           j         d          )NzRdata must be QuerySet-like (have count() and order_by()) or support list(data) -- z has neither)	
isinstancer	   TableQuerysetDatavalidateTableListDatalist
ValueErrortype__name__r   s    r   	from_datazTableData.from_data7   s     dI&& 	K%%d++ 	-$T***##D)) 	- d,,,@"4jj1@ @ @
 
 	
r   N)r0   
__module____qualname____doc__r   r   r   r   propertyr   r!   r$   r'   staticmethodr1   r    r   r   r	   r	      s                  1 1 X1   X   X   X 
 
 \
 
 
r   r	   c                   n     e Zd ZdZed             Zd Ze fd            Ze fd            Z	d Z
 xZS )r,   a  
    Table data container for a list of dicts, for example::

    [
        {'name': 'John', 'age': 20},
        {'name': 'Brian', 'age': 25}
    ]

    .. note::

        Other structures might have worked in the past, but are not explicitly
        supported or tested.
    c                 b    t          | d          pt          | d          ot          | d          S )<
        Validates `data` for use in this container
        r   __len__r   )hasattrr   s    r   r+   zTableListData.validateV   s7    
 tZ(( 
D)$$E})E)E	
r   c                 *    t          | j                  S r   )lenr   r   s    r   r:   zTableListData.__len___   s    49~~r   c                 R    t          | j        dt                      j                  S )Nr$   )r   r   superr$   r   	__class__s    r   r$   zTableListData.verbose_nameb   s    ty.%''2FGGGr   c                 R    t          | j        dt                      j                  S )Nr'   )r   r   r?   r'   r@   s    r   r'   z!TableListData.verbose_name_pluralf   s    ty"79TUUUr   c                    g }|D ]W}| j         j        t          |          j                 }|d         |j        d         k    r||j        j        z  }M||j        z  }X| j                            t          |          j
                   dS )G  
        Order the data based on order by aliases (prefixed column names) in the
        table.

        Arguments:
            aliases (`~.utils.OrderByTuple`): optionally prefixed names of
                columns ('-' indicates descending order) in order of
                significance with regard to data ordering.
        r   )r   N)r   columnsr   bareorder_by_aliasorder_byoppositer   sortr   r   )r   aliases	accessorsaliasbound_columns        r   rH   zTableListData.order_byj   s     	 		3 		3E:-genn.ABL
 Qx<6q999\2;;		\22			<	22677777r   )r0   r2   r3   r4   r6   r+   r:   r5   r$   r'   rH   __classcell__rA   s   @r   r,   r,   G   s          
 
 \
   H H H H XH V V V V XV8 8 8 8 8 8 8r   r,   c                        e Zd ZdZed             Zd Z fdZed             Z	d Z
ed             Zed             Z xZS )	r*   z.
    Table data container for a queryset.
    c                     t          | d          o7t          | j                  o#t          | d          ot          | j                  S )r9   countrH   )r;   callablerS   rH   r   s    r   r+   zTableQuerysetData.validate   sN     D'"" ($$(j))( ''		
r   c                     t          | d          r| j        Mt          | j        d          r| j                                        | _        nt          | j                  | _        | j        S )zCached data length_lengthN	paginator)r;   rV   r   r   rS   r=   r   s    r   r:   zTableQuerysetData.__len__   s]    tY'' 	.4<+?tz;// .#y00  #49~~|r   c                    t                                          |           | j        rWt          |j        dd           rC| j        |j        j        k    r0t          j        d| j         d|j        j         d           d S d S d S d S )Nr   zTable data is of type z but z! is specified in Table.Meta.model)r?   r   r   r   _metawarningswarn)r   r   rA   s     r   r   zTableQuerysetData.set_table   s    %   : 	'%+w== 	$*PUP[PaBaBaMnnn%+:Knnn    	 	 	 	BaBar   c                     i }| j         j        D ]}|j        ||j        <   	 t	          t          | j        j        j        |                    S # t          $ r Y dS w xY w)a]  
        Returns the list of order by aliases that are enforcing ordering on the
        data.

        If the data is unordered, an empty sequence is returned. If the
        ordering can not be determined, `None` is returned.

        This works by inspecting the actual underlying data. As such it's only
        supported for querysets.
        N)	r   rE   rH   rG   nextr   r   queryStopIteration)r   rK   rN   s      r   r!   zTableQuerysetData.ordering   sx      J. 	I 	IL3?3HGL/00		 8'BBCCC 	 	 	DD	s   +A 
AAc                 |   d}g }|D ]}| j         j        t          |          j                 }|d         |j        d         k    r||j        j        z  }n
||j        z  }|r3|                    | j        |d         dk              \  }}|r	|| _        d}|rdS |r"d |D             } | j        j        | | _        dS dS )rD   Fr   -TNc              3   >   K   | ]}|                                 V  d S r   )for_queryset).0as     r   	<genexpr>z-TableQuerysetData.order_by.<locals>.<genexpr>   s,      !F!Fq!.."2"2!F!F!F!F!F!Fr   )	r   rE   r   rF   rG   rH   rI   orderr   )	r   rK   modified_anyrL   rM   rN   querysetmodifiedorder_by_accessorss	            r   rH   zTableQuerysetData.order_by   s     	 	( 	(E:-genn.ABL Qx<6q999\2;;		\22	 (%1%7%7	58s?%S%S"( ( (DI#'L  	F  	@!F!FI!F!F!F*	*,>?DIII	@ 	@r   c                 .    | j         j        j        j        S )zz
        The full (singular) name for the data.

        Model's `~django.db.Model.Meta.verbose_name` is honored.
        )r   r   rY   r$   r   s    r   r$   zTableQuerysetData.verbose_name   s     y$11r   c                 .    | j         j        j        j        S )zx
        The full (plural) name for the data.

        Model's `~django.db.Model.Meta.verbose_name` is honored.
        )r   r   rY   r'   r   s    r   r'   z%TableQuerysetData.verbose_name_plural   s     y$88r   )r0   r2   r3   r4   r6   r+   r:   r   r5   r!   rH   r   r$   r'   rO   rP   s   @r   r*   r*      s          	
 	
 \	

 
 
       X($@ $@ $@L 2 2 _2 9 9 _9 9 9 9 9r   r*   )
rZ   django.utils.functionalr   utilsr   r   r   r	   r,   r*   r    r   r   <module>rp      s     3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1<
 <
 <
 <
 <
 <
 <
 <
~98 98 98 98 98I 98 98 98xo9 o9 o9 o9 o9	 o9 o9 o9 o9 o9r   