
    h                         S SK r S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr   " S	 S
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)gettext_lazy)
exceptions)unicode_http_header_reverse)api_settings)replace_query_param)
_MediaTypec                   r    \ rS rSr\R
                  r\R                  r\R                  r
S rSS jrS rSrg)BaseVersioning   c                 ^    Sn[        UR                  U R                  R                  S95      e)Nz.{cls}.determine_version() must be implemented.)cls)NotImplementedErrorformat	__class____name__)selfrequestargskwargsmsgs        K/var/www/html/env/lib/python3.13/site-packages/rest_framework/versioning.pydetermine_version BaseVersioning.determine_version   s1    >!#**'' #- #
  	    Nc                     [        XX4U40 UD6$ Nr   )r   viewnamer   r   r   r   extras          r   reverseBaseVersioning.reverse   s    I5IIr   c                     U R                   (       d  gUS L=(       a    XR                  :H  =(       d    XR                   ;   $ )NT)allowed_versionsdefault_version)r   versions     r   is_allowed_version!BaseVersioning.is_allowed_version   s:    $$$H4H4H)H 3111	4r    NNNN)r   
__module____qualname____firstlineno__r   DEFAULT_VERSIONr%   ALLOWED_VERSIONSr$   VERSION_PARAMversion_paramr   r!   r'   __static_attributes__r)   r   r   r   r      s4    "22O#44 ..MJ4r   r   c                   .    \ rS rSrSr\" S5      rS rSrg)AcceptHeaderVersioning"   zR
GET /something/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
z#Invalid version in "Accept" header.c                    [        UR                  5      nUR                  R                  U R                  U R
                  5      n[        U5      nU R                  U5      (       d   [        R                  " U R                  5      eU$ r   )r
   accepted_media_typeparamsgetr1   r%   r   r'   r   NotAcceptableinvalid_version_message)r   r   r   r   
media_typer&   s         r   r   (AcceptHeaderVersioning.determine_version*   sm     ; ;<
##''(:(:D<P<PQ%g.&&w//**4+G+GHHr   r)   N)	r   r+   r,   r-   __doc___r;   r   r2   r)   r   r   r4   r4   "   s    
   EFr   r4   c                   F   ^  \ rS rSrSr\" S5      rS rSU 4S jjrSr	U =r
$ )URLPathVersioning6   a  
To the client this is the same style as `NamespaceVersioning`.
The difference is in the backend - this implementation uses
Django's URL keyword arguments to determine the version.

An example URL conf for two views that accept two different versions.

urlpatterns = [
    re_path(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
    re_path(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
]

GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
zInvalid version in URL path.c                     UR                  U R                  U R                  5      nUc  U R                  nU R                  U5      (       d   [        R
                  " U R                  5      eU$ r   )r9   r1   r%   r'   r   NotFoundr;   r   r   r   r   r&   s        r   r   #URLPathVersioning.determine_versionI   s[    **T//1E1EF?**G&&w//%%d&B&BCCr   c                    > UR                   b#  U R                  UR                   0U=(       d    0 En[        TU ]  " XX4U40 UD6$ r   )r&   r1   superr!   r   r   r   r   r   r   r    r   s          r   r!   URLPathVersioning.reverseR   sQ    ??&""GOO<RF
 wFV
7<
 	
r   r)   r*   r   r+   r,   r-   r>   r?   r;   r   r!   r2   __classcell__r   s   @r   rA   rA   6   s%        >?	
 	
r   rA   c                   L   ^  \ rS rSrSr\" S5      rS rSU 4S jjrS r	Sr
U =r$ )	NamespaceVersioning^   a[  
To the client this is the same style as `URLPathVersioning`.
The difference is in the backend - this implementation uses
Django's URL namespaces to determine the version.

An example URL conf that is namespaced into two separate versions

# users/urls.py
urlpatterns = [
    path('/users/', users_list, name='users-list'),
    path('/users/<int:pk>/', users_detail, name='users-detail')
]

# urls.py
urlpatterns = [
    path('v1/', include('users.urls', namespace='v1')),
    path('v2/', include('users.urls', namespace='v2'))
]

GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
zBInvalid version in URL path. Does not match any version namespace.c                    [        USS 5      nUb  UR                  (       d  U R                  $ UR                  R                  S5      nU H  nU R	                  U5      (       d  M  Us  $    [
        R                  " U R                  5      e)Nresolver_match:)getattr	namespacer%   splitr'   r   rD   r;   )r   r   r   r   rR   possible_versionsr&   s          r   r   %NamespaceVersioning.determine_versionx   s}     *:DA!)A)A''' +44::3?(G&&w// ) !!$">">??r   c                 f   > UR                   b  U R                  X5      n[        TU ]  " XX4U40 UD6$ r   )r&   get_versioned_viewnamerH   r!   rI   s          r   r!   NamespaceVersioning.reverse   s=    ??&228EHwFV
7<
 	
r   c                 &    UR                   S-   U-   $ )NrS   )r&   )r   r   r   s      r   rZ   *NamespaceVersioning.get_versioned_viewname   s    $x//r   r)   r*   )r   r+   r,   r-   r>   r?   r;   r   r!   rZ   r2   rL   rM   s   @r   rO   rO   ^   s+    .   de
@
0 0r   rO   c                   R    \ rS rSrSr\R                  " S5      r\" S5      r	S r
Srg)HostNameVersioning   zH
GET /something/ HTTP/1.1
Host: v1.example.com
Accept: application/json
z,^([a-zA-Z0-9]+)\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+$zInvalid version in hostname.c                 4   UR                  5       R                  S5      u  pEnU R                  R                  U5      nU(       d  U R                  $ UR                  S5      nU R                  U5      (       d   [        R                  " U R                  5      eU$ )NrS      )
get_host	partitionhostname_regexmatchr%   groupr'   r   rD   r;   )	r   r   r   r   hostname	separatorportrf   r&   s	            r   r   $HostNameVersioning.determine_version   s    $+$4$4$6$@$@$E!T##))(3'''++a.&&w//%%d&B&BCCr   r)   N)r   r+   r,   r-   r>   recompilere   r?   r;   r   r2   r)   r   r   r_   r_      s)    
 ZZ OPN >?r   r_   c                   F   ^  \ rS rSrSr\" S5      rS rSU 4S jjrSr	U =r
$ )QueryParameterVersioning   zQ
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
z#Invalid version in query parameter.c                     UR                   R                  U R                  U R                  5      nU R	                  U5      (       d   [
        R                  " U R                  5      eU$ r   )query_paramsr9   r1   r%   r'   r   rD   r;   rE   s        r   r   *QueryParameterVersioning.determine_version   sS    &&**4+=+=t?S?ST&&w//%%d&B&BCCr   c                    > [         TU ]  " XX4U40 UD6nUR                  b   [        XpR                  UR                  5      $ U$ r   )rH   r!   r&   r	   r1   )	r   r   r   r   r   r   r    urlr   s	           r   r!    QueryParameterVersioning.reverse   sH    goFV
7<
 ??&&s,>,>PP
r   r)   r*   rK   rM   s   @r   ro   ro      s%    
   EF r   ro   )rl   django.utils.translationr   r?   rest_frameworkr   rest_framework.compatr   rest_framework.reverser   rest_framework.settingsr   *rest_framework.templatetags.rest_frameworkr	   rest_framework.utils.mediatypesr
   r   r4   rA   rO   r_   ro   r)   r   r   <module>r~      se    	 6 % 5 + 0 J 64 4*^ (%
 %
P.0. .0b .~ r   