
    h                         d Z ddlZddlZ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	gZej                  j                  d
dddd      Z G d de      Z G d de      Zy)z
PolymorphicModel Meta Class
    N)models)	ModelBase   )PolymorphicManager)PolymorphicQuerySetinstance_ofnot_instance_ofdjangocore
managementcommandszdumpdata.pyc                       e Zd Zy)ManagerInheritanceWarningN)__name__
__module____qualname__     @/home/dcms/DCMS/lib/python3.12/site-packages/polymorphic/base.pyr   r      s    r   r   c                        e Zd ZdZ fdZe fd       Zed        Zed        Ze	d        Z
e	d        Ze	 fd       Z xZS )	PolymorphicModelBasea  
    Manager inheritance is a pretty complex topic which may need
    more thought regarding how this should be handled for polymorphic
    models.

    In any case, we probably should propagate 'objects' and 'base_objects'
    from PolymorphicModel to every subclass. We also want to somehow
    inherit/propagate _default_manager as well, as it needs to be polymorphic.

    The current implementation below is an experiment to solve this
    problem with a very simplistic approach: We unconditionally
    inherit/propagate any and all managers (using _copy_to_model),
    as long as they are defined on polymorphic models
    (the others are left alone).

    Like Django ModelBase, we special-case _default_manager:
    if there are any user-defined managers, it is set to the first of these.

    We also require that _default_manager as well as any user defined
    polymorphic managers produce querysets that are derived from
    PolymorphicQuerySet.
    c                    |s|dk(  rt        |   | |||fi |S  | j                  |||fi |}| j                  |       |j                  j
                  s3|j                  j                  s| j                  |j                  |d       d|_	        |j                  j                  D ]?  }|j                  st        |      t        j                  k7  s-|j                  |_         |S  |S )NNewBaseobjectsF)super__new__call_superclass_new_methodvalidate_model_fields_metaabstractswappedvalidate_model_managerr   (polymorphic_super_sub_accessors_replacedfieldsprimary_keytyper   OneToOneFieldnamepolymorphic_primary_key_name)self
model_namebasesattrskwargs	new_classf	__class__s          r   r   zPolymorphicModelBase.__new__7   s    y07?4UELVLL 4D33JuWPVW	 	""9- ''	0G0G''	(9(9:yQ >C	: '' 	A}}aF,@,@!@9:	6	
 r   c                     |j                  dd      }|xr  |d   dk(  xr |dk(  xr t        |dd      du }|rd|_        t        |   | |||fi |}|r|`|S )zcall __new__ method of super class and return the newly created class.
        Also work around a limitation in Django's ModelBase.MetaNr   polymorphicPolymorphicModel	app_labelpoly_dummy_app_label)getgetattrr6   r   r   )	r*   r+   r,   r-   r.   metado_app_label_workaroundr/   r1   s	           r   r   z/PolymorphicModelBase.call_superclass_new_methodR   s     yy& 9l#}49009 k40D8	 	  #3DNGOD*eUMfM	"r   c                     |j                   j                  D ]:  }|j                  t        v st	        d|j
                   d|j                   d       y)zPcheck if all fields names are allowed (i.e. not in POLYMORPHIC_SPECIAL_Q_KWORDS)PolymorphicModel: "z" - field name "z&" is not allowed in polymorphic modelsN)r   r$   r(   POLYMORPHIC_SPECIAL_Q_KWORDSAssertionErrorr   )r*   r/   r0   s      r   r   z*PolymorphicModelBase.validate_model_fieldsj   s\     '' 	Avv55$))*<*<)= >##$66(*PR 	r   c           	      T   t        t        |      t              sBd}d| d| dt        |      j                   d| d	}t	        j
                  |t        d       |S t        |d	d
      rt        |j                  t              s%d| d| d}t	        j
                  |t        d       |S )zcheck if the manager is derived from PolymorphicManager
        and its querysets from PolymorphicQuerySet - throw AssertionError if not r=   .z" manager is of type "z0", but must be a subclass of PolymorphicManager.z! to support retrieving subclasses   
stacklevelqueryset_classNzp" has been instantiated with a queryset class which is not a subclass of PolymorphicQuerySet (which is required))

issubclassr&   r   r   warningswarnr   r9   rF   r   )r*   managerr+   manager_nameextraes         r   r"   z+PolymorphicModelBase.validate_model_managert   s    
 $w-);<E%j\<.@VW[\cWdWmWmVn o@@EwFgi  MM!61ENw 0$7z""$7@
 &j\<. AU V  MM!61Er   c                     t        j                  d| j                  j                   dt        d       | j
                  S )Nz7Using PolymorphicModel.base_objects is deprecated.
Use z#.objects.non_polymorphic() instead.   rD   )rH   rI   r1   r   DeprecationWarning_base_objects)r*   s    r   base_objectsz!PolymorphicModelBase.base_objects   s@    >>**++NP		
 !!!r   c                 J    t        j                         }d|_        | |_        |S )NrR   )r   Managerr(   model)r*   rJ   s     r   rQ   z"PolymorphicModelBase._base_objects   s#     .."%r   c                 ^   t        t        j                        dkD  rDt        j                  d   dk(  r.t        j                         d   }t
        |d   v r| j                  S t        |    }t        |t              s1t        j                  | j                  j                   dt               |S )Nr   dumpdataz-._default_manager is not a PolymorphicManager)lensysargvinspectstackDUMPDATA_COMMANDrQ   r   _default_manager
isinstancer   rH   rI   r1   r   r   )r*   frmrJ   r1   s      r   r^   z%PolymorphicModelBase._default_manager   s    sxx=1!
!: --/!$C3q6))))'*'#56MM>>**++XY)
 r   )r   r   r   __doc__r   classmethodr   r   r"   propertyrR   rQ   r^   __classcell__)r1   s   @r   r   r      s    .6  .    . " "    r   r   )ra   r[   osrY   rH   	django.dbr   django.db.models.baser   managersr   queryr   r>   pathjoinr]   RuntimeWarningr   r   r   r   r   <module>rm      sg     	 
   + ( & !./@A 77<<&,
MZ 	 	Y9 Yr   