a
    DgW                     @   s  d dl Z d dl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mZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 G dd deZ8G dd deZ9G dd deZ:G dd deZ;G dd deZ<G dd dZ=G dd  d eZ>G d!d" d"eZ?ed#d#g d$g d$d%G d&d' d'eZ@d(d) ZAed#d#g d$g d$d%G d*d+ d+eZBed,d,dd-d.G d/d0 d0eZCG d1d2 d2eZDG d3d4 d4eZEG d5d6 d6eZFG d7d8 d8eZGG d9d: d:eZHG d;d< d<eZIG d=d> d>eZJG d?d@ d@eZKdS )A    N)BytesIO)Path)settings)ContentType)ImproperlyConfiguredSuspiciousOperation)SimpleUploadedFile)SimpleTestCaseTestCaseoverride_settings)slugify)_trans)gettext_lazy)InvokeViaAttributeShortcutaccepts_kwargcamelcase_to_underscorecautious_slugifyfind_available_slugget_content_languagesget_content_type_labelget_dummy_request&get_supported_content_language_variantmultigetattrsafe_snake_casestring_to_ascii)PageSite)RemovedInWagtail70Warning)hash_filelike)template_is_overridden)deep_updateflatten_choices)get_main_versionc                   @   s   e Zd Zdd ZdS )TestCamelCaseToUnderscorec                 C   s*   ddg}|D ]\}}|  t|| qd S )N)Z
HelloWorldhello_world)zlongValueWithVarious subStringsz#long_value_with_various sub_strings)assertEqualr   selfZ
test_casesoriginalZexpected_result r)   W/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/tests/test_utils.pytest_camelcase_to_underscore*   s
    z6TestCamelCaseToUnderscore.test_camelcase_to_underscoreN)__name__
__module____qualname__r+   r)   r)   r)   r*   r#   )   s   r#   c                   @   s   e Zd Zdd ZdS )TestStringToAsciic                 C   s*   g d}|D ]\}}|  t|| qd S )N)	)u   30 𝗄𝗆/𝗁z30 km/h)u   北亰ZBeiJing)u   ぁ あ ぃ い ぅ う ぇza a i i u u e)uA   Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Նz2A B G D E Z E Y T' Zh I L Kh Ts K H Dz Gh Ch M Y N)   Спорт!zSport!)   StraßenbahnZStrassenbahn)Hello worldr2   )u2   Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đz!A a A a A a C c C c C c C c D d D)   〔山脈〕z	[ShanMai])r%   r   r&   r)   r)   r*   test_string_to_ascii5   s    z&TestStringToAscii.test_string_to_asciiN)r,   r-   r.   r4   r)   r)   r)   r*   r/   4   s   r/   c                   @   s   e Zd Zdd Zdd ZdS )TestCautiousSlugifyc                 C   s:   g d}|D ](\}}|  t|| |  t|| qd S )N)
 r7   z???r7   )r2   hello-worldZHello_worldr$   )   Hellö wörldr9   )Hello   worldr9   )   Hello world   r9   )Hello, world!r9   zHello*world
helloworld)u   Hello☃worldr@   )r%   r   r   r&   r)   r)   r*   ,test_behaves_same_as_slugify_for_latin_charsJ   s    z@TestCautiousSlugify.test_behaves_same_as_slugify_for_latin_charsc                 C   s*   g d}|D ]\}}|  t|| qd S )N))r1   Zstraxdfenbahn)r0   Zu0421u043fu043eu0440u0442)r3   Z
u5c71u8108)r%   r   r&   r)   r)   r*   test_escapes_non_latin_chars\   s    z0TestCautiousSlugify.test_escapes_non_latin_charsN)r,   r-   r.   rA   rB   r)   r)   r)   r*   r5   I   s   r5   c                   @   s   e Zd Zdd Zdd ZdS )TestSafeSnakeCasec                 C   s*   g d}|D ]\}}|  t|| qd S )N)r6   r8   )zusing-HyphenZusing_hyphen)u   en–⁠dashZendash)u     em—dash Zemdash)u   horizontal―BARZhorizontalbar)r2   r$   r:   )r;   r$   )r<   r$   )r=   r$   )r>   r$   r?   )z'Screenshot_2020-05-29 Screenshot(1).pngZ$screenshot_2020_05_29_screenshot1pngr%   r   r&   r)   r)   r*   test_strings_with_latin_charsh   s    z/TestSafeSnakeCase.test_strings_with_latin_charsc                 C   s*   ddg}|D ]\}}|  t|| qd S )N)u   Straßenbahn StraßenbahnZstraxdfenbahn_straxdfenbahn)u   Сп орт!Zu0421u043f_u043eu0440u0442rD   r&   r)   r)   r*   "test_strings_with__non_latin_chars   s
    z4TestSafeSnakeCase.test_strings_with__non_latin_charsN)r,   r-   r.   rE   rF   r)   r)   r)   r*   rC   g   s   rC   c                   @   s   e Zd Zdd ZdS )TestAcceptsKwargc                 C   sP   d	dd}d
dd}dd }|  t|d | t|d | t|d d S )N*   c                 S   s   d S Nr)   )appleZoranger)   r)   r*   func_without_banana   s    z@TestAcceptsKwarg.test_accepts_kwarg.<locals>.func_without_bananac                 S   s   d S rI   r)   )rJ   bananar)   r)   r*   func_with_banana   s    z=TestAcceptsKwarg.test_accepts_kwarg.<locals>.func_with_bananac                 [   s   d S rI   r)   )rJ   kwargsr)   r)   r*   func_with_kwargs   s    z=TestAcceptsKwarg.test_accepts_kwarg.<locals>.func_with_kwargsrL   )rH   )rH   )assertFalser   
assertTrue)r'   rK   rM   rO   r)   r)   r*   test_accepts_kwarg   s    

z#TestAcceptsKwarg.test_accepts_kwargN)r,   r-   r.   rR   r)   r)   r)   r*   rG      s   rG   c                   @   s    e Zd ZdZdd Zdd ZdS )TestTargetClassz8
    Used in TestInvokeViaAttributeShortcut (below)
    c                 C   s
   g | _ d S rI   )target_method_called_withr'   r)   r)   r*   __init__   s    zTestTargetClass.__init__c                 C   s   | j | d S rI   )rT   append)r'   argr)   r)   r*   target_method   s    zTestTargetClass.target_methodN)r,   r-   r.   __doc__rV   rY   r)   r)   r)   r*   rS      s   rS   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestInvokeViaAttributeShortcutc                 C   s   t  | _t| jd| _d S )NrY   )rS   target_objectr   test_objectrU   r)   r)   r*   setUp   s    z$TestInvokeViaAttributeShortcut.setUpc                 C   s*   dD ] }t | j| | || jj qd S )N)ZfoobarZbaz)getattrr]   ZassertInr\   rT   )r'   valuer)   r)   r*   
test_basic   s    z)TestInvokeViaAttributeShortcut.test_basicc              
   C   s   zt | jd}W n6 tyH } ztd| j|f W Y d }~n
d }~0 0 zt || _W n6 ty } ztd| j|f W Y d }~n
d }~0 0 | jj| _|   d S )Nz2An error occurred when attempting to pickle %r: %sz4An error occurred when attempting to unpickle %r: %s)	pickledumpsr]   	ExceptionAssertionErrorloadsobjr\   rb   )r'   Zpickleder)   r)   r*   test_pickleability   s$    
z1TestInvokeViaAttributeShortcut.test_pickleabilityN)r,   r-   r.   r^   rb   rk   r)   r)   r)   r*   r[      s   r[   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestFindAvailableSlugc                 C   s<   t jjdd| _t jjdd| _| jjt dddd| _d S )N   )depth   zSecond homepagehome-1)titleslug)instance)r   objectsget	root_pageZ	home_pageZ	add_childsecond_home_pagerU   r)   r)   r*   r^      s
    
zTestFindAvailableSlug.setUpc                 C   sF   |  d t| jd}W d    n1 s,0    Y  | |d d S )Nrm   zunique-slugassertNumQueriesr   rv   r%   r'   rr   r)   r)   r*   test_find_available_slug   s    *z.TestFindAvailableSlug.test_find_available_slugc                 C   sF   |  d t| jd}W d    n1 s,0    Y  | |d d S )Nrm   homezhome-2rx   rz   r)   r)   r*   %test_find_available_slug_already_used   s    *z;TestFindAvailableSlug.test_find_available_slug_already_usedc                 C   sN   |  d$ t| jd| jjd}W d    n1 s40    Y  | |d d S )Nrm   r|   )Zignore_page_idrp   )ry   r   rv   rw   idr%   rz   r)   r)   r*   'test_find_available_slug_ignore_page_id   s
    $z=TestFindAvailableSlug.test_find_available_slug_ignore_page_idN)r,   r-   r.   r^   r{   r}   r   r)   r)   r)   r*   rl      s   rl   T)enEnglishdeGerman)de-atAustrian German)pt-brPortuguese (Brazil))USE_I18NWAGTAIL_I18N_ENABLEDZ	LANGUAGESWAGTAIL_CONTENT_LANGUAGESc                   @   sf   e Zd Zdd Zeddgddd Zeded	fd
edfgddd Zeg dddd ZdS )TestGetContentLanguagesc                 C   s   |  t ddddd d S )Nr   r   r   r   )r   r   r   r   r%   r   rU   r)   r)   r*   test_get_content_languages   s    z2TestGetContentLanguages.test_get_content_languagesr   r   r   c                 C   s   |  t ddd d S Nr   r   )r   r   r   rU   r)   r)   r*   )test_can_be_different_to_django_languages  s    zATestGetContentLanguages.test_can_be_different_to_django_languagesr   r   r   r   c                 C   s   |  t ddd d S r   r   rU   r)   r)   r*   test_can_be_a_translation_proxy  s    z7TestGetContentLanguages.test_can_be_a_translation_proxy)r   r   )zhChinesec                 C   sD   |  t}t  W d    n1 s&0    Y  | |jjd d S )N)zThe language zh is specified in WAGTAIL_CONTENT_LANGUAGES but not LANGUAGES. WAGTAIL_CONTENT_LANGUAGES must be a subset of LANGUAGES.)assertRaisesr   r   r%   	exceptionargs)r'   rj   r)   r)   r*   'test_must_be_subset_of_django_languages%  s    $z?TestGetContentLanguages.test_must_be_subset_of_django_languagesN)	r,   r-   r.   r   r   r   _r   r   r)   r)   r)   r*   r      s"   
	


	r   c                 C   s   dd }dd }dd }d S )Nc                 S   s   |  td d d S )NzUnknown content type)r%   r   rU   r)   r)   r*   	test_none9  s    z*TestGetContentTypeLabel.<locals>.test_nonec                 S   s    t jt}| t|d d S )Nr   )r   rt   Zget_for_modelr   r%   r   )r'   Zpage_content_typer)   r)   r*   test_valid_content_type<  s    z8TestGetContentTypeLabel.<locals>.test_valid_content_typec                 S   s$   t jjddd}| t|d d S )NZfake_appzdeleted model)Z	app_labelmodelzDeleted model)r   rt   creater%   r   )r'   Zstale_content_typer)   r)   r*   test_stale_content_type@  s    z8TestGetContentTypeLabel.<locals>.test_stale_content_typer)   )r
   r   r   r   r)   r)   r*   TestGetContentTypeLabel8  s    r   c                   @   s*   e Zd Zdd Zeddgddd ZdS )	&TestGetSupportedContentLanguageVariantc                 C   s\  t }| |dd | |dd | |dd | |dd | |dd | |dd | |dd | |dd | t |dd	d
 W d    n1 s0    Y  | t |dd	d
 W d    n1 s0    Y  | t |d W d    n1 s0    Y  | t |d W d    n1 sN0    Y  d S )Nr   en-gbr   r   de-chr   ptpt-ptT)strictxyzxy-zzr   r%   r   LookupErrorr'   gr)   r)   r*   +test_get_supported_content_language_variantY  s"    **(zRTestGetSupportedContentLanguageVariant.test_get_supported_content_language_variantr   r   r   c                 C   sV  t }| |dd | |dd | |dd | |dd | |dd | t |d W d    n1 s|0    Y  | t |d W d    n1 s0    Y  | t |d W d    n1 s0    Y  | t |d	 W d    n1 s0    Y  | t |d
 W d    n1 sH0    Y  d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r*   #test_uses_wagtail_content_languagesl  s     &&&(zJTestGetSupportedContentLanguageVariant.test_uses_wagtail_content_languagesN)r,   r-   r.   r   r   r   r)   r)   r)   r*   r   G  s   r   Fen-us)r   r   r   LANGUAGE_CODEc                   @   s6   e Zd Zdd Zdd Zdd Zeddd	d
 ZdS )3TestGetSupportedContentLanguageVariantWithI18nFalsec                 C   s   t j  d S rI   r   __dict__clearrU   r)   r)   r*   r^     s    z9TestGetSupportedContentLanguageVariantWithI18nFalse.setUpc                 C   s   t j  d S rI   r   rU   r)   r)   r*   tearDown  s    z<TestGetSupportedContentLanguageVariantWithI18nFalse.tearDownc                 C   s   |  tdd d S )Nr   r   r%   r   rU   r)   r)   r*   $test_lookup_language_with_i18n_false  s    zXTestGetSupportedContentLanguageVariantWithI18nFalse.test_lookup_language_with_i18n_falsezz)r   c                 C   s$   |  tdd |  tdd d S )Nr   zzz-gbr   rU   r)   r)   r*   #test_language_code_not_in_languages  s    zWTestGetSupportedContentLanguageVariantWithI18nFalse.test_language_code_not_in_languagesN)r,   r-   r.   r^   r   r   r   r   r)   r)   r)   r*   r     s
   r   c                   @   s   e Zd Zdd Zdd ZdS )TestMultigetattrc                 C   s   G dd d}| | _ d S )Nc                   @   s@   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zde_	dS )z%TestMultigetattr.setUp.<locals>.Thinggreenro      )ZarmsZlegsc                 S   s
   d| _ d S )NF)poke_was_calledrU   r)   r)   r*   rV     s    z.TestMultigetattr.setUp.<locals>.Thing.__init__c                 S   s   dS )Nraaarghr)   rU   r)   r)   r*   speak  s    z+TestMultigetattr.setUp.<locals>.Thing.speakc                 S   s   dS )NZgobbler)   )r'   Zfoodr)   r)   r*   feed  s    z*TestMultigetattr.setUp.<locals>.Thing.feedc                 S   s   d| _ tdd S )NTzdon't do that)r   rf   rU   r)   r)   r*   poke  s    z*TestMultigetattr.setUp.<locals>.Thing.pokeTN)
r,   r-   r.   colourZlimbsrV   r   r   r   Zalters_datar)   r)   r)   r*   Thing  s   
r   )thing)r'   r   r)   r)   r*   r^     s    zTestMultigetattr.setUpc                 C   s  |  t| jdd |  t| dd |  t| jdd |  t| jdd |  t| dd	 | t t| jd
 W d    n1 s0    Y  | t t| jd W d    n1 s0    Y  | t t| jd W d    n1 s0    Y  | t t| jd W d    n1 s00    Y  | t t| jd W d    n1 sh0    Y  | | jj d S )Nr   r   zthing.colourz
limbs.armsro   r   r   zthing.speak.0rnamezlimbs.antennaez	speak.999r   r   )	r%   r   r   r   AttributeError	TypeErrorr   rP   r   rU   r)   r)   r*   test_multigetattr  s     ***,,z"TestMultigetattr.test_multigetattrN)r,   r-   r.   r^   r   r)   r)   r)   r*   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestGetDummyRequestc                 C   s<   t j }d|_d|_|  t|d}| | d d S )Nother.example.comP   site	r   rt   firsthostnameportsaver   r%   get_hostr'   r   requestr)   r)   r*   test_standard_port  s    

z&TestGetDummyRequest.test_standard_portc                 C   s<   t j }d|_d|_|  t|d}| | d d S )Nr   i"  r   zother.example.com:8888r   r   r)   r)   r*   test_non_standard_port  s    

z*TestGetDummyRequest.test_non_standard_portc                 C   sJ   | j ddgd& t }| | d W d    n1 s<0    Y  d S )N*Z
testserver)ZALLOWED_HOSTSzexample.com)r   r   r%   r   )r'   r   r)   r)   r*   +test_server_name_for_wildcard_allowed_hosts  s    z?TestGetDummyRequest.test_server_name_for_wildcard_allowed_hostsN)r,   r-   r.   r   r   r   r)   r)   r)   r*   r     s   		r   c                   @   s   e Zd Zdd ZdS )TestDeepUpdatec                 C   sF   ddddd}t |dddd	d
 | |dddddd	d d S )NZpicardZcoffeeZhot)typetemperature)captainbeverageZteaz	earl grey)r   variantZ
enterprise)r   starship)r   r   r   )r   r   r   )r    r%   )r'   valr)   r)   r*   test_deep_update  s.    zTestDeepUpdate.test_deep_updateN)r,   r-   r.   r   r)   r)   r)   r*   r     s   r   c                   @   sT   e Zd Ze d Zdd Zdd Zdd Zdd	 Z	e
jeed
dddd ZdS )HashFileLikeTestCaseLICENSEc                 C   s   |  ttdd d S )N   test(a94a8fe5ccb19ba61c4c0873d391e987982fbbd3)r%   r   r   rU   r)   r)   r*   test_hashes_io  s    z#HashFileLikeTestCase.test_hashes_ioc                 C   sB   | j jdd }| t|d W d    n1 s40    Y  d S Nrb)modeZ(9e58400061ca660ef7b5c94338a5205627c77eda	test_fileopenr%   r   r'   fr)   r)   r*   test_hashes_file  s    z%HashFileLikeTestCase.test_hashes_filec                 C   sB   | j jdd }| t|d W d    n1 s40    Y  d S r   r   r   r)   r)   r*   test_hashes_file_bytes!  s    z+HashFileLikeTestCase.test_hashes_file_bytesc                 C   s   |  ttddd dS )z
        Check Django's file shims can be hashed as-is.
        `SimpleUploadedFile` inherits the base `UploadedFile`, but is easiest to test against
        zexample.txtr   r   N)r%   r   r   rU   r)   r)   r*    test_hashes_django_uploaded_file'  s    z5HashFileLikeTestCase.test_hashes_django_uploaded_fileZfile_digestz,`file_digest` doesn't support this interface)reasonc                 C   s$   G dd d}|  t| d d S )Nc                   @   s    e Zd ZdZdd Zdd ZdS )zBHashFileLikeTestCase.test_hashes_large_file.<locals>.FakeLargeFilezJ
            A class that pretends to be a huge file (~1.3GB)
            c                 S   s
   d| _ d S )Ni  Z
iterationsrU   r)   r)   r*   rV   ;  s    zKHashFileLikeTestCase.test_hashes_large_file.<locals>.FakeLargeFile.__init__c                 S   s    |  j d8  _ | j sdS d| S )Nrm          Ar   )r'   bytesr)   r)   r*   read>  s    zGHashFileLikeTestCase.test_hashes_large_file.<locals>.FakeLargeFile.readN)r,   r-   r.   rZ   rV   r   r)   r)   r)   r*   FakeLargeFile6  s   r   Z(bd36f0c5a02cd6e9e34202ea3ff8db07b533e025)r%   r   )r'   r   r)   r)   r*   test_hashes_large_file1  s
    z+HashFileLikeTestCase.test_hashes_large_fileN)r,   r-   r.   r   cwdr   r   r   r   r   unittestZskipIfhasattrhashlibr   r)   r)   r)   r*   r     s   
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestTemplateIsOverriddenc                 C   s   t   d S rI   )r   cache_clearrU   r)   r)   r*   r^   L  s    zTestTemplateIsOverridden.setUpc                 C   s   |  tddd d S )N%wagtailcore/shared/block_preview.html	templatesF)assertIsr   rU   r)   r)   r*   !test_template_is_overridden_falseO  s    z:TestTemplateIsOverridden.test_template_is_overridden_falsec              	   C   s   t  }tj|d}tj|dd ttj|dd}|d W d    n1 sZ0    Y  | ji tj	d |gdd	gtj	d
" | 
tddd W d    n1 s0    Y  W d    n1 s0    Y  d S )Nzwagtailcore/sharedT)exist_okzblock_preview.htmlwzCustom filer   tmp)ZDIRSNAME)	TEMPLATESr  r  )tempfileTemporaryDirectoryospathjoinmakedirsr   writer   r
  r  r   )r'   temp_dirr  r   r)   r)   r*    test_template_is_overridden_trueX  s$    
(z9TestTemplateIsOverridden.test_template_is_overridden_trueN)r,   r-   r.   r^   r  r  r)   r)   r)   r*   r   K  s   	r   c                   @   s   e Zd Zdd ZdS )TestVersionc              	   C   s\   g d}|D ]J\}}}| j ||d" | t||| W d    q1 sL0    Y  qd S )N))   ro   r   finalr   F6.2)r  ro   rm   r  r   Fr  )r  Tr  )r  Tz6.2.1)versioninclude_patch)ZsubTestr%   r"   )r'   Zcasesr  r  expectedr)   r)   r*   test_get_main_versiono  s    z!TestVersion.test_get_main_versionN)r,   r-   r.   r  r)   r)   r)   r*   r  n  s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestFlattenChoicesc                 C   s"   ddg}|  t|ddd d S )Nrm   1stro   2ndr   r"  12r%   r!   r'   choicesr)   r)   r*   test_tuple_choices|  s    z%TestFlattenChoices.test_tuple_choicesc                 C   s(   dddgfg}|  t|ddd d S )NGroupr  r!  r   r"  r#  r&  r'  r)   r)   r*   test_grouped_tuple_choices  s    z-TestFlattenChoices.test_grouped_tuple_choicesc              	   C   s8   dddddddd}|  t|dddddd	 d S )
NZJudoZKarate)judokarateZ	BadmintonZTennis)	badmintontennisUnknown)zMartial ArtsZRacketunknown)r,  r-  r.  r/  r1  r&  r'  r)   r)   r*   test_dictionary_choices  s    z*TestFlattenChoices.test_dictionary_choicesN)r,   r-   r.   r)  r+  r2  r)   r)   r)   r*   r  {  s   r  c                   @   s   e Zd Zdd ZdS )TestWidgetWithScriptc              	   C   s   d}t jjdtjdX}| t|, ddlm} G dd d|}W d    n1 sV0    Y  W d    n1 st0    Y  |j	|tdd	 d S )
NzQThe usage of `WidgetWithScript` hook is deprecated. Use external scripts instead.zwarnings.warn)wrapsr   )WidgetWithScriptc                   @   s   e Zd ZdS )z7TestWidgetWithScript.test_deprecation.<locals>.MyWidgetN)r,   r-   r.   r)   r)   r)   r*   MyWidget  s   r6  r   )category
stacklevel)
r   ZmockpatchwarningswarnZassertWarnsMessager   Zwagtail.utils.widgetsr5  Zassert_called_with)r'   messageZ	warn_mockr5  r6  r)   r)   r*   test_deprecation  s    Lz%TestWidgetWithScript.test_deprecationN)r,   r-   r.   r=  r)   r)   r)   r*   r3    s   r3  )Lr   r  rd   r  r   r:  ior   pathlibr   Zdjango.confr   Z"django.contrib.contenttypes.modelsr   Zdjango.core.exceptionsr   r   Zdjango.core.files.uploadedfiler   Zdjango.testr	   r
   r   Zdjango.utils.textr   Zdjango.utils.translationr   r   r   Zwagtail.coreutilsr   r   r   r   r   r   r   r   r   r   r   r   Zwagtail.modelsr   r   Zwagtail.utils.deprecationr   Zwagtail.utils.filer   Zwagtail.utils.templatesr   Zwagtail.utils.utilsr    r!   Zwagtail.utils.versionr"   r#   r/   r5   rC   rG   rS   r[   rl   r   r   r   r   r   r   r   r   r   r  r  r3  r)   r)   r)   r*   <module>   sx   8&#=//#8#