
    sib                     @    d dl mZ d dlmZ d dlmZ ddZd Z	 d	dZy)
    )	Paginator)ForwardManyToOneDescriptor)_thread_localsc                     |j                   s9t        |j                  d      r|j                  d      }n|j                  d      }| j                  j                  |      }t        ||      }|j                  |      S )z7
    Returns paginated results with safe ordering.
    
created_atz-created_atz-id)orderedhasattrmodelorder_byGETgetr   get_page)requestqueryset	page_namerecords_per_pagepage	paginators         4/var/www/python-projects/worksol/horilla/group_by.pyrecord_queryset_paginatorr      sk    
 8>><0((7H((/H;;??9%D($45Id##    c           
         g }|rx|D ]q  } |j                   di ||j                  i}|j                         s2|t        | |d| |j                         d| |j                   d}	|j	                  |	       s |S |D ]s  } |j                   di ||i}|j                         s(|t        | |d| | j                  dd            d| | j                  dd      d}
|j	                  |
       u |S )z"
    groups generating method
    dynamic_page_)grouperlistdynamic_name _ )filteridcountr   appendreplace)r   groupersr   r   group_fieldis_fk_fieldgroupsr   group_queryset
group_infogroups              r   generate_groupsr,      s3    F 	*G,X__IWZZ/HIN##%&5&'	{7::,?
 '4I;wzzl$K
 j)	*> M!   	%G,X__FW/EFN##%&5&'	{7)<DDS#N
 '4I;wi$H$P$PS%
 e$	%  Mr   Nc           	         ddl m}  |       dk7  r |       }|j                  d      }t        |      dkD  }| j                  }t        t        ||d      t              }	|}
d}t        t        dd      }|s|	r|D ])  }|
j                  j                  |      }|j                  }
+ |
r,|
j                  j                         }t        ||| ||d	      }nt        | j!                  |d
            D cg c]  \  }}|| j!                  |d
      d| vr|! }}}t        ||| ||d	      }nt        | j!                  |d
            D cg c]  \  }}|| j!                  |d
      d| vr|! }}}| j                  j                  j                  |      j                  }|r|j                  j#                  |      }t        ||| ||d	      }t%        ||      }|j'                  |      S c c}}w c c}}w )zT
    This method is used to make group-by and split groups by nested pagination
    r   )get_pagination2   __   Nr   T)r'   )flatF)id__in)base.methodsr.   splitlenr
   
isinstancegetattrr   r   _meta	get_fieldrelated_modelobjectsallr,   	enumeratevalues_listr    r   r   )r   r&   r   r   r   r.   fields_splitsplittedr
   r'   
model_copy	field_objr   fieldr%   r(   indexitemr;   s                      r   group_by_querysetrG   ?   s-    ,2)+$$T*L< 1$HNNE{D)+EK JI ni6G;! 	1E"((2259I"00J	1 !))--/H$ F $-((4(@$E4 x33Kd3KFUSS	 H  %8YQVF  ))=)=kPT)=)UV
t8//$/GOO 
 
 !,,66{CQQ$,,3383DH XxKU
 v/0F??4  7
s   2$G,
$G2)
   )Nr   rH   )	django.core.paginatorr   +django.db.models.fields.related_descriptorsr   horilla.horilla_middlewaresr   r   r,   rG   r   r   r   <module>rL      s&    + R 6$ %R JL@!r   