o
    Œ#iÙ  ã                   @   s:   d dl mZ d dlmZ d dlmZ G dd„ dejƒZdS )é    )Úsettings)Úmodels)ÚFieldDoesNotExistc                       sR   e Zd ZdZd‡ fdd„	Zdd„ Zd‡ fdd	„	Zdd
d„Zdd„ Zdd„ Z	‡  Z
S )ÚHostSiteManageraÉ  
    A model manager to limit objects to those associated with a site.

    :param field_name: the name of the related field pointing at the
                       :class:`~django.contrib.sites.models.Site` model,
                       or a series of relations using the
                       ``field1__field2__field3`` notation. Falls back
                       to looking for 'site' and 'sites' fields.
    :param select_related: a boolean specifying whether to use
                           :meth:`~django.db.models.QuerySet.select_related`
                           when querying the database

    Define a manager instance in your model class with one
    of the following notations::

        on_site = HostSiteManager()  # automatically looks for site and sites
        on_site = HostSiteManager("author__site")
        on_site = HostSiteManager("author__blog__site")
        on_site = HostSiteManager("author__blog__site",
                                  select_related=False)

    Then query against it with one of the manager methods::

        def home_page(request):
            posts = BlogPost.on_site.by_request(request).all()
            return render(request, 'home_page.html', {'posts': posts})

    NTc                    s&   t ƒ  ¡  || _|| _d| _d| _d S )Né   F)ÚsuperÚ__init__Ú_field_nameÚ_select_relatedÚ_depthÚ_is_validated)ÚselfÚ
field_nameÚselect_related©Ú	__class__© ú\/var/www/GraceOrthoHospital/venv_grace/lib/python3.10/site-packages/django_hosts/managers.pyr   $   s
   

zHostSiteManager.__init__c              	   C   sð   d }| j d ur1| j  dd¡}t|ƒ}|| jkr|| _|d }z	| jj |¡}W n+ ty0   Y n#w dD ]}z	| jj |¡}W n tyI   d }Y q3w | | _ }d| _ |ret	|t
jt
jfƒsdtd| ƒ‚ntd| jj|| jjjf ƒ‚d| _d S )NÚ__r   r   )ÚsiteÚsitesTz+%s must be a ForeignKey or ManyToManyField.z(%s couldn't find a field named %s in %s.)r	   ÚsplitÚlenr   ÚmodelÚ_metaÚ	get_fieldr   r   Ú
isinstancer   Ú
ForeignKeyÚManyToManyFieldÚ	TypeErrorÚ
ValueErrorr   Ú__name__Úobject_name)r   ÚfieldÚ
name_partsÚ	rel_depthr   Úpotential_namer   r   r   Ú_validate_field_name+   sF   

ÿÿ
ÿÿþÿÿ
z$HostSiteManager._validate_field_namec                    s@   |d u rt j}| js|  ¡  tƒ  ¡ }|jdi d| j |i¤ŽS )Nz%s__id__exactr   )r   ÚSITE_IDr   r'   r   Úget_querysetÚfilterr	   )r   Úsite_idÚqsr   r   r   r)   O   s   
zHostSiteManager.get_querysetc                 C   s
   |   |¡S )zç
        Returns a queryset matching the given site id. If not given
        this falls back to the ``SITE_ID`` setting.

        :param site_id: the ID of the site
        :rtype: :class:`~django.db.models.query.QuerySet`
        )r)   )r   r+   r   r   r   Úby_idW   s   
zHostSiteManager.by_idc                 C   s(   t |dƒr
|jdu r|  ¡ S |  |j¡S )zù
        Returns a queryset matching the given request's site
        attribute.

        :param request: the current request
        :type request: :class:`~django.http.HttpRequest`
        :rtype: :class:`~django.db.models.query.QuerySet`
        r   N)Úhasattrr   ÚnoneÚby_site)r   Úrequestr   r   r   Ú
by_requesta   s   	zHostSiteManager.by_requestc                 C   s   |   |j¡S )zÜ
        Returns a queryset matching the given site.

        :param site: a site instance
        :type site: :class:`~django.contrib.sites.models.Site`
        :rtype: :class:`~django.db.models.query.QuerySet`
        )r-   Úid)r   r   r   r   r   r0   n   s   zHostSiteManager.by_site)NT)N)r!   Ú
__module__Ú__qualname__Ú__doc__r   r'   r)   r-   r2   r0   Ú__classcell__r   r   r   r   r      s    $

r   N)Údjango.confr   Ú	django.dbr   Údjango.core.exceptionsr   ÚManagerr   r   r   r   r   Ú<module>   s    