Ë
    ”2Úi03  ã                   óÖ   — d Z ddlmZ ddlmZ ddlmZ ddl	m
Z
  G d„ de«      Z G d„ d	e«      Z G d
„ de«      Z G d„ dee
«      Z G d„ dee
«      Z G d„ de«      Z G d„ de«      Zy)z?
Module where grappelli dashboard modules classes are defined.
é    )Úapps)Úcapfirst)Úgettext_lazy)ÚAppListElementMixinc                   óR   — e Zd Z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y)ÚDashboardModulea¥  
    Base class for all dashboard modules.
    Dashboard modules have the following properties:

    ``collapsible``
        Boolean that determines whether the module is collapsible, this
        allows users to show/hide module content. Default: ``True``.

    ``column``
        Integer that corresponds to the column.
        Default: None.

    ``title``
        String that contains the module title, make sure you use the django
        gettext functions if your application is multilingual.
        Default value: ''.

    ``title_url``
        String that contains the module title URL. If given the module
        title will be a link to this URL. Default value: ``None``.

    ``css_classes``
        A list of css classes to be added to the module ``div`` class
        attribute. Default value: ``None``.

    ``pre_content``
        Text or HTML content to display above the module content.
        Default value: ``None``.

    ``post_content``
        Text or HTML content to display under the module content.
        Default value: ``None``.

    ``template``
        The template to use to render the module.
        Default value: 'grappelli/dashboard/module.html'.
    zgrappelli/dashboard/module.htmlTNÚ c                 óÔ   — |�|| _         |D ])  }t        | j                  |«      sŒt        | |||   «       Œ+ | j                  xs g | _        | j
                  xs g | _        d| _        y )NF)ÚtitleÚhasattrÚ	__class__ÚsetattrÚchildrenÚcss_classesÚ_initialized)Úselfr   ÚkwargsÚkeys       úR/var/www/html/acx/venv/lib/python3.12/site-packages/grappelli/dashboard/modules.pyÚ__init__zDashboardModule.__init__@   si   € ØÐØˆDŒJØò 	0ˆCÜ�t—~‘~ sÕ+Ü˜˜c 6¨#¡;Õ/ð	0ð Ÿ™Ò+¨ˆŒØ×+Ñ+Ò1¨rˆÔà!ˆÕó    c                  ó   — y)aù  
        Like for the :class:`~grappelli.dashboard.Dashboard` class, dashboard
        modules have a ``init_with_context`` method that is called with a
        ``django.template.RequestContext`` instance as unique argument.

        This gives you enough flexibility to build complex modules, for
        example, let's build a "history" dashboard module, that will list the
        last ten visited pages::

            from grappelli.dashboard import modules

            class HistoryDashboardModule(modules.LinkList):
                title = 'History'

                def init_with_context(self, context):
                    request = context['request']
                    # we use sessions to store the visited pages stack
                    history = request.session.get('history', [])
                    for item in history:
                        self.children.append(item)
                    # add the current page to the history
                    history.insert(0, {
                        'title': context['title'],
                        'url': request.META['PATH_INFO']
                    })
                    if len(history) > 10:
                        history = history[:10]
                    request.session['history'] = history

        N© )r   Úcontexts     r   Úinit_with_contextz!DashboardModule.init_with_contextK   s   € ð> 	r   c                 ór   — | j                   du xr( | j                  du xr t        | j                  «      dk(  S )zO
        Return True if the module has no content and False otherwise.
        Nr   )Úpre_contentÚpost_contentÚlenr   )r   s    r   Úis_emptyzDashboardModule.is_emptyl   s9   € ð
 ×Ñ 4Ð'Òa¨D×,=Ñ,=ÀÐ,EÒaÌ#ÈdÏmÉmÓJ\Ð`aÑJaÐar   c                 óÜ   — dg}| j                   r>|j                  d«       d| j                  vrd| j                  vr|j                  d«       || j                  z  }dj                  |«      S )zL
        Return a string containing the css classes for the module.
        zgrp-dashboard-modulezgrp-collapsezgrp-openz
grp-closedú )ÚcollapsibleÚappendr   Újoin)r   Úrets     r   Úrender_css_classesz"DashboardModule.render_css_classess   sf   € ð
 &Ð&ˆØ×ÒØ�J‰J�~Ô&Ø ×!1Ñ!1Ñ1°lÈ$×JZÑJZÑ6ZØ—
‘
˜:Ô&Øˆt×ÑÑˆØ�x‰x˜‹}Ðr   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Útemplater#   ÚcolumnÚ
show_titler   Ú	title_urlr   r   r   r   r   r   r    r'   r   r   r   r   r      sR   „ ñ$ðL 1€HØ€KØ€FØ€JØ€EØ€IØ€KØ€KØ€LØ€Hó	"òòBbór   r   c                   ó,   ‡ — e Zd ZdZdZd„ Zˆ fd„Zˆ xZS )ÚGroupa  
    Represents a group of modules.

    Here's an example of modules group::

        from grappelli.dashboard import modules, Dashboard

        class MyDashboard(Dashboard):
            def __init__(self, **kwargs):
                Dashboard.__init__(self, **kwargs)
                self.children.append(modules.Group(
                    title="My group",
                    children=[
                        modules.AppList(
                            title='Administration',
                            models=('django.contrib.*',)
                        ),
                        modules.AppList(
                            title='Applications',
                            exclude=('django.contrib.*',)
                        )
                    ]
                ))

    z&grappelli/dashboard/modules/group.htmlc                 óp   — | j                   ry | j                  D ]  }|j                  |«       Œ d| _         y )NT)r   r   r   )r   r   Úmodules      r   r   zGroup.init_with_contextž   s7   € Ø×ÒØØ—m‘mò 	.ˆFØ×$Ñ$ WÕ-ð	.à ˆÕr   c                 ór   •— t         t        | �  «       ry| j                  D ]  }|j                  «       rŒ y y)zx
        A group of modules is considered empty if it has no children or if
        all its children are empty.
        TF)Úsuperr2   r    r   )r   Úchildr   s     €r   r    zGroup.is_empty¥   s:   ø€ ô ”˜Ñ&Ô(ØØ—]‘]ò 	ˆEØ—>‘>Õ#Ùð	ð r   )r)   r*   r+   r,   r-   r   r    Ú__classcell__©r   s   @r   r2   r2   �   s   ø„ ñð4 8€Hò!÷ð r   r2   c                   ó*   — e Zd ZdZ ed«      ZdZd„ Zy)ÚLinkListz1
    A module that displays a list of links.
    ÚLinksz*grappelli/dashboard/modules/link_list.htmlc                 ó²  — | j                   ry g }| j                  D ]«  }t        |t        t        f«      r‚|d   |d   dœ}t        |«      dk\  r|d   |d<   t        |«      dk\  r|d   |d<   t        |«      d	k\  r+|d   }t        |t        «      r|rd
nd }|rt        |«      |d<   |j                  |«       Œ›|j                  |«       Œ­ || _        d| _         y )Nr   é   )r   Úurlé   é   Úexternalé   Údescriptioné   Ú_blankÚtargetT)	r   r   Ú
isinstanceÚtupleÚlistr   ÚboolÚstrr$   )r   r   Únew_childrenÚlinkÚ	link_dictrG   s         r   r   zLinkList.init_with_context»   sÝ   € Ø×ÒØØˆØ—M‘Mò 	*ˆDÜ˜$¤¬ Ô/Ø&*¨1¡g°d¸1±gÑ>�	Ü�t“9 ’>Ø,0°©G�I˜jÑ)Ü�t“9 ’>Ø/3°A©w�I˜mÑ,Ü�t“9 ’>Ø! !™W�FÜ! &¬$Ô/Ù-3¡¸˜ÙÜ.1°&«k˜	 (Ñ+Ø×#Ñ# IÕ.à×#Ñ# DÕ)ð	*ð  %ˆŒØ ˆÕr   N)r)   r*   r+   r,   Ú_r   r-   r   r   r   r   r;   r;   ³   s   „ ññ ˆg‹J€EØ;€Hó!r   r;   c                   óF   ‡ — e Zd ZdZ ed«      ZdZdZdZdˆ fd„	Z	d„ Z
ˆ xZS )ÚAppListz<
    Module that lists installed apps and their models.
    ÚApplicationsz)grappelli/dashboard/modules/app_list.htmlNc                 ó®   •— t        |j                  dg «      «      | _        t        |j                  dg «      «      | _        t	        t
        | �  |fi |¤Ž y )NÚmodelsÚexclude)rJ   ÚpoprU   rV   r6   rR   r   )r   r   r   r   s      €r   r   zAppList.__init__Ý   sE   ø€ Ü˜6Ÿ:™: h°Ó3Ó4ˆŒÜ˜FŸJ™J y°"Ó5Ó6ˆŒÜŒg�tÑ% eÑ6¨vÓ6r   c                 ó  — | j                   ry | j                  |d   «      }i }|D ]ê  \  }}|j                  j                  }||vrNt	        j
                  |«      j                  t        |j                  «       «      | j                  ||«      g dœ||<   i }t        |j                  j                  «      |d<   |d   s|d   r|d    |d<   | j                  ||«      |d<   |d   r| j                  ||«      |d	<   ||   d
   j                  |«       Œì t        |j                  «       «      }|j!                  «        |D ]9  }	||	   d
   j!                  d„ ¬«       | j"                  j                  ||	   «       Œ; d| _         y )NÚrequest)Únamer   r?   rU   r   ÚchangeÚviewÚ	view_onlyÚ	admin_urlÚaddÚadd_urlrU   c                 ó   — | d   S )Nr   r   )Úis    r   ú<lambda>z+AppList.init_with_context.<locals>.<lambda>ý   s
   € °1°W±:€ r   )r   T)r   Ú_visible_modelsÚ_metaÚ	app_labelÚdjango_appsÚget_app_configÚverbose_namer   r   Ú_get_admin_app_list_urlÚverbose_name_pluralÚ_get_admin_change_urlÚ_get_admin_add_urlr$   rJ   ÚkeysÚsortr   )
r   r   Úitemsr   ÚmodelÚpermsrf   Ú
model_dictÚapps_sortedÚapps
             r   r   zAppList.init_with_contextâ   s…  € Ø×ÒØØ×$Ñ$ W¨YÑ%7Ó8ˆØˆØ!ò 	9‰LˆE�5ØŸ™×-Ñ-ˆIØ Ñ$ä'×6Ñ6°yÓA×NÑNÜ% i§o¡oÓ&7Ó8Ø×7Ñ7¸¸wÓGØ ñ	#��Y‘ð ˆJÜ"*¨5¯;©;×+JÑ+JÓ"KˆJ�wÑØ�XŠ %¨¢-Ø.3°H©oÐ*=�
˜;Ñ'Ø*.×*DÑ*DÀUÈGÓ*T�
˜;Ñ'Ø�UŠ|Ø(,×(?Ñ(?ÀÀwÓ(O�
˜9Ñ%Ø�‰O˜HÑ%×,Ñ,¨ZÕ8ð!	9ô$ ˜4Ÿ9™9›;Ó'ˆØ×ÑÔØò 	,ˆCà�‰I�hÑ×$Ñ$Ñ)=Ð$Ô>Ø�M‰M× Ñ   c¡Õ+ð	,ð !ˆÕr   r(   )r)   r*   r+   r,   rP   r   r-   rU   rV   r   r   r8   r9   s   @r   rR   rR   Ó   s-   ø„ ññ ˆnÓ€EØ:€HØ€FØ€Gõ7ö
!r   rR   c                   ó6   ‡ — e Zd ZdZdZdZdZdˆ fd„	Zd„ Zˆ xZ	S )Ú	ModelListz,
    Module that lists a set of models.
    z+grappelli/dashboard/modules/model_list.htmlNc                 ó~   •— t        |xs g «      | _        t        |xs g «      | _        t        t        | �  |fi |¤Ž y r(   )rJ   rU   rV   r6   rw   r   )r   r   rU   rV   r   r   s        €r   r   zModelList.__init__  s7   ø€ Ü˜6š< RÓ(ˆŒÜ˜GšM rÓ*ˆŒÜŒi˜Ñ'¨Ñ8°Ó8r   c                 óp  — | j                   ry | j                  |d   «      }|sy |D ]†  \  }}i }t        |j                  j                  «      |d<   |d   s|d   r|d    |d<   | j                  ||«      |d<   |d   r| j                  ||«      |d<   | j                  j                  |«       Œˆ d	| _         y )
NrY   r   r[   r\   r]   r^   r_   r`   T)	r   rd   r   re   rk   rl   rm   r   r$   )r   r   rp   rq   rr   rs   s         r   r   zModelList.init_with_context  sÉ   € Ø×ÒØØ×$Ñ$ W¨YÑ%7Ó8ˆÙØØ!ò 	-‰LˆE�5ØˆJÜ"*¨5¯;©;×+JÑ+JÓ"KˆJ�wÑØ�XŠ %¨¢-Ø.3°H©oÐ*=�
˜;Ñ'Ø*.×*DÑ*DÀUÈGÓ*T�
˜;Ñ'Ø�UŠ|Ø(,×(?Ñ(?ÀÀwÓ(O�
˜9Ñ%Ø�M‰M× Ñ  Õ,ð	-ð !ˆÕr   ©NNN)
r)   r*   r+   r,   r-   rU   rV   r   r   r8   r9   s   @r   rw   rw     s#   ø„ ñð =€HØ€FØ€Gõ9ö
!r   rw   c                   óN   ‡ — e Zd ZdZ ed«      ZdZdZdZdZ		 	 dˆ fd„	Z
d„ Zˆ xZS )	ÚRecentActionszD
    Module that lists the recent actions for the current user.
    zRecent actionsz/grappelli/dashboard/modules/recent_actions.htmlé
   Nc                 ó€   •— |xs g | _         |xs g | _        |j                  d|i«       t        t        | �  |fi |¤Ž y )NÚlimit)Úinclude_listÚexclude_listÚupdater6   r|   r   )r   r   r   r€   r�   r   r   s         €r   r   zRecentActions.__init__-  sB   ø€ à(Ò.¨BˆÔØ(Ò.¨BˆÔØ�‰�w Ð&Ô'ÜŒm˜TÑ+¨EÑ<°VÓ<r   c                 ó  ‡— | j                   ry ddlmŠ ddlm} |d   }ˆfd„}|j
                  €|j                  j                  «       }n0|j                  j                  |j
                  j                  ¬«      }| j                  r!|j                   || j                  «      «      }| j                  r!|j                   || j                  «      «      }|j                  dd«      d | j                   | _        d	| _         y )
Nr   )ÚQ)ÚLogEntryrY   c                 óÞ   •— ddl m} d }| D ]K  }t        ||«      r ‰|j                  ¬«      }n	 |j	                  d«      \  }} ‰||¬«      }|€|}ŒG||z  }ŒM |S #  t        d|z  «      ‚xY w)Nr   )ÚContentType)Úcontent_type__idú.zInvalid contenttype: "%s")Úcontent_type__app_labelÚcontent_type__model)Ú"django.contrib.contenttypes.modelsr‡   rH   ÚidÚsplitÚ
ValueError)rJ   r‡   ÚqsetÚcontenttypeÚcurrent_qsetrf   rq   r„   s          €r   Úget_qsetz1RecentActions.init_with_context.<locals>.get_qset<  s•   ø€ ÝFØˆDØ#ò /�Ü˜k¨;Ô7Ù#$°k·n±nÔ#E‘LðTØ+6×+<Ñ+<¸SÓ+AÑ(˜	 5ñ $%Ø09Ø,1ô$�Lð �<Ø'‘Dà ,Ñ.‘Dð/ð  ˆKøðTÜ(Ð)DÀ{Ñ)RÓSÐSús   °AÁA,)Úuser__pk__exactÚcontent_typeÚuserT)r   Údjango.db.modelsr„   Údjango.contrib.admin.modelsr…   r–   ÚobjectsÚallÚfilterÚpkr€   r�   rV   Úselect_relatedr   r   )r   r   r…   rY   r“   Úqsr„   s         @r   r   zRecentActions.init_with_context4  sÐ   ø€ Ø×ÒØÝ&Ý8à˜)Ñ$ˆô	ð* �<‰<ÐØ×!Ñ!×%Ñ%Ó'‰Bà×!Ñ!×(Ñ(¸¿¹¿¹Ð(ÓIˆBà×ÒØ—‘™8 D×$5Ñ$5Ó6Ó7ˆBØ×ÒØ—‘™H T×%6Ñ%6Ó7Ó8ˆBà×)Ñ)¨.¸&ÓAÀ+À4Ç:Á:ÐNˆŒØ ˆÕr   )Nr}   NN)r)   r*   r+   r,   rP   r   r-   r   r€   r�   r   r   r8   r9   s   @r   r|   r|   "  s9   ø„ ññ ÐÓ€EØ@€HØ€EØ€LØ€Là:>Ø"õ=ö(!r   r|   c                   óF   ‡ — e Zd ZdZ ed«      ZdZdZdZdˆ fd„	Z	d„ Z
ˆ xZS )ÚFeedz8
    Class that represents a feed dashboard module.
    zRSS Feedz%grappelli/dashboard/modules/feed.htmlNc                 óV   •— |j                  ||dœ«       t        t        | �  |fi |¤Ž y )N)Úfeed_urlr   )r‚   r6   r    r   )r   r   r¢   r   r   r   s        €r   r   zFeed.__init__i  s(   ø€ Ø�‰ 8°eÑ<Ô=ÜŒd�DÑ" 5Ñ3¨FÓ3r   c                 óü  — | j                   ry dd l}| j                  €t        d«      ‚	 dd l}|j                  | j                  «      }| j                  �|d   d | j                   }n|d   }|D ]P  }|j                  |_        	  |j                  |j                  dd Ž |_        | j                  j                  |«       ŒR d| _         y # t
        $ r! | j                  j                  dddœ«       Y y w xY w#  Y ŒVxY w)Nr   z!You must provide a valid feed URLz-You must install the FeedParser python moduleT)r   ÚwarningÚentriesr@   )r   Údatetimer¢   r�   Ú
feedparserÚImportErrorr   r$   Úparser   rN   r?   ÚdateÚupdated_parsed)r   r   r¦   r§   Úfeedr¥   Úentrys          r   r   zFeed.init_with_contextm  s  € Ø×ÒØÛØ�=‰=Ð ÜÐ@ÓAÐAð	Ûð ×Ñ §¡Ó.ˆØ�:‰:Ð!Ø˜9‘o k t§z¡zÐ2‰Gà˜9‘oˆGØò 	(ˆEØŸ
™
ˆEŒIðØ*˜XŸ]™]¨E×,@Ñ,@ÀÀ1Ð,EÐF�”
ð �M‰M× Ñ  Õ'ð	(ð !ˆÕøô) ò 	Ø�M‰M× Ñ ØIØñ"ô ñ ð	ûð áús   ªC
 Â!C7Ã
'C4Ã3C4Ã7C;rz   )r)   r*   r+   r,   rP   r   r-   r¢   r   r   r   r8   r9   s   @r   r    r    _  s,   ø„ ññ ˆj‹M€EØ6€HØ€HØ€Eõ4ö!r   r    N)r,   Údjango.appsr   rg   Údjango.utils.textr   Údjango.utils.translationr   rP   Úgrappelli.dashboard.utilsr   Úobjectr   r2   r;   rR   rw   r|   r    r   r   r   ú<module>r³      sz   ðñõ ,Ý &Ý 6å 9ôp�fô pôf/ˆOô /ôd!ˆô !ô@,!ˆoÐ2ô ,!ô^!�Ð!4ô !ô@:!�Oô :!ôz*!ˆ?õ *!r   