
    	]jN                        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lmZ ddlm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mZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ 	 ddl,m-Z-m.Z.  ej`                  e1      Z2ed        Z3	 	 	 	 	 d5dZ4ed        Z5 G d de6      Z7ed        Z8ed        Z9ed6d       Z:ed        Z;d Z<d7dZ=ej|                  ej~                  j                  d               ZAd  ZBd! ZCd" ZDd# ZEd8d$ZFd% ZGd& ZHd' ZId( ZJd) ZKd* ZLd9d+ZMd, ZNd- ZOd. ZPd:d/ZQd;d0ZRd<d1eSd2eTd3eSfd4ZUy# e/$ r dxZ-Z.Y w xY w)=zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)contextmanager)deepcopywraps)PathSimpleNamespace)mockflag_set)ConvertedFormatExport)apps)settings)Client)	MLBackend)Organization)Project)TaskWithAnnotationsSerializerUser)BillingPlanBusinessc               +   ~   K   t        j                  d      5 }t        |fi |  d d d        y # 1 sw Y   y xY ww)NT	real_http)requests_mockMockerregister_ml_backend_mock)kwargsms     B/root/env/lib/python3.12/site-packages/label_studio/tests/utils.pyml_backend_mockr#   $   s:     				- 4&q3F334 4 4s   =1	=:=c                 t   | j                  | dt        j                  d|d             |r/| j                  | dt        j
                  j                         n+| j                  | dt        j                  ddi             | j                  | d	t        j                  d|d
             | j                  | dt        j                  |xs i              | j                  | dt        j                  i              | j                  | dt        j                  dddgi             | S )Nz/setupok)statusmodel_version)textz/health)excr&   UPz/train)r&   job_idz/predictz/webhookz	/versionsversions12)postjsondumpsgetrequests
exceptionsConnectTimeout)r!   urlpredictionshealth_connect_timeouttrain_job_idsetup_model_versions         r"   r   r   *   s    FFcU&>

dM`+a bFc	Wo8#6#6#E#EF	WoDJJ$/?$@AFFcU&>

dl+S TFUFFcU($**[->B"?F@FFcU($**R.F1EESE
$**j3*-E"FEGH    c            	   +   V  K   t        j                  d      5  t        j                  d      5 }t	        dd      5 }t        j                  d      }|j                  ||ddi	       | d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY ww)
Nz!core.utils.io.validate_upload_urlTr   z&./tests/test_suites/samples/test_1.csvrbz"data\.heartextest\.net/test_1\.csvzContent-Length100)bodyheaders)r
   patchr   r   openrecompiler2   )r    r!   fmatchers       r"   import_from_url_mockrG   >   s     	7	8 !!D1 	Q>E **%IJgA0@%/HI		  	 	 sJ   B)BB0B,B4B<	B)B
BB	BB&"B)c                       e Zd Zd Zy)_TestJobc                     || _         y Nid)selfr+   s     r"   __init__z_TestJob.__init__K   s	    r;   N)__name__
__module____qualname__rO    r;   r"   rI   rI   J   s    r;   rI   c               #      K   ddl m}  t        j                  j	                  | d      5  d  d d d        y # 1 sw Y   y xY ww)Nr   EmailMultiAlternativessend)django.core.mailrV   r
   rA   objectrU   s    r"   
email_mockrZ   O   s5     7			16	:   s   'A7	AA Ac               #   (  K   ddl m ddlm}  d  G d d       G fdd       G fd	d
      }t        j
                  j                  | d |             5  t        j                  d       |  d d d        y # 1 sw Y   y xY ww)Nr   
namedtuple)storagec                 \   | dv r"g d}t         j                  d|  d| d       |S | j                  d      r!dg}t         j                  d|  d| d       |S | j                  d	      r"g d
}t         j                  d|  d| d       |S g d
}t         j                  d|  d| d       |S )N)zpytest-recursive-scan-bucket)zdataset/zdataset/a.jsonzdataset/sub/b.jsonzother/c.jsonz!get_sample_blob_names_for_bucket(z) -> z (recursive scan bucket)
multitask_z	test.jsonz (multitask)ztest-gs-bucketabcdefghiz (test-gs-bucket prefix)z
 (default))loggerinfo
startswith)bucket_nameresults     r"    get_sample_blob_names_for_bucketz9gcs_client_mock.<locals>.get_sample_blob_names_for_bucketa   s    ::YFKK;K=fXUmnoM##L1!]FKK;K=fXUabcM##$45*FKK;K=fXUmnoM*FKK;K=fXU_`aMr;   c                   *    e Zd Zd Zd Zd Zd Zd Zy)%gcs_client_mock.<locals>.DummyGCSBlobc                     || _         || _        || _        || _        |rddddiddddig| _        y ddd	d
dd| _        y )Ndatazhttp://ggg.com/image.jpgzTask 1 text)	image_urlr(   zhttp://ggg.com/image2.jpgzTask 2 texttest{   wow  onetwo	str_field	int_field
dict_field)keyrh   nameis_jsonsample_json_contents)rN   rh   r{   r}   is_multitasks        r"   rO   z.gcs_client_mock.<locals>.DummyGCSBlob.__init__v   sm    DH*DDI"DL   +E}]^+FP]^_ % "(!$*/"< %r;   c           
      T   d| j                    }| j                  r\t        j                  | j                        }t
        j                  d| j                   d| j                    dt        |              |S t
        j                  d| j                   d| j                    d       |S )N
test_blob_z'DummyGCSBlob.download_as_string bucket= key=z json=True bytes=z json=False)	r{   r}   r0   r1   r~   re   rf   rh   len)rN   rn   payloads      r"   download_as_stringz8gcs_client_mock.<locals>.DummyGCSBlob.download_as_string   s    z*D||**T%>%>?=d>N>N=OuUYU]U]T^^opst{p|o}~ KKA$BRBRASSXY]YaYaXbbmnoKr;   c                 :    t        d| d| j                          y NzString z uploaded to bucket )printrh   )rN   strings     r"   upload_from_stringz8gcs_client_mock.<locals>.DummyGCSBlob.upload_from_string   s    GF8#78H8H7IJKr;   c                 n    d| j                    d| j                   }t        j                  d|        |S )Nhttps://storage.googleapis.com//z%DummyGCSBlob.generate_signed_url url=)rh   r{   re   rf   )rN   r    r6   s      r"   generate_signed_urlz9gcs_client_mock.<locals>.DummyGCSBlob.generate_signed_url   s8    3D4D4D3EQtxxjQCKK?uEFJr;   c           
          | j                         j                  d      }t        j                  d| j                   d| j
                   dt        |              |S )Nutf-8z&DummyGCSBlob.download_as_bytes bucket=r   z size=)r   encodere   rf   rh   r{   r   )rN   bs     r"   download_as_bytesz7gcs_client_mock.<locals>.DummyGCSBlob.download_as_bytes   sY    '')009AKK@AQAQ@RRWX\X`X`WaaghklmhngopqHr;   N)rP   rQ   rR   rO   r   r   r   r   rS   r;   r"   DummyGCSBlobrl   u   s    	&			L	
	r;   r   c                   ,    e Zd ZfdZfdZ fdZy)'gcs_client_mock.<locals>.DummyGCSBucketc                 J    || _         || _        || _         |      | _        y rK   )r|   r}   r   sample_blob_names)rN   rh   r}   r   rj   s       r"   rO   z0gcs_client_mock.<locals>.DummyGCSBucket.__init__   s&    #DI"DL ,D%Ek%RD"r;   c           
          ddg      }d|v r(t         j                  d| j                   d| d       g S d|v r|d   r|d   }|xs d}|rb|j                  |      r|n||z   }g }| j                  D ]8  }|j                  |      s|t        |      d  }	||	vs(|j                  |       : n| j                  D cg c]	  }||vs| }}t         j                  d| j                   d| d	| d
|        |D cg c]
  } ||       c}S | j                  D cg c]  }||j                  |      s| }
}t         j                  d| j                   d| d
|
        |
D cg c]
  } ||       c}S c c}w c c}w c c}w c c}w )NFiler|   fakez!DummyGCSBucket.list_blobs bucket= prefix=z -> [] (fake)	delimiter  delimiter= -> )re   rf   r|   endswithr   rg   r   append)rN   prefixr    r   r   prefsearch_prefixfiltered_namesr|   remaining_pathri   r]   s              r"   
list_blobsz2gcs_client_mock.<locals>.DummyGCSBucket.list_blobs   s   fvh/D?		{(SYRZZghi	 f$)<";/	|,0MM),DD$QZJZM%'N $ 6 6 <??=9-1#m2D2F-GN(> . 5 5d ;	< 8<7M7M%gtQZbfQfd%gN%g7		{(6(R]^g]hhlm{l|} 0>>tT
>>'+'='=ktSWSbSbciSjdkFkKK;DII;hvhVZ[aZbcd+124DJ22 &h ?k2s$   >	E:E:=E?F6F(F	c                     t         j                  d| j                   d|         | j                  || j                  | j                        S )NzDummyGCSBucket.blob bucket=r   )re   rf   r|   r}   r   )rN   r{   r   s     r"   blobz,gcs_client_mock.<locals>.DummyGCSBucket.blob   s@    KK5dii[cUKL		3d>O>OPPr;   N)rP   rQ   rR   rO   r   r   )r   rj   r]   s   r"   DummyGCSBucketr      s    	S	3<	Qr;   r   c                   &    e Zd ZfdZd fd	Zy)'gcs_client_mock.<locals>.DummyGCSClientc                     |j                  d      }|j                  d      }t        j                  d| d| d|         |||      S )N_JSONr`   z!DummyGCSClient.get_bucket bucket=z	 is_json=z is_multitask=)r   rg   re   rf   )rN   rh   r}   r   r   s       r"   
get_bucketz2gcs_client_mock.<locals>.DummyGCSClient.get_bucket   sY    !**73G&11,?LKK3K=	'R`am`no "+wEEr;   Nc           
         |j                  d      }|j                  d      } |      }|r|xs d}|rX|j                  |      r|n||z   }g }	|D ]8  }
|
j                  |      s|
t        |      d  }||vs(|	j                  |
       : n|D 
cg c]	  }
||
vs|
 }	}
t        j                  d| d| d| d|	        |	D 
cg c]  }
 ||
||       c}
S |D 
cg c]  }
||
j                  |      s|
 }}
t        j                  d| d| d|        |D 
cg c]   }
||
j                  |      r ||
||      " c}
S c c}
w c c}
w c c}
w c c}
w )Nr   r`   r   z!DummyGCSClient.list_blobs bucket=r   r   r   )r   rg   r   r   re   rf   )rN   rh   r   r   r}   r   r   r   r   r   r|   r   ri   r   rj   s                r"   r   z2gcs_client_mock.<locals>.DummyGCSClient.list_blobs   s   !**73G&11,?L @ M |,0MM),DD$QZJZM%'N 1 <??=9-1#m2D2F-GN(> . 5 5d ;	< 8I%btI]aLad%bN%b7}HVHT_`i_jjno}n~ \jjSW[$Njj'8ftFNdoo^dNedfFfKK;K=QWPXX\]c\def .>T__V%< [$F  &c kfs$   	E	E	E E9E!%ErK   )rP   rQ   rR   r   r   )r   r   rj   s   r"   DummyGCSClientr      s    	F	r;   r   r   return_valuezgcs_client_mock installed)	collectionsr]   google.cloudr^   r
   rA   rY   re   rf   )google_storager   r   r   rj   r]   s     @@@@r"   gcs_client_mockr   W   s|      '6(* *X(Q (QT' 'R 
		>8.BR		S /0  s   AB#B=	BBBc              #      K   ddl m} ddlm}  |ddg       xs	 dddd	d
d xs g d G  fdd       G fdd       G fdd      }t        j
                  j                  |j                  d |             5  t        j
                  j                  |dd      5  d  d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY ww)Nr   r\   )modelsr   r|   rp   rq   rr   rs   rt   rw   ra   c                   :    e Zd Zd Zd Zd Zd Z fdZ fdZy))azure_client_mock.<locals>.DummyAzureBlobc                      || _         || _        y rK   )r{   container_name)rN   r   r{   s      r"   rO   z2azure_client_mock.<locals>.DummyAzureBlob.__init__  s    DH"0Dr;   c                      d| j                    S )Nr   )r{   )rN   s    r"   r   z<azure_client_mock.<locals>.DummyAzureBlob.download_as_string  s    z**r;   c                 :    t        d| d| j                          y r   )r   r   )rN   r   	overwrites      r"   upload_blobz5azure_client_mock.<locals>.DummyAzureBlob.upload_blob  s    GF8#78K8K7LMNr;   c                 :    d| j                    d| j                   S )Nr   r   )r   r{   rN   r    s     r"   r   z=azure_client_mock.<locals>.DummyAzureBlob.generate_signed_url  s     4T5H5H4I488*UUr;   c                 .    t        j                        S rK   )r0   r1   rN   r~   s    r"   content_as_textz9azure_client_mock.<locals>.DummyAzureBlob.content_as_text  s    ::233r;   c                 L    t        j                        j                  d      S )Nr   )r0   r1   r   r   s    r"   content_as_bytesz:azure_client_mock.<locals>.DummyAzureBlob.content_as_bytes  s    ::23::7CCr;   N)	rP   rQ   rR   rO   r   r   r   r   r   )r~   s   r"   DummyAzureBlobr     s$    	1	+	O	V	4	Dr;   r   c                   F    e Zd ZfdZfdZfdZ fdZd Z fdZy).azure_client_mock.<locals>.DummyAzureContainerc                 4    || _         t              | _        y rK   )r|   r   r   )rN   r   r    r   s      r"   rO   z7azure_client_mock.<locals>.DummyAzureContainer.__init__!  s    &DI%-.?%@D"r;   c                 N    | j                   D cg c]
  } |       c}S c c}w rK   r   )rN   name_starts_withr|   r   s      r"   r   z9azure_client_mock.<locals>.DummyAzureContainer.list_blobs%  !    +/+A+AB4DJBBB   "c                 N    | j                   D cg c]
  } |       c}S c c}w rK   r   )rN   r   r   r|   r   s       r"   
walk_blobsz9azure_client_mock.<locals>.DummyAzureContainer.walk_blobs(  r   r   c                 *     | j                   |      S rK   r|   rN   r{   r   s     r"   get_blob_clientz>azure_client_mock.<locals>.DummyAzureContainer.get_blob_client+      !$))S11r;   c                 4    t        ddddddddddid	d
d      S )Nztest-containerz2022-01-01 01:01:01z	test-etagz
test-leasepublicTr{   valuez
test-scopeFz1.0.0)r|   last_modifiedetagleasepublic_accesshas_immutability_policyhas_legal_hold)immutable_storage_with_versioning_enabledmetadataencryption_scopedeletedversionr   r   s     r"   get_container_propertieszGazure_client_mock.<locals>.DummyAzureContainer.get_container_properties.  s8    "%3 "&(,#:>)!- r;   c                 *     | j                   |      S rK   r   r   s     r"   download_blobz<azure_client_mock.<locals>.DummyAzureContainer.download_blob>  r   r;   N)	rP   rQ   rR   rO   r   r   r   r   r   )r   r   r   s   r"   DummyAzureContainerr      s$    	A	C	C	2	 	2r;   r   c                       e Zd Z fdZy)+azure_client_mock.<locals>.DummyAzureClientc                      |      S rK   rS   )rN   r   r   s     r"   get_container_clientz@azure_client_mock.<locals>.DummyAzureClient.get_container_clientB  s    &~66r;   N)rP   rQ   rR   r   )r   s   r"   DummyAzureClientr   A  s    	7r;   r   from_connection_stringr   generate_blob_sastoken)r   r]   io_storages.azure_blobr   r
   rA   rY   BlobServiceClient)r~   r   r]   r   r   r   r   r   s   ``   @@@r"   azure_client_mockr      s      '-fvh'D/ #C04
 *B-BD D(2 2B7 7 
		6335M\l\n		o ZZv':Q 		 	 	 s6   BC
#C-C2C:	CC	CCCc               #      K   ddl m}  ddlm}  | d      }t        j
                  j                  |d|      5  | d d d        y # 1 sw Y   y xY ww)Nr   )	FakeRedis)RedisStorageMixinT)decode_responsesget_redis_connectionr   )	fakeredisr   io_storages.redis.modelsr   r
   rA   rY   )r   r   rediss      r"   redis_client_mockr   M  sM     #:t,E 
		,.DSX		Y   s   8AA	AAAc                     t        |d      j                  }|D cg c]  }|d   |d   d }}| j                  d|j                   d|d	      S c c}w )
NT)manyrn   annotations)rn   r  /api/projects/z/tasks/bulkapplication/jsonrn   content_type)r   rn   r/   rM   )clientprojecttaskstaskrn   s        r"   upload_datar  Y  s^    )%d;@@ESXY4T&\$}2EFYDY;;

|;?dYk;ll Zs   Ac                     |.t         j                  j                  |      j                         }t	        j                  j
                  d||d| }|r!t        j                  j                  |d       |S )N)
created_by)r  organizationzhttp://localhost:8999)r  r6   rS   )r   objectsfilterfirstr   creater   )configuseruse_ml_backendteam_idorgr  s         r"   make_projectr  _  si    
{""))T):@@Boo$$Q3Q&QG  6M NNr;   c                     t        dd      }| j                  dt        j                  |      d      }|j                         d   S )Ntest_projectz<View><Text name="text" value="$text"/><Choices name="test_batch_predictions" toName="text"><Choice value="class_A"/><Choice value="class_B"/></Choices></View>)titlelabel_configr  r  r  rM   )dictr/   r0   r1   )business_clientr   responses      r"   
project_idr   i  sS      wG ##ZZ ' $ H
 ==?4  r;   c                 `    ddl m}  |j                  j                  d||j                  d| S )Nr   )Task)r  overlaprS   )tasks.modelsr"  r  r  maximum_annotations)r  r  r"  s      r"   	make_taskr&  x  s-    !4<<^w8S8S^W]^^r;   c                      y rK   rS   )r  s    r"   create_businessr(  ~  s    r;   c                     ddl m}m} |j                  j	                  |      } |j                  j
                  d|j                  |d| S )Nr   )
Annotationr"  pk)r   task_idrS   )r$  r*  r"  r  r2   r  r   )r  r-  r*  r"  r
  s        r"   make_annotationr.    sD    -<<w'D$:$$[[TZ[[r;   c                     ddl m}m} |j                  j	                  |      } |j                  j
                  d||j                  d| S )Nr   )
Predictionr"  r+  )r-  r  rS   )r$  r0  r"  r  r2   r  r  )r  r-  r0  r"  r
  s        r"   make_predictionr1    sC    -<<w'D$:$$UWdllUfUUr;   c                    ddl m}  |j                  j                  di | }|j	                  d       |j                          t        |       |rVt        j                  ||j                         |
t               }t        || d   d      j                  }|dk(  s
J d|        |j                  |       |r	||_        |S |S )	Nr   r   12345)r  r  email.  zSign-in status code: rS   )users.modelsr   r  r  set_passwordsaver(  r   create_organization
first_namer   signinstatus_codeadd_collaborator	annotator)r  r  loginr  r   r  signin_status_codes          r"   make_annotatorrA    s    !4<<((DgIIKD((DP>XF#FF7OWEQQ!S(V,ABTAU*VV(T"Kr;   c                     t        j                  d      r| j                  d|j                   d      S t	        d      S )N
annotatorsz/annotator/invites/r      )r<  )r   is_installedr2   r   r	   )r  r  s     r"   invite_client_to_projectrF    s8    &zz/a@AA3//r;   c                 <   t         j                  j                  |      j                         r7| j	                  d||d      }|j
                  dk(  sJ |j
                         y | j	                  d||dd      }|j
                  dk(  sJ |j
                         y )	N)r4  /user/login/r4  passwordrn   r5  z/user/signup/Whatever)r4  rJ  r  )r   r  r  existsr/   r<  )r  r4  rJ  rs       r"   r?  r?    s    ||'..0KKu(-SKT}}#2Q]]2#KK8^h.iKj}}#2Q]]2#r;   c                 .    | j                  d||d      S )NrH  rI  rK  )r/   )r  r4  rJ  s      r"   r;  r;    s    ;;~e,R;SSr;   c                 $    | j                  d      S )Nz/logout)r2   r  s    r"   signoutrR    s    ::i  r;   c                 2    d| j                   j                  v S )Nr>  )r  r4  rQ  s    r"   _client_is_annotatorrT    s    &++++++r;   c                     t         j                  j                  t        j                  d      }t        |d      5 }t        j                  | j                         |       d d d        y # 1 sw Y   y xY w)Nztavern-output.jsonw)ospathjoinr   TEST_DATA_ROOTrB   r0   dump)r  fprE   s      r"   save_responser]    sQ    	h--/C	DB	b# &!		(--/1%& & &s   %A))A2c                     t        |      }|r"t        t        j                               }||z  }|j                  }t	        |      t	        |      t	        t        t        j                                     dS )N)os_independent_pathos_independent_path_parentos_independent_path_tmpdir)r   tempfile
gettempdirparentstr)_rX  add_tempdirr_  tempdirr`  s         r"   r_  r_    sl    t*x**,-%(;;!4!;!;"#67&)*D&E&)$x/B/B/D*E&F r;   c                     | j                         d   j                         D ]U  \  }}t        |       |j                         D ]2  \  }}t        |       t        |t              s"d|d   vr*J d|         W y )NpathsapitagszNeed docs for API method )r0   itemsr   
isinstancer  )r  rf  rX  methods       r"   verify_docsrp    s~    ==?7+113 Y4d 	YIAv&M&$'F6N2X6OPVx4XX2	YYr;   c                 l    t        | j                               dk(  sJ d| j                                 y )Nr   z!Response should be empty, but is )r   r0   )r  s    r"   
empty_listrr    s/    x}}1$[(I(--/IZ&[[$r;   c                     | j                         j                  d      }t        j                  j                  |      }|j                  j
                  }d|iS )NrM   rL   	file_path)r0   r2   r   r  filerX  )r  	export_idexportrt  s       r"   save_export_file_pathrx    sI    ##D)I^^9-F  I##r;   c                 |   | j                         d   }|d   d   }t        j                  j                  |d         }t        j
                  j                  t        j                  t        j                        }t	        j                  |       	 |j                  j
                  }d|iS # t        $ r dd icY S w xY w)Nr   converted_formatsrM   rL   convert_file_path)r0   r   r  r2   rW  rX  rY  r   
MEDIA_ROOTDELAYED_EXPORT_DIRlistdirru  
ValueError)r  rv  rw  convert	converteddir_pathrt  s          r"   save_convert_file_pathr    s    ]]_QF()!,G''++wt}+=Iww||H//1L1LMHJJx+NN''	#Y// +#T**+s   B+ +B;:B;c                     |sU| j                         j                  d      }t        j                  j                  |      }|j                  j
                  }t        j
                  j                  |      |k(  sJ y )NrM   rL   )r0   r2   r   r  ru  rX  rW  isfile)r  rM  rt  rv  rw  s        r"   file_exists_in_storager    s\    MMO''-	##y#1KK$$	77>>)$...r;   	flag_namer   parent_modulec                       fd}|S )zDecorator to mock a feature flag state for a test function.

    Args:
        flag_name: Name of the feature flag to mock
        value: True or False to set the flag state
        parent_module: Module path containing the flag_set function to patch
    c                 6     t                fd       }|S )Nc                      fd}t        j                   d|      5   | i |cd d d        S # 1 sw Y   y xY w)Nc                 0    | k(  rS t        | g|i |S rK   r   )feature_flag	flag_argsflag_kwargsr  r   s      r"   fake_flag_setzLmock_feature_flag.<locals>.decorator.<locals>.wrapper.<locals>.fake_flag_set  s%    9, LHyHKHHr;   z	.flag_setr   )r
   rA   )argsr    r  r  funcr  r   s      r"   wrapperz5mock_feature_flag.<locals>.decorator.<locals>.wrapper  sB    I
 }oY7}M -T,V,- - -s   4=r   )r  r  r  r  r   s   ` r"   	decoratorz$mock_feature_flag.<locals>.decorator  s     	t	- 
	- r;   rS   )r  r   r  r  s   ``` r"   mock_feature_flagr    s     r;   )zhttp://localhost:9090NF123rb   )NN)TNN)FN)FrK   )TN)zcore.feature_flags)V__doc__loggingos.pathrW  rC   rb  
contextlibr   copyr   	functoolsr   pathlibr   typesr	   unittestr
   pytestr3   r   ujsonr0   core.feature_flagsr   data_export.modelsr   r   django.appsr   django.confr   django.testr   	ml.modelsr   organizations.modelsr   projects.modelsr   tasks.serializersr   r6  r   businesses.modelsr   r   ImportError	getLoggerrP   re   r#   r   rG   rY   rI   rZ   r   r   r   r  r  fixturemark	django_dbr   r&  r(  r.  r1  rA  rF  r?  r;  rR  rT  r]  r_  rp  rr  rx  r  r  re  boolr  rS   r;   r"   <module>r     s     	  %    !      ' 6      - # ; "7 
		8	$ 4 4 	  (  v 
   ^ ^B P Pf  m 
!  
!_\V003T!,&Y\$+/ T # M  "!!K("s   E 	E&%E&